aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2019-09-07 14:41:25 +0000
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2019-09-07 14:41:25 +0000
commit6bf460c3366b023e6d510e1d4e8491b5b7ed884d (patch)
tree384723a9bb739a10b7285a0ccae069e985c5b155
parentb2014f537f3de9d91bc7ad33f69ce5df4125e3ae (diff)
2019-09-07 Paul Thomas <pault@gcc.gnu.org>
PR fortran/91589 * primary.c (gfc_match_varspec): Return MATCH_NO on an apparent component ref, when the primary type is intrinsic. 2019-09-07 Paul Thomas <pault@gcc.gnu.org> PR fortran/91589 * gfortran.dg/pr91589.f90 : New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-9-branch@275487 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/primary.c13
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gfortran.dg/pr91589.f9015
4 files changed, 41 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 5450a3279b8..d718706e6e4 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2019-09-07 Paul Thomas <pault@gcc.gnu.org>
+
+ Backport from mainline
+ PR fortran/91589
+ * primary.c (gfc_match_varspec): Return MATCH_NO on an apparent
+ component ref, when the primary type is intrinsic.
+
2019-09-05 Harald Anlauf <anlauf@gmx.de>
Backport from mainline
@@ -101,7 +108,7 @@
PR fortran/90563
* frontend-passes.c (insert_index): Suppress errors while
simplifying the resulting expression.
-
+
2019-08-13 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/88072
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 4af1db5f4bd..a69f71acf7e 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -1990,6 +1990,7 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
match m;
bool unknown;
bool inquiry;
+ bool intrinsic;
locus old_loc;
char sep;
@@ -2194,11 +2195,15 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
if (m != MATCH_YES)
return MATCH_ERROR;
+ intrinsic = false;
if (primary->ts.type != BT_CLASS && primary->ts.type != BT_DERIVED)
{
inquiry = is_inquiry_ref (name, &tmp);
if (inquiry)
sym = NULL;
+
+ if (sep == '%' && primary->ts.type != BT_UNKNOWN)
+ intrinsic = true;
}
else
inquiry = false;
@@ -2258,12 +2263,16 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
break;
}
- if (!inquiry)
+ if (!inquiry && !intrinsic)
component = gfc_find_component (sym, name, false, false, &tmp);
else
component = NULL;
- if (component == NULL && !inquiry)
+ /* In some cases, returning MATCH_NO gives a better error message. Most
+ cases return "Unclassifiable statement at..." */
+ if (intrinsic && !inquiry)
+ return MATCH_NO;
+ else if (component == NULL && !inquiry)
return MATCH_ERROR;
/* Extend the reference chain determined by gfc_find_component or
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5e3c22d0630..ce8dd86c449 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2019-09-07 Paul Thomas <pault@gcc.gnu.org>
+
+ Backport from mainline
+ PR fortran/91589
+ * gfortran.dg/pr91589.f90 : New test.
+
2019-09-05 Harald Anlauf <anlauf@gmx.de>
Backport from mainline
@@ -653,7 +659,7 @@
Backport from mainline.
2019-05-15 Iain Sandoe <iain@sandoe.co.uk>
- * lib/target-supports.exp
+ * lib/target-supports.exp
(check_effective_target_powerpc_p8vector_ok): No support for Darwin.
(check_effective_target_powerpc_p9vector_ok): Likewise.
(check_effective_target_powerpc_float128_sw_ok): Likewise.
diff --git a/gcc/testsuite/gfortran.dg/pr91589.f90 b/gcc/testsuite/gfortran.dg/pr91589.f90
new file mode 100644
index 00000000000..d02cb64bfc2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr91589.f90
@@ -0,0 +1,15 @@
+! { dg-do compile }
+!
+! Check the fix for PR91589, in which the invalid expression caused an ICE.
+! Other statements using this invalid expression cause "Unclassifiable statement at..."
+!
+! Contributed by Gerhardt Steinmetz <gscfq@t-online.de>
+!
+program p
+ type t
+ integer :: a
+ end type
+ type(t) :: x = t(1)
+ call sub (x%a%a) ! { dg-error "Syntax error in argument list" }
+end
+