Patchwork [Fortran] PR55763 - reject MOLD with NULL() in init-data expressions

login
register
mail settings
Submitter Tobias Burnus
Date Jan. 3, 2013, 11:23 p.m.
Message ID <50E612FA.5090703@net-b.de>
Download mbox | patch
Permalink /patch/209331/
State New
Headers show

Comments

Tobias Burnus - Jan. 3, 2013, 11:23 p.m.
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
Paul Richard Thomas - Jan. 4, 2013, 5:01 a.m.
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
Mikael Morin - Jan. 4, 2013, 11:28 a.m.
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

Patch

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