OSDN Git Service

PR c++/54026
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Jul 2012 06:29:33 +0000 (06:29 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Jul 2012 06:29:33 +0000 (06:29 +0000)
* typeck.c (cp_apply_type_quals_to_decl): Check COMPLETE_TYPE_P.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@189702 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/mutable1.C [new file with mode: 0644]

index d567568..8560c88 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-19  Jason Merrill  <jason@redhat.com>
+
+       PR c++/54026
+       * typeck.c (cp_apply_type_quals_to_decl): Check COMPLETE_TYPE_P.
+
 2012-07-18  Jason Merrill  <jason@redhat.com>
 
        * method.c (process_subob_fn): Make sure no_implicit_p is non-null
index 76fc585..96b7d4e 100644 (file)
@@ -8296,9 +8296,9 @@ cp_apply_type_quals_to_decl (int type_quals, tree decl)
      constructor can produce constant init, so rely on cp_finish_decl to
      clear TREE_READONLY if the variable has non-constant init.  */
 
-  /* If the type has a mutable component, that component might be
-     modified.  */
-  if (TYPE_HAS_MUTABLE_P (type))
+  /* If the type has (or might have) a mutable component, that component
+     might be modified.  */
+  if (TYPE_HAS_MUTABLE_P (type) || !COMPLETE_TYPE_P (type))
     type_quals &= ~TYPE_QUAL_CONST;
 
   c_apply_type_quals_to_decl (type_quals, decl);
index 5615b74..efaf1dc 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-19  Jason Merrill  <jason@redhat.com>
+
+       PR c++/54026
+       * g++.dg/init/mutable1.C: New.
+
 2012-07-19  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/opt25.adb: New test.
diff --git a/gcc/testsuite/g++.dg/init/mutable1.C b/gcc/testsuite/g++.dg/init/mutable1.C
new file mode 100644 (file)
index 0000000..af99ee0
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/54026
+// { dg-final { scan-assembler-not "rodata" } }
+
+void non_const(int *);
+
+template <typename T>
+struct Foo {
+  T x;
+  mutable int y;
+  void func() const { non_const(&y); }
+};
+
+struct Bar {
+  int x;
+  mutable int y;
+  void func() const { non_const(&y); }
+};
+
+const Foo<int> foo = { 1, 2 };
+const Bar bar = { 3, 4 };