diff options
author | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-09-07 14:41:25 +0000 |
---|---|---|
committer | pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-09-07 14:41:25 +0000 |
commit | 6bf460c3366b023e6d510e1d4e8491b5b7ed884d (patch) | |
tree | 384723a9bb739a10b7285a0ccae069e985c5b155 | |
parent | b2014f537f3de9d91bc7ad33f69ce5df4125e3ae (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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/fortran/primary.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr91589.f90 | 15 |
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 + |