Ping for the xfailed testsuite patch below the review (actual constexpr.cc patch to be handled separately):
> From: Hans-Peter Nilsson <h...@axis.com> > Date: Tue, 23 Jan 2024 05:55:00 +0100 > > > Date: Mon, 22 Jan 2024 14:33:59 -0500 > > From: Marek Polacek <pola...@redhat.com> > > > The problem seems to be more about conversion so > > g++.dg/conversion/reinterpret5.C > > or g++.dg/cpp0x/constexpr-reinterpret3.C seems more appropriate. > > > > > @@ -0,0 +1,49 @@ > > > > Please add > > > > PR c++/113545 > > > > + unsigned const char c = > > > swbar(reinterpret_cast<__UINTPTR_TYPE__>(&foo)); > > > + xyzzy(c); > > > + unsigned const char d = > > > ifbar(reinterpret_cast<__UINTPTR_TYPE__>(&foo)); > > > > I suppose we should also test a C-style cast (which leads to a > > reinterpret_cast > > in this case). > > > > Maybe check we get an error when c/d are constexpr (that used to ICE). > > Like this? Not sure about the value of that variant, but here goes. > > I checked that these behave as expected (xfail as ICE properly) without the > previosly posted patch to cp/constexpr.cc and XPASS with it applied. > > Ok to commit? > > -- >8 -- > Subject: [PATCH] c++: testcases for PR113545 (constexpr with switch and > passing non-constexpr parameter) > > gcc/testsuite: > PR c++/113545 > * g++.dg/cpp0x/constexpr-reinterpret3.C, > g++.dg/cpp0x/constexpr-reinterpret4.C: New tests. > --- > .../g++.dg/cpp0x/constexpr-reinterpret3.C | 55 +++++++++++++++++++ > .../g++.dg/cpp0x/constexpr-reinterpret4.C | 54 ++++++++++++++++++ > 2 files changed, 109 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret3.C > create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret4.C > > diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret3.C > b/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret3.C > new file mode 100644 > index 000000000000..319cc5e8bee9 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret3.C > @@ -0,0 +1,55 @@ > +// PR c++/113545 > +// { dg-do run { target c++11 } } > +// { dg-ice "PR112545 - constexpr function with switch called for > reinterpret_cast" } > + > +char foo; > + > +// This one caught a call to gcc_unreachable in > +// cp/constexpr.cc:label_matches, when passed a convert_expr from the > +// cast in the call. > +constexpr unsigned char swbar(__UINTPTR_TYPE__ baz) > +{ > + switch (baz) > + { > + case 13: > + return 11; > + case 14: > + return 78; > + case 2048: > + return 13; > + default: > + return 42; > + } > +} > + > +// For reference, the equivalent* if-statements. > +constexpr unsigned char ifbar(__UINTPTR_TYPE__ baz) > +{ > + if (baz == 13) > + return 11; > + else if (baz == 14) > + return 78; > + else if (baz == 2048) > + return 13; > + else > + return 42; > +} > + > +__attribute__ ((__noipa__)) > +void xyzzy(int x) > +{ > + if (x != 42) > + __builtin_abort (); > +} > + > +int main() > +{ > + unsigned const char c = swbar(reinterpret_cast<__UINTPTR_TYPE__>(&foo)); > + xyzzy(c); > + unsigned const char d = ifbar(reinterpret_cast<__UINTPTR_TYPE__>(&foo)); > + xyzzy(d); > + unsigned const char e = swbar((__UINTPTR_TYPE__) &foo); > + xyzzy(e); > + unsigned const char f = ifbar((__UINTPTR_TYPE__) &foo); > + xyzzy(f); > +} > diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret4.C > b/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret4.C > new file mode 100644 > index 000000000000..4d0fdf2c0a78 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-reinterpret4.C > @@ -0,0 +1,54 @@ > +// PR c++/113545 > +// { dg-do compile { target c++11 } } > + > +char foo; > + > +// This one caught a call to gcc_unreachable in > +// cp/constexpr.cc:label_matches, when passed a convert_expr from the > +// cast in the call. > +constexpr unsigned char swbar(__UINTPTR_TYPE__ baz) > +{ > + switch (baz) > + { > + case 13: > + return 11; > + case 14: > + return 78; > + case 2048: > + return 13; > + default: > + return 42; > + } > +} > + > +// For reference, the equivalent* if-statements. > +constexpr unsigned char ifbar(__UINTPTR_TYPE__ baz) > +{ > + if (baz == 13) > + return 11; > + else if (baz == 14) > + return 78; > + else if (baz == 2048) > + return 13; > + else > + return 42; > +} > + > +__attribute__ ((__noipa__)) > +void xyzzy(int x) > +{ > + if (x != 42) > + __builtin_abort (); > +} > + > +int main() > +{ > + unsigned constexpr char c = > swbar(reinterpret_cast<__UINTPTR_TYPE__>(&foo)); // { dg-error "conversion > from pointer type" } > + xyzzy(c); > + unsigned constexpr char d = > ifbar(reinterpret_cast<__UINTPTR_TYPE__>(&foo)); // { dg-error "conversion > from pointer type" } > + xyzzy(d); > + unsigned constexpr char e = swbar((__UINTPTR_TYPE__) &foo); // { dg-error > "conversion from pointer type" } > + xyzzy(e); > + unsigned constexpr char f = ifbar((__UINTPTR_TYPE__) &foo); // { dg-error > "conversion from pointer type" } > + xyzzy(f); > +} > -- > 2.30.2 >