> From: Hans-Peter Nilsson <h...@axis.com> > Date: Tue, 30 Jan 2024 06:18:45 +0100
> Ping for the xfailed testsuite patch below the review > (actual constexpr.cc patch to be handled separately): Ping*2. Again, this is for the xfailed test-case only. > > > 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 > > >