From ce4c1bf01a651b83ed3075bab6f1b129425ca426 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 30 May 2017 09:24:56 +0200 Subject: [PATCH] backport: re PR c++/77375 (constant object with mutable subobject allocated in read-only memory) Backported from mainline 2016-09-16 Jakub Jelinek PR c++/77375 * class.c (check_bases): Set CLASSTYPE_HAS_MUTABLE if any TYPE_HAS_MUTABLE_P for any bases. * g++.dg/cpp0x/mutable1.C: New test. From-SVN: r248608 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/class.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/mutable1.C | 12 ++++++++++++ 4 files changed, 25 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/mutable1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 167d78e938b1..487e2c7bb97b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,12 @@ 2017-05-30 Jakub Jelinek Backported from mainline + 2016-09-16 Jakub Jelinek + + PR c++/77375 + * class.c (check_bases): Set CLASSTYPE_HAS_MUTABLE if any + TYPE_HAS_MUTABLE_P for any bases. + 2016-08-11 Jakub Jelinek PR c++/72868 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 9dc15da28257..50fbe2445906 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1763,6 +1763,8 @@ check_bases (tree t, SET_CLASSTYPE_REF_FIELDS_NEED_INIT (t, CLASSTYPE_REF_FIELDS_NEED_INIT (t) | CLASSTYPE_REF_FIELDS_NEED_INIT (basetype)); + if (TYPE_HAS_MUTABLE_P (basetype)) + CLASSTYPE_HAS_MUTABLE (t) = 1; /* A standard-layout class is a class that: ... diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8618807b782c..f7cdcc87a0b6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2017-05-30 Jakub Jelinek Backported from mainline + 2016-09-16 Jakub Jelinek + + PR c++/77375 + * g++.dg/cpp0x/mutable1.C: New test. + 2016-09-16 Jakub Jelinek Eric Botcazou diff --git a/gcc/testsuite/g++.dg/cpp0x/mutable1.C b/gcc/testsuite/g++.dg/cpp0x/mutable1.C new file mode 100644 index 000000000000..4dd37185d729 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/mutable1.C @@ -0,0 +1,12 @@ +// PR c++/77375 +// { dg-do run { target c++11 } } + +struct Base { mutable int i; }; +struct Derived : Base {}; +const Derived foo{}; + +int +main () +{ + foo.i = 42; +} -- 2.47.2