The above PR had a partial fix by Tobias Burnus for a valid use of
STORAGE_SIZE, but did not properly handle an error situation.

The attached simple fix adds a list of allowed intrinsics for use
in specification inquiries in F2008+.  Testcase by Tobias.

Regtested on x86_64-pc-linux-gnu.

OK for trunk?

Note: I don't have commit rights, so please somebody else take care
of it after review.

Thanks,
Harald


2019-01-22  Harald Anlauf  <anl...@gmx.de>

        PR fortran/57553
        * expr.c (check_inquiry): Add list of inquiry functions allowed in
        constant expressions for F2008+.


2019-01-22  Harald Anlauf  <anl...@gmx.de>

        PR fortran/57553
        * gfortran.dg/pr57553.f90: New test.

Index: gcc/fortran/expr.c
===================================================================
--- gcc/fortran/expr.c  (revision 268162)
+++ gcc/fortran/expr.c  (working copy)
@@ -2515,7 +2515,8 @@
 static bool check_restricted (gfc_expr *);
 
 /* F95, 7.1.6.1, Initialization expressions, (7)
-   F2003, 7.1.7 Initialization expression, (8)  */
+   F2003, 7.1.7 Initialization expression, (8)
+   F2008, 7.1.12 Constant expression, (4)*/
 
 static match
 check_inquiry (gfc_expr *e, int not_restricted)
@@ -2539,6 +2540,15 @@
     "new_line", NULL
   };
 
+  /* std=f2008+ or -std=gnu */
+  static const char *const inquiry_func_gnu[] = {
+    "lbound", "shape", "size", "ubound",
+    "bit_size", "len", "kind",
+    "digits", "epsilon", "huge", "maxexponent", "minexponent",
+    "precision", "radix", "range", "tiny",
+    "new_line", "storage_size", NULL
+  };
+
   int i = 0;
   gfc_actual_arglist *ap;
 
@@ -2565,8 +2575,11 @@
     {
       name = e->symtree->n.sym->name;
 
-      functions = (gfc_option.warn_std & GFC_STD_F2003)
-               ? inquiry_func_f2003 : inquiry_func_f95;
+      functions = inquiry_func_gnu;
+      if (gfc_option.warn_std & GFC_STD_F2003)
+       functions = inquiry_func_f2003;
+      if (gfc_option.warn_std & GFC_STD_F95)
+       functions = inquiry_func_f95;
 
       for (i = 0; functions[i]; i++)
        if (strcmp (functions[i], name) == 0)
Index: gcc/testsuite/gfortran.dg/pr57553.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr57553.f90       (nonexistent)
+++ gcc/testsuite/gfortran.dg/pr57553.f90       (working copy)
@@ -0,0 +1,10 @@
+! { dg-do compile }
+!
+! PR fortran/57553 - bad error message for invalid use of STORAGE_SIZE
+!
+! Testcase contributed by Tobias Burnus
+
+subroutine S (A)
+  character(len=*), intent(in) :: A
+  integer, parameter :: ESize = (storage_size(a) + 7) / 8 ! { dg-error "does 
not reduce to a constant" }
+end

Reply via email to