mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-23 19:03:59 +08:00
fold-const: Handle NON_LVALUE_EXPR in native_encode_initializer [PR114537]
The following testcase is incorrectly rejected. The problem is that for bit-fields native_encode_initializer expects the corresponding CONSTRUCTOR elt value must be INTEGER_CST, but that isn't the case here, it is wrapped into NON_LVALUE_EXPR by maybe_wrap_with_location. We could STRIP_ANY_LOCATION_WRAPPER as well, but as all we are looking for is INTEGER_CST inside, just looking through NON_LVALUE_EXPR seems easier. 2024-04-04 Jakub Jelinek <jakub@redhat.com> PR c++/114537 * fold-const.cc (native_encode_initializer): Look through NON_LVALUE_EXPR if val is INTEGER_CST. * g++.dg/cpp2a/bit-cast16.C: New test.
This commit is contained in:
parent
48530efdcc
commit
1baec8deb0
@ -8601,6 +8601,8 @@ native_encode_initializer (tree init, unsigned char *ptr, int len,
|
|||||||
if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
|
if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (TREE_CODE (val) == NON_LVALUE_EXPR)
|
||||||
|
val = TREE_OPERAND (val, 0);
|
||||||
if (TREE_CODE (val) != INTEGER_CST)
|
if (TREE_CODE (val) != INTEGER_CST)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
16
gcc/testsuite/g++.dg/cpp2a/bit-cast16.C
Normal file
16
gcc/testsuite/g++.dg/cpp2a/bit-cast16.C
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
// PR c++/114537
|
||||||
|
// { dg-do compile { target c++20 } }
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
template<typename T, typename F>
|
||||||
|
constexpr T
|
||||||
|
bit_cast (const F& f) noexcept
|
||||||
|
{
|
||||||
|
return __builtin_bit_cast (T, f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct A { signed char b : 1 = 0; signed char c : 7 = 0; };
|
||||||
|
struct D { unsigned char e; };
|
||||||
|
constexpr unsigned char f = std::bit_cast<D> (A{}).e;
|
||||||
|
static_assert (f == 0);
|
Loading…
Reference in New Issue
Block a user