re PR fortran/77391 (gfortran allows CHARACTER(LEN=:),PARAMETER:: STRING='constant...
authorSteven G. Kargl <kargl@gcc.gnu.org>
Sun, 4 Sep 2016 20:00:48 +0000 (20:00 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Sun, 4 Sep 2016 20:00:48 +0000 (20:00 +0000)
2016-09-04  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/77391
* resolve.c (deferred_requirements): New function to check F2008:C402.
(resolve_fl_variable,resolve_fl_parameter): Use it.

2016-09-04  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/77391
* gfortran.dg/pr77391.f90: New test.

From-SVN: r239982

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr77391.f90 [new file with mode: 0644]

index 0b452f4664e66f0d43cc2bf8d01dca5287218788..8e525dc5fd60883402e51312f7d31456e7a6302c 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-04  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/77391
+       * resolve.c (deferred_requirements): New function to check F2008:C402.
+       (resolve_fl_variable,resolve_fl_parameter): Use it.
 2016-09-04  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/77460
index 39c1330c45571aa65499a52327ab753cb259f460..f8ba00bab82ccabccae6e183400d4c089e6c9b4a 100644 (file)
@@ -11488,6 +11488,27 @@ resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag)
 }
 
 
+/* F2008, C402 (R401):  A colon shall not be used as a type-param-value
+   except in the declaration of an entity or component that has the POINTER
+   or ALLOCATABLE attribute.  */
+
+static bool
+deferred_requirements (gfc_symbol *sym)
+{
+  if (sym->ts.deferred
+      && !(sym->attr.pointer
+          || sym->attr.allocatable
+          || sym->attr.omp_udr_artificial_var))
+    {
+      gfc_error ("Entity %qs at %L has a deferred type parameter and "
+                "requires either the POINTER or ALLOCATABLE attribute",
+                sym->name, &sym->declared_at);
+      return false;
+    }
+  return true;
+}
+
+
 /* Resolve symbols with flavor variable.  */
 
 static bool
@@ -11527,17 +11548,8 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
     }
 
   /* Constraints on deferred type parameter.  */
-  if (sym->ts.deferred
-      && !(sym->attr.pointer
-          || sym->attr.allocatable
-          || sym->attr.omp_udr_artificial_var))
-    {
-      gfc_error ("Entity %qs at %L has a deferred type parameter and "
-                "requires either the pointer or allocatable attribute",
-                    sym->name, &sym->declared_at);
-      specification_expr = saved_specification_expr;
-      return false;
-    }
+  if (!deferred_requirements (sym))
+    return false;
 
   if (sym->ts.type == BT_CHARACTER)
     {
@@ -13682,6 +13694,10 @@ resolve_fl_parameter (gfc_symbol *sym)
       return false;
     }
 
+  /* Constraints on deferred type parameter.  */
+  if (!deferred_requirements (sym))
+    return false;
+
   /* Make sure a parameter that has been implicitly typed still
      matches the implicit type, since PARAMETER statements can precede
      IMPLICIT statements.  */
index 6f5c7878bd6f6ddf5e667cd95bc1e3e9b9c2d18c..79ef275a01dfb8cfcc226c86b0b9c491cc8e6392 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-04  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/77391
+       * gfortran.dg/pr77391.f90: New test.
+
 2016-09-04  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/77460
diff --git a/gcc/testsuite/gfortran.dg/pr77391.f90 b/gcc/testsuite/gfortran.dg/pr77391.f90
new file mode 100644 (file)
index 0000000..b3a455a
--- /dev/null
@@ -0,0 +1,7 @@
+! { dg-do compile }
+program picky
+character(len=:), parameter :: a="whoops" ! { dg-error "POINTER or ALLOCATABLE" }
+character(len=:) :: b="whoops" ! { dg-error "POINTER or ALLOCATABLE" }
+character(len=:) :: good
+pointer good
+end program picky