Message ID | 20230629152255.3838604-1-ppalka@redhat.com |
---|---|
State | New |
Headers | show |
Series | c++: unpropagated CONSTRUCTOR_MUTABLE_POISON [PR110463] | expand |
On Thu, Jun 29, 2023 at 11:22:55AM -0400, Patrick Palka via Gcc-patches wrote: > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for > trunk/13? > > -- >8 -- > > cp_fold is neglecting to propagate CONSTRUCTOR_MUTABLE_POISON when folding > a CONSTRUCTOR initializer, which for the below testcase causes us to fail > to reject a mutable member access of a constexpr variable during constexpr > evaluation. LGTM. > PR c++/110463 > > gcc/cp/ChangeLog: > > * cp-gimplify.cc (cp_fold) <case CONSTRUCTOR>: Propagate > CONSTRUCTOR_MUTABLE_POISON. > > gcc/testsuite/ChangeLog: > > * g++.dg/cpp0x/constexpr-mutable6.C: New test. > --- > gcc/cp/cp-gimplify.cc | 2 ++ > .../g++.dg/cpp0x/constexpr-mutable6.C | 18 ++++++++++++++++++ > 2 files changed, 20 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C > > diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc > index 853b1e44236..f5734197774 100644 > --- a/gcc/cp/cp-gimplify.cc > +++ b/gcc/cp/cp-gimplify.cc > @@ -3079,6 +3079,8 @@ cp_fold (tree x, fold_flags_t flags) > x = build_constructor (TREE_TYPE (x), nelts); > CONSTRUCTOR_PLACEHOLDER_BOUNDARY (x) > = CONSTRUCTOR_PLACEHOLDER_BOUNDARY (org_x); > + CONSTRUCTOR_MUTABLE_POISON (x) > + = CONSTRUCTOR_MUTABLE_POISON (org_x); > } > if (VECTOR_TYPE_P (TREE_TYPE (x))) > x = fold (x); > diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C > new file mode 100644 > index 00000000000..2c946e388ab > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C > @@ -0,0 +1,18 @@ > +// PR c++/110463 > +// { dg-do compile { target c++11 } } > + > +struct U { > + mutable int x = 1; > +}; > + > +struct V { > + mutable int y = 1+1; > +}; > + > +int main() { > + constexpr U u = {}; > + constexpr int x = u.x; // { dg-error "mutable" } > + > + constexpr V v = {}; > + constexpr int y = v.y; // { dg-error "mutable" } > +} > -- > 2.41.0.199.ga9e066fa63 > Marek
On 6/29/23 11:36, Marek Polacek wrote: > On Thu, Jun 29, 2023 at 11:22:55AM -0400, Patrick Palka via Gcc-patches wrote: >> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for >> trunk/13? >> >> -- >8 -- >> >> cp_fold is neglecting to propagate CONSTRUCTOR_MUTABLE_POISON when folding >> a CONSTRUCTOR initializer, which for the below testcase causes us to fail >> to reject a mutable member access of a constexpr variable during constexpr >> evaluation. > > LGTM. Agreed, OK. >> PR c++/110463 >> >> gcc/cp/ChangeLog: >> >> * cp-gimplify.cc (cp_fold) <case CONSTRUCTOR>: Propagate >> CONSTRUCTOR_MUTABLE_POISON. >> >> gcc/testsuite/ChangeLog: >> >> * g++.dg/cpp0x/constexpr-mutable6.C: New test. >> --- >> gcc/cp/cp-gimplify.cc | 2 ++ >> .../g++.dg/cpp0x/constexpr-mutable6.C | 18 ++++++++++++++++++ >> 2 files changed, 20 insertions(+) >> create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C >> >> diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc >> index 853b1e44236..f5734197774 100644 >> --- a/gcc/cp/cp-gimplify.cc >> +++ b/gcc/cp/cp-gimplify.cc >> @@ -3079,6 +3079,8 @@ cp_fold (tree x, fold_flags_t flags) >> x = build_constructor (TREE_TYPE (x), nelts); >> CONSTRUCTOR_PLACEHOLDER_BOUNDARY (x) >> = CONSTRUCTOR_PLACEHOLDER_BOUNDARY (org_x); >> + CONSTRUCTOR_MUTABLE_POISON (x) >> + = CONSTRUCTOR_MUTABLE_POISON (org_x); >> } >> if (VECTOR_TYPE_P (TREE_TYPE (x))) >> x = fold (x); >> diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C >> new file mode 100644 >> index 00000000000..2c946e388ab >> --- /dev/null >> +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C >> @@ -0,0 +1,18 @@ >> +// PR c++/110463 >> +// { dg-do compile { target c++11 } } >> + >> +struct U { >> + mutable int x = 1; >> +}; >> + >> +struct V { >> + mutable int y = 1+1; >> +}; >> + >> +int main() { >> + constexpr U u = {}; >> + constexpr int x = u.x; // { dg-error "mutable" } >> + >> + constexpr V v = {}; >> + constexpr int y = v.y; // { dg-error "mutable" } >> +} >> -- >> 2.41.0.199.ga9e066fa63 >> > > Marek >
diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc index 853b1e44236..f5734197774 100644 --- a/gcc/cp/cp-gimplify.cc +++ b/gcc/cp/cp-gimplify.cc @@ -3079,6 +3079,8 @@ cp_fold (tree x, fold_flags_t flags) x = build_constructor (TREE_TYPE (x), nelts); CONSTRUCTOR_PLACEHOLDER_BOUNDARY (x) = CONSTRUCTOR_PLACEHOLDER_BOUNDARY (org_x); + CONSTRUCTOR_MUTABLE_POISON (x) + = CONSTRUCTOR_MUTABLE_POISON (org_x); } if (VECTOR_TYPE_P (TREE_TYPE (x))) x = fold (x); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C new file mode 100644 index 00000000000..2c946e388ab --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-mutable6.C @@ -0,0 +1,18 @@ +// PR c++/110463 +// { dg-do compile { target c++11 } } + +struct U { + mutable int x = 1; +}; + +struct V { + mutable int y = 1+1; +}; + +int main() { + constexpr U u = {}; + constexpr int x = u.x; // { dg-error "mutable" } + + constexpr V v = {}; + constexpr int y = v.y; // { dg-error "mutable" } +}