aboutsummaryrefslogtreecommitdiffstats
path: root/meson/test cases/fortran/19 fortran_std
diff options
context:
space:
mode:
Diffstat (limited to 'meson/test cases/fortran/19 fortran_std')
-rw-r--r--meson/test cases/fortran/19 fortran_std/legacy.f8
-rw-r--r--meson/test cases/fortran/19 fortran_std/meson.build27
-rw-r--r--meson/test cases/fortran/19 fortran_std/std2003.f9037
-rw-r--r--meson/test cases/fortran/19 fortran_std/std2008.f9033
-rw-r--r--meson/test cases/fortran/19 fortran_std/std2018.f9035
-rw-r--r--meson/test cases/fortran/19 fortran_std/std95.f9014
6 files changed, 154 insertions, 0 deletions
diff --git a/meson/test cases/fortran/19 fortran_std/legacy.f b/meson/test cases/fortran/19 fortran_std/legacy.f
new file mode 100644
index 000000000..014bcc1d0
--- /dev/null
+++ b/meson/test cases/fortran/19 fortran_std/legacy.f
@@ -0,0 +1,8 @@
+ program main
+ ! non-integer loop indices are deleted in Fortran 95 standard
+ real a
+
+ do 10 a=0,0.5,0.1
+10 continue
+
+ end program
diff --git a/meson/test cases/fortran/19 fortran_std/meson.build b/meson/test cases/fortran/19 fortran_std/meson.build
new file mode 100644
index 000000000..f46f8ffe4
--- /dev/null
+++ b/meson/test cases/fortran/19 fortran_std/meson.build
@@ -0,0 +1,27 @@
+project('FortranStd', 'fortran',
+ default_options: ['warning_level=0'])
+# As with C and C++, each Fortran compiler + version has a subset of supported Fortran standards
+# Additionally, a necessary option for non-standard Fortran projects is the "legacy"
+# option, which allows non-standard syntax and behavior quirks.
+# Thus "legacy" is a necessity for some old but important Fortran projects.
+# By default, popular Fortran compilers disallow these quirks without "legacy" option.
+
+fc = meson.get_compiler('fortran')
+
+executable('stdnone', 'std95.f90')
+
+executable('std_legacy', 'legacy.f', override_options : ['fortran_std=legacy'])
+
+executable('std_95', 'std95.f90', override_options : ['fortran_std=f95'])
+
+executable('std_f2003', 'std2003.f90', override_options : ['fortran_std=f2003'])
+
+executable('std_f2008', 'std2008.f90', override_options : ['fortran_std=f2008'])
+
+if fc.get_id() == 'gcc'
+ if fc.version().version_compare('>=8.0')
+ executable('std_f2018', 'std2018.f90', override_options : ['fortran_std=f2018'])
+ endif
+else
+ executable('std_f2018', 'std2018.f90', override_options : ['fortran_std=f2018'])
+endif \ No newline at end of file
diff --git a/meson/test cases/fortran/19 fortran_std/std2003.f90 b/meson/test cases/fortran/19 fortran_std/std2003.f90
new file mode 100644
index 000000000..0382192d8
--- /dev/null
+++ b/meson/test cases/fortran/19 fortran_std/std2003.f90
@@ -0,0 +1,37 @@
+program main
+use, intrinsic :: iso_fortran_env, only : error_unit
+implicit none
+
+! http://fortranwiki.org/fortran/show/Real+precision
+integer, parameter :: sp = selected_real_kind(6, 37)
+integer, parameter :: dp = selected_real_kind(15, 307)
+
+real(sp) :: a32
+real(dp) :: a64
+
+real(sp), parameter :: pi32 = 4*atan(1._sp)
+real(dp), parameter :: pi64 = 4*atan(1._dp)
+
+if (pi32 == pi64) stop 1
+
+call timestwo(a32)
+call timestwo(a64)
+
+contains
+
+elemental subroutine timestwo(a)
+
+class(*), intent(inout) :: a
+
+select type (a)
+ type is (real(sp))
+ a = 2*a
+ type is (real(dp))
+ a = 2*a
+ type is (integer)
+ a = 2*a
+end select
+
+end subroutine timestwo
+
+end program
diff --git a/meson/test cases/fortran/19 fortran_std/std2008.f90 b/meson/test cases/fortran/19 fortran_std/std2008.f90
new file mode 100644
index 000000000..750173e1b
--- /dev/null
+++ b/meson/test cases/fortran/19 fortran_std/std2008.f90
@@ -0,0 +1,33 @@
+program main
+use, intrinsic :: iso_fortran_env, only : error_unit, sp=>real32, dp=>real64
+implicit none
+
+real(sp) :: a32
+real(dp) :: a64
+
+real(sp), parameter :: pi32 = 4*atan(1._sp)
+real(dp), parameter :: pi64 = 4*atan(1._dp)
+
+if (pi32 == pi64) error stop 'real32 values generally do not exactly equal real64 values'
+
+call timestwo(a32)
+call timestwo(a64)
+
+contains
+
+elemental subroutine timestwo(a)
+
+class(*), intent(inout) :: a
+
+select type (a)
+ type is (real(sp))
+ a = 2*a
+ type is (real(dp))
+ a = 2*a
+ type is (integer)
+ a = 2*a
+end select
+
+end subroutine timestwo
+
+end program
diff --git a/meson/test cases/fortran/19 fortran_std/std2018.f90 b/meson/test cases/fortran/19 fortran_std/std2018.f90
new file mode 100644
index 000000000..34fad50bf
--- /dev/null
+++ b/meson/test cases/fortran/19 fortran_std/std2018.f90
@@ -0,0 +1,35 @@
+program main
+use, intrinsic :: iso_fortran_env, only : error_unit, sp=>real32, dp=>real64
+implicit none
+
+real(sp) :: a32
+real(dp) :: a64
+
+real(sp), parameter :: pi32 = 4*atan(1._sp)
+real(dp), parameter :: pi64 = 4*atan(1._dp)
+
+if (pi32 == pi64) error stop 'real32 values generally do not exactly equal real64 values'
+
+call timestwo(a32)
+call timestwo(a64)
+
+contains
+
+elemental subroutine timestwo(a)
+
+class(*), intent(inout) :: a
+
+select type (a)
+ type is (real(sp))
+ a = 2*a
+ type is (real(dp))
+ a = 2*a
+ type is (integer)
+ a = 2*a
+ class default
+ error stop 'requires real32, real64 or integer'
+end select
+
+end subroutine timestwo
+
+end program
diff --git a/meson/test cases/fortran/19 fortran_std/std95.f90 b/meson/test cases/fortran/19 fortran_std/std95.f90
new file mode 100644
index 000000000..2837da86a
--- /dev/null
+++ b/meson/test cases/fortran/19 fortran_std/std95.f90
@@ -0,0 +1,14 @@
+program main
+implicit none
+
+integer :: i, j
+integer, parameter :: N=3
+real :: A(N,N)
+
+A = 0
+
+forall (i=1:N, j=1:N)
+ A(i,j) = 1
+end forall
+
+end program