re PR fortran/78278 (ICE in gfc_wide_memset, at fortran/scanner.c:153)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 9 Jun 2018 15:39:29 +0000 (15:39 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 9 Jun 2018 15:39:29 +0000 (15:39 +0000)
2018-06-09  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/78278
* data.c (gfc_assign_data_value): Re-arrange code to allow for
an error for double initialization of CHARACTER entities.

2018-06-09  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/78278
* gfortran.dg/data_bounds_1.f90: Add -std=gnu option.
* gfortran.dg/data_char_1.f90: Ditto.
* gfortran.dg/pr78571.f90: Ditto.
* gfortran.dg/pr78278.f90: New test.

From-SVN: r261361

gcc/fortran/ChangeLog
gcc/fortran/data.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/data_bounds_1.f90
gcc/testsuite/gfortran.dg/data_char_1.f90
gcc/testsuite/gfortran.dg/pr78278.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr78571.f90

index 5f1ed3bc75d49d9a1bad85c44266f47fa39868b0..52fdc46a887e85d3176fd8bea8d4f3fb86b605a5 100644 (file)
@@ -1,3 +1,9 @@
+2018-06-09  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/78278
+       * data.c (gfc_assign_data_value): Re-arrange code to allow for
+       an error for double initialization of CHARACTER entities.
+
 2018-06-09  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/63514
index d837e15ee282d31a2fe12d1a7671bc3655c4809a..0d1f83040e937db76877c622b43d80a2e3e7bdbd 100644 (file)
@@ -483,6 +483,21 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index,
   mpz_clear (offset);
   gcc_assert (repeat == NULL);
 
+  /* Overwriting an existing initializer is non-standard but usually only
+     provokes a warning from other compilers.  */
+  if (init != NULL && init->where.lb && rvalue->where.lb)
+    {
+      /* Order in which the expressions arrive here depends on whether
+        they are from data statements or F95 style declarations.
+        Therefore, check which is the most recent.  */
+      expr = (LOCATION_LINE (init->where.lb->location)
+             > LOCATION_LINE (rvalue->where.lb->location))
+          ? init : rvalue;
+      if (gfc_notify_std (GFC_STD_GNU, "re-initialization of %qs at %L",
+                         symbol->name, &expr->where) == false)
+       return false;
+    }
+
   if (ref || last_ts->type == BT_CHARACTER)
     {
       /* An initializer has to be constant.  */
@@ -503,22 +518,6 @@ gfc_assign_data_value (gfc_expr *lvalue, gfc_expr *rvalue, mpz_t index,
          return false;
        }
 
-      /* Overwriting an existing initializer is non-standard but usually only
-        provokes a warning from other compilers.  */
-      if (init != NULL)
-       {
-         /* Order in which the expressions arrive here depends on whether
-            they are from data statements or F95 style declarations.
-            Therefore, check which is the most recent.  */
-         expr = (LOCATION_LINE (init->where.lb->location)
-                 > LOCATION_LINE (rvalue->where.lb->location))
-              ? init : rvalue;
-         if (gfc_notify_std (GFC_STD_GNU,
-                             "re-initialization of %qs at %L",
-                             symbol->name, &expr->where) == false)
-           return false;
-       }
-
       expr = gfc_copy_expr (rvalue);
       if (!gfc_compare_types (&lvalue->ts, &expr->ts))
        gfc_convert_type (expr, &lvalue->ts, 0);
index 36135a88521afd56bf65854a91c192dbc39679ed..8e90b1f472315b38c051c8335643ff76a41f021e 100644 (file)
@@ -1,3 +1,11 @@
+2018-06-09  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/78278
+       * gfortran.dg/data_bounds_1.f90: Add -std=gnu option.
+       * gfortran.dg/data_char_1.f90: Ditto.
+       * gfortran.dg/pr78571.f90: Ditto.
+       * gfortran.dg/pr78278.f90: New test.
+
 2018-06-09  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/63514
index b20aa415b8a2bce5f981f74a16f16f8aceb3aa09..24cdc7c98156d1beed73b425bf55fd4f6b510106 100644 (file)
@@ -1,4 +1,5 @@
 ! { dg-do compile }
+! { dg-options "-std=gnu" }
 ! Checks the fix for PR32315, in which the bounds checks below were not being done.
 !
 ! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
index 95ca51d891c865a25f9f968498be5f075ebb40c3..0611e6375912a01197700819608ddb08c3959826 100644 (file)
@@ -1,4 +1,5 @@
 ! { dg-do run }
+! { dg-options "-std=gnu" }
 ! Test character variables in data statements
 ! Also substrings of character variables.
 ! PR14976 PR16228 
diff --git a/gcc/testsuite/gfortran.dg/pr78278.f90 b/gcc/testsuite/gfortran.dg/pr78278.f90
new file mode 100644 (file)
index 0000000..fd50e3e
--- /dev/null
@@ -0,0 +1,14 @@
+! { dg-do compile }
+! { dg-options "-std=f95" }
+! PR fortran/78278
+program p
+   character, pointer :: x => null()
+   data x /null()/         ! { dg-error "GNU Extension: re-initialization" }
+   print *, associated(x)
+end
+
+subroutine foo
+   real :: x = 42
+   data x /0/              ! { dg-error "GNU Extension: re-initialization" }
+   print *, x
+end subroutine foo
index 16b07abd273f5beafff78d49b5c794d444a1a4fe..8e377567eec822c592e53bf6f1e90462d8a77ec7 100644 (file)
@@ -1,4 +1,5 @@
 ! { dg-do compile }
+! { dg-options "-std=gnu" }
 ! PR fortran/78571
 program p
    type t