From: Jakub Jelinek Date: Tue, 30 May 2017 07:24:56 +0000 (+0200) Subject: backport: re PR c++/77375 (constant object with mutable subobject allocated in read... X-Git-Tag: releases/gcc-5.5.0~302 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce4c1bf01a651b83ed3075bab6f1b129425ca426;p=thirdparty%2Fgcc.git 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 --- 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; +}