re PR fortran/92113 (r276673 causes segfault in gfortran.dg/pr51434.f90)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 3 Nov 2019 22:33:53 +0000 (22:33 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sun, 3 Nov 2019 22:33:53 +0000 (22:33 +0000)
2019-11-03  Thomas Koenig  <tkoenig@gcc.gnu.org>

    PR fortran/92133
    * trans-decl.c (gfc_get_symbol_decl): If __def_init actually
    contains a value, put it into  the read-only section.

From-SVN: r277760

gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c

index 74211ced3fdf1815be7a10d5bc24326b1f607610..620d8af68b9da8d80779c97603133d7c97abd153 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-03  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/92133
+       * trans-decl.c (gfc_get_symbol_decl): If __def_init actually
+       contains a value, put it into  the read-only section.
+
 2019-11-01  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        * decl.c (match_byte_typespec): New function.  Match BYTE type-spec.
index 630682cbac7210e25b5254a3792f17712baec053..ffa61111316c29d423e40e9f48c2e7e0b3d698a5 100644 (file)
@@ -1904,13 +1904,20 @@ gfc_get_symbol_decl (gfc_symbol * sym)
   if (sym->attr.associate_var)
     GFC_DECL_ASSOCIATE_VAR_P (decl) = 1;
 
-  /* We no longer mark __def_init as read-only so it does not take up
-     space in the read-only section and dan go into the BSS instead,
-     see PR 84487.  Marking this as artificial means that OpenMP will
-     treat this as predetermined shared.  */
-  if (sym->attr.vtab
-      || (sym->name[0] == '_' && gfc_str_startswith (sym->name, "__def_init")))
-    DECL_ARTIFICIAL (decl) = 1;
+  /* We only longer mark __def_init as read-only if it actually has an
+     initializer, it does not needlessly take up space in the
+     read-only section and can go into the BSS instead, see PR 84487.
+     Marking this as artificial means that OpenMP will treat this as
+     predetermined shared.  */
+
+  bool def_init = gfc_str_startswith (sym->name, "__def_init");
+
+  if (sym->attr.vtab || def_init)
+    {
+      DECL_ARTIFICIAL (decl) = 1;
+      if (def_init && sym->value)
+       TREE_READONLY (decl) = 1;
+    }
 
   return decl;
 }