re PR fortran/57553 ([F08] Valid use of STORAGE_SIZE rejected, bad error message...
authorHarald Anlauf <anlauf@gmx.de>
Sat, 26 Jan 2019 20:45:55 +0000 (20:45 +0000)
committerHarald Anlauf <anlauf@gcc.gnu.org>
Sat, 26 Jan 2019 20:45:55 +0000 (20:45 +0000)
2019-01-26  Harald Anlauf  <anlauf@gmx.de>

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

2019-01-26  Harald Anlauf  <anlauf@gmx.de>

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

From-SVN: r268303

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

index 5ee82a6..c1d2526 100644 (file)
@@ -1,3 +1,9 @@
+2019-01-26  Harald Anlauf  <anlauf@gmx.de>
+
+       PR fortran/57553
+       * expr.c (check_inquiry): Add list of inquiry functions allowed in
+       constant expressions for F2008+.
+
 2019-01-25  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/85780
index 965214b..a9e7f36 100644 (file)
@@ -2515,7 +2515,8 @@ check_init_expr_arguments (gfc_expr *e)
 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 @@ check_inquiry (gfc_expr *e, int not_restricted)
     "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 @@ check_inquiry (gfc_expr *e, int not_restricted)
     {
       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 4d55dee..d6f6e0f 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-26  Harald Anlauf  <anlauf@gmx.de>
+
+       PR fortran/57553
+       * gfortran.dg/pr57553.f90: New test.
+
 2019-01-26  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/array34.adb: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr57553.f90 b/gcc/testsuite/gfortran.dg/pr57553.f90
new file mode 100644 (file)
index 0000000..afd0cc1
--- /dev/null
@@ -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