Commit 2927ec5b by Harald Anlauf

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.

(cherry picked from commit dd38c765a04d06c775134a135f68b18c3b7c9c78)
parent d7760318
......@@ -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)
{
......
......@@ -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
......@@ -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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment