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.
This commit is contained in:
parent
bf5fbbbd8c
commit
dd38c765a0
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue