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.
- 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 ();
if (ref)
{
*ref = gfc_get_ref ();
+ 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)
{
if ((tmp->u.i == INQUIRY_RE || tmp->u.i == INQUIRY_IM)
&& primary->ts.type != BT_COMPLEX)
{
subroutine s (x)
complex, parameter :: z = 3
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
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 type t
type(t) :: b
print *, b% kind, b% 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" }