> 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