This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[Patch, Fortran] PR55763 - reject MOLD with NULL() in init-data expressions
- From: Tobias Burnus <burnus at net-b dot de>
- To: gcc patches <gcc-patches at gcc dot gnu dot org>, gfortran <fortran at gcc dot gnu dot org>
- Date: Fri, 04 Jan 2013 00:23:38 +0100
- Subject: [Patch, Fortran] PR55763 - reject MOLD with NULL() in init-data expressions
NULL with MOLD should be rejected as (default) initialization
expression. From F2008:
R506 null-init is function-reference
C512 (R506) The function-reference shall be a reference to the intrinsic
function NULL with no arguments.
"null-init" occurs twice, as "R505 initialization" in "R505
initialization" and in "R442 component-initialization" (default
initialization).
Before,
integer, pointer :: p => null(x)
gave an type error (LHS: integer, RHS: unknown). While
class(*), pointer :: p => null(x)
was accepted without error diagnostic.
Build and regtested on x86-64-gnu-linux.
OK for the trunk?
Tobias
2012-01-04 Tobias Burnus <burnus@net-b.de>
PR fortran/55763
* decl.c (gfc_match_null): Parse and reject MOLD.
2012-01-04 Tobias Burnus <burnus@net-b.de>
PR fortran/55763
* gfortran.dg/null_7.f90: New.
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 5ed8388..7d49578 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -1671,11 +1671,31 @@ match
gfc_match_null (gfc_expr **result)
{
gfc_symbol *sym;
- match m;
+ match m, m2 = MATCH_NO;
- m = gfc_match (" null ( )");
- if (m != MATCH_YES)
- return m;
+ if ((m = gfc_match (" null ( )")) == MATCH_ERROR)
+ return MATCH_ERROR;
+
+ if (m == MATCH_NO)
+ {
+ locus old_loc;
+ char name[GFC_MAX_SYMBOL_LEN + 1];
+
+ if ((m2 = gfc_match (" null (", name)) != MATCH_YES)
+ return m2;
+
+ old_loc = gfc_current_locus;
+ if ((m2 = gfc_match (" %n ) ", name)) == MATCH_ERROR)
+ return MATCH_ERROR;
+ if (m2 != MATCH_YES
+ && ((m2 = gfc_match (" mold = %n )", name)) == MATCH_ERROR))
+ return MATCH_ERROR;
+ if (m2 == MATCH_NO)
+ {
+ gfc_current_locus = old_loc;
+ return MATCH_NO;
+ }
+ }
/* The NULL symbol now has to be/become an intrinsic function. */
if (gfc_get_symbol ("null", NULL, &sym))
@@ -1694,6 +1714,13 @@ gfc_match_null (gfc_expr **result)
*result = gfc_get_null_expr (&gfc_current_locus);
+ /* Invalid per F2008, C512. */
+ if (m2 == MATCH_YES)
+ {
+ gfc_error ("NULL() initialization at %C may not have MOLD");
+ return MATCH_ERROR;
+ }
+
return MATCH_YES;
}
diff --git a/gcc/testsuite/gfortran.dg/null_7.f90 b/gcc/testsuite/gfortran.dg/null_7.f90
new file mode 100644
index 0000000..d6d77d2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/null_7.f90
@@ -0,0 +1,20 @@
+! { dg-do compile }
+!
+! PR fortran/55763
+!
+
+implicit none
+integer, pointer :: x
+class(*), pointer :: y
+integer, pointer :: p1 => null(x) ! { dg-error "NULL.. initialization at .1. may not have MOLD" }
+integer, pointer :: p2 => null(mold=x) ! { dg-error "NULL.. initialization at .1. may not have MOLD" }
+class(*), pointer :: p3 =>null(x) ! { dg-error "NULL.. initialization at .1. may not have MOLD" }
+type t
+ real, pointer :: a1 => null(x) ! { dg-error "NULL.. initialization at .1. may not have MOLD" }
+ real, pointer :: a2 => null ( mold = x) ! { dg-error "NULL.. initialization at .1. may not have MOLD" }
+ class(*), pointer :: a3 => null(mold = x ) ! { dg-error "NULL.. initialization at .1. may not have MOLD" }
+end type t
+
+x => null(x) ! OK
+y => null(y) ! OK
+end