Message ID | 50E612FA.5090703@net-b.de |
---|---|
State | New |
Headers | show |
Dear Tobias, Yes, following your previous patch that I OK'd this is clearly OK for trunk. Thanks Paul On 4 January 2013 00:23, Tobias Burnus <burnus@net-b.de> wrote: > 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
Hello, Le 04/01/2013 00:23, Tobias Burnus a écrit : > 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 > 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) It seems the `name' argument to `gfc_match' is superfluous here. Thanks for the patch. Mikael
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