aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2020-05-30 20:59:41 +0200
committerGiuliano Belinassi <giuliano.belinassi@usp.br>2020-08-17 13:09:25 -0300
commitb65ae63e97ca8a4487d22c7321e8a2e8580228fd (patch)
treeddd2ac41cae61cad34cb79264acfb2969e4798d0 /gcc
parentd0012ce634dcc89cf045f8324fc3df77f53fa719 (diff)
downloadgcc-b65ae63e97ca8a4487d22c7321e8a2e8580228fd.zip
gcc-b65ae63e97ca8a4487d22c7321e8a2e8580228fd.tar.gz
gcc-b65ae63e97ca8a4487d22c7321e8a2e8580228fd.tar.bz2
PR fortran/95373 - ICE in build_reference_type, at tree.c:7942
The use of KIND, LEN, RE, and IM inquiry references for applicable intrinsic types is valid only for suffienctly new Fortran standards. Add appropriate checks in the appropriate place. 2020-05-30 Harald Anlauf <anlauf@gmx.de> gcc/fortran/ PR fortran/95373 * primary.c (is_inquiry_ref): Move validity check of inquiry references against selected Fortran standard from here... (gfc_match_varspec) ...to here. gcc/testsuite/ PR fortran/95373 * gfortran.dg/pr95373_1.f90: Adjust error messages. * gfortran.dg/pr95373_2.f90: Adjust error message.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/primary.c43
-rw-r--r--gcc/testsuite/gfortran.dg/pr95373_1.f904
-rw-r--r--gcc/testsuite/gfortran.dg/pr95373_2.f902
3 files changed, 24 insertions, 25 deletions
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 67105cc..7c221c8 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -1998,28 +1998,6 @@ is_inquiry_ref (const char *name, gfc_ref **ref)
else
return false;
- switch (type)
- {
- case INQUIRY_RE:
- case INQUIRY_IM:
- if (!gfc_notify_std (GFC_STD_F2008, "RE or IM part_ref at %C"))
- return false;
- break;
-
- case INQUIRY_KIND:
- if (!gfc_notify_std (GFC_STD_F2003, "KIND part_ref at %C"))
- return false;
- break;
-
- case INQUIRY_LEN:
- if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
- return false;
- break;
-
- default:
- gcc_unreachable ();
- }
-
if (ref)
{
*ref = gfc_get_ref ();
@@ -2267,6 +2245,27 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
{
if (tmp)
{
+ switch (tmp->u.i)
+ {
+ case INQUIRY_RE:
+ case INQUIRY_IM:
+ if (!gfc_notify_std (GFC_STD_F2008,
+ "RE or IM part_ref at %C"))
+ return MATCH_ERROR;
+ break;
+
+ case INQUIRY_KIND:
+ if (!gfc_notify_std (GFC_STD_F2003,
+ "KIND part_ref at %C"))
+ return MATCH_ERROR;
+ break;
+
+ case INQUIRY_LEN:
+ if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
+ return MATCH_ERROR;
+ break;
+ }
+
if ((tmp->u.i == INQUIRY_RE || tmp->u.i == INQUIRY_IM)
&& primary->ts.type != BT_COMPLEX)
{
diff --git a/gcc/testsuite/gfortran.dg/pr95373_1.f90 b/gcc/testsuite/gfortran.dg/pr95373_1.f90
index f39b6a7..59a9e7a 100644
--- a/gcc/testsuite/gfortran.dg/pr95373_1.f90
+++ b/gcc/testsuite/gfortran.dg/pr95373_1.f90
@@ -4,12 +4,12 @@
subroutine s (x)
complex, parameter :: z = 3
- real(z% kind) :: x ! { dg-error "nonderived-type variable" }
+ real(z% kind) :: x ! { dg-error "Fortran 2003: KIND part_ref" }
type t
real :: kind
logical :: re
end type t
type(t) :: b
print *, b% kind, b% re
- print *, z% re ! { dg-error "nonderived-type variable" }
+ print *, z% re ! { dg-error "Fortran 2008: RE or IM part_ref" }
end
diff --git a/gcc/testsuite/gfortran.dg/pr95373_2.f90 b/gcc/testsuite/gfortran.dg/pr95373_2.f90
index 2a654b4..b0f3da0 100644
--- a/gcc/testsuite/gfortran.dg/pr95373_2.f90
+++ b/gcc/testsuite/gfortran.dg/pr95373_2.f90
@@ -11,5 +11,5 @@ subroutine s (x)
end type t
type(t) :: b
print *, b% kind, b% re
- print *, z% re ! { dg-error "nonderived-type variable" }
+ print *, z% re ! { dg-error "Fortran 2008: RE or IM part_ref" }
end