aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Eggleston <markeggleston@gcc.gnu.org>2020-04-01 09:52:41 +0100
committerMark Eggleston <markeggleston@gcc.gnu.org>2020-05-28 13:24:04 +0100
commit3ea6977d0f1813d982743a09660eec1760e981ec (patch)
tree6df9a90381813ee0a99c73b956b1375c18f1a4ca /gcc
parent59a3d73d50a1fd3c392e421ba4c07966ce045043 (diff)
downloadgcc-3ea6977d0f1813d982743a09660eec1760e981ec.zip
gcc-3ea6977d0f1813d982743a09660eec1760e981ec.tar.gz
gcc-3ea6977d0f1813d982743a09660eec1760e981ec.tar.bz2
Fortran : "type is( real(kind(1.)) )" spurious syntax error PR94397
Based on a patch in the comments of the PR. That patch fixed this problem but caused the test cases for PR93484 to fail. It has been changed to reduce initialisation expressions if the expression is not EXPR_VARIABLE and not EXPR_CONSTANT. 2020-05-28 Steven G. Kargl <kargl@gcc.gnu.org> Mark Eggleston <markeggleston@gcc.gnu.org> gcc/fortran/ PR fortran/94397 * match.c (gfc_match_type_spec): New variable ok initialised to true. Set ok with the return value of gfc_reduce_init_expr called only if the expression is not EXPR_CONSTANT and is not EXPR_VARIABLE. Add !ok to the check for type not being integer or the rank being greater than zero. 2020-05-28 Mark Eggleston <markeggleston@gcc.gnu.org> gcc/testsuite/ PR fortran/94397 * gfortran.dg/pr94397.F90: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/match.c5
-rw-r--r--gcc/testsuite/gfortran.dg/pr94397.F9026
2 files changed, 30 insertions, 1 deletions
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index 8ae34a9..82d2b50 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -2265,7 +2265,10 @@ found:
a scalar integer initialization-expr and valid kind parameter. */
if (c == ')')
{
- if (e->ts.type != BT_INTEGER || e->rank > 0)
+ bool ok = true;
+ if (e->expr_type != EXPR_CONSTANT && e->expr_type != EXPR_VARIABLE)
+ ok = gfc_reduce_init_expr (e);
+ if (!ok || e->ts.type != BT_INTEGER || e->rank > 0)
{
gfc_free_expr (e);
return MATCH_NO;
diff --git a/gcc/testsuite/gfortran.dg/pr94397.F90 b/gcc/testsuite/gfortran.dg/pr94397.F90
new file mode 100644
index 0000000..fda10c1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr94397.F90
@@ -0,0 +1,26 @@
+! { dg-do run }
+!
+
+module m
+ implicit none
+contains
+ function is_real8(a)
+ class(*) :: a
+ logical :: is_real8
+ is_real8 = .false.
+ select type(a)
+ type is(real(kind(1.0_8)))
+ is_real8 = .true.
+ end select
+ end function is_real8
+end module m
+
+program test
+ use m
+
+ if (is_real8(1.0_4)) stop 1
+ if (.not. is_real8(1.0_8)) stop 2
+#ifdef __GFC_REAL_16__
+ if (is_real8(1.0_16)) stop 3
+#endif
+end program