OSDN Git Service

PR c++/19813
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Feb 2005 06:58:40 +0000 (06:58 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 Feb 2005 06:58:40 +0000 (06:58 +0000)
* emit-rtl.c (set_mem_attributes_minus_bitpos): Add assertion
that ref to be marked MEM_READONLY_P doesn't have base that needs
constructing.

* decl.c (start_decl_1): Clear TREE_READONLY flag if
its type has TYPE_NEEDS_CONSTRUCTING.
(complete_vars): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@95217 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/emit-rtl.c

index 1d83533..0433f2f 100644 (file)
@@ -1,3 +1,10 @@
+2005-02-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/19813
+       * emit-rtl.c (set_mem_attributes_minus_bitpos): Add assertion
+       that ref to be marked MEM_READONLY_P doesn't have base that needs
+       constructing.
+
 2005-02-18  Joseph S. Myers  <joseph@codesourcery.com>
 
        * genautomata.c (output_get_cpu_unit_code_func,
index cdbbfa5..61cd670 100644 (file)
@@ -1,3 +1,10 @@
+2005-02-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/19813
+       * decl.c (start_decl_1): Clear TREE_READONLY flag if
+       its type has TYPE_NEEDS_CONSTRUCTING.
+       (complete_vars): Likewise.
+
 2005-02-17  Alexandre Oliva  <aoliva@redhat.com>
 
        PR c++/20028
index 48f8d8c..4f1aa1f 100644 (file)
@@ -3823,6 +3823,14 @@ start_decl_1 (tree decl)
      instantiation has occurred that TYPE_HAS_NONTRIVIAL_DESTRUCTOR
      will be set correctly.  */
   maybe_push_cleanup_level (type);
+
+  /* An object declared 'const' is only readonly after it is
+     initialized.  We don't have any way of expressing this currently,
+     so we need to be conservative and unset TREE_READONLY for types
+     with constructors.  Otherwise aliasing code will ignore stores in
+     an inline constructor.  */
+   if (TYPE_NEEDS_CONSTRUCTING (type))
+     TREE_READONLY (decl) = 0;
 }
 
 /* Handle initialization of references.  DECL, TYPE, and INIT have the
@@ -10913,6 +10921,13 @@ complete_vars (tree type)
          /* Complete the type of the variable.  The VAR_DECL itself
             will be laid out in expand_expr.  */
          complete_type (TREE_TYPE (var));
+         /* An object declared 'const' is only readonly after it is
+            initialized.  We don't have any way of expressing this currently,
+            so we need to be conservative and unset TREE_READONLY for types
+            with constructors.  Otherwise aliasing code will ignore stores in
+            an inline constructor.  */
+         if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (var)))
+           TREE_READONLY (var) = 0;
          /* Remove this entry from the list.  */
          *list = TREE_CHAIN (*list);
        }
index 46d9183..37bd665 100644 (file)
@@ -1533,7 +1533,12 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
       if (base && DECL_P (base)
          && TREE_READONLY (base)
          && (TREE_STATIC (base) || DECL_EXTERNAL (base)))
-       MEM_READONLY_P (ref) = 1;
+       {
+         tree base_type = TREE_TYPE (base);
+         gcc_assert (!(base_type && TYPE_NEEDS_CONSTRUCTING (base_type))
+                     || DECL_ARTIFICIAL (base));
+         MEM_READONLY_P (ref) = 1;
+       }
 
       if (TREE_THIS_VOLATILE (t))
        MEM_VOLATILE_P (ref) = 1;