c++: no_unique_address and constexpr [PR112439]
Here, because we don't build a CONSTRUCTOR for an empty base, we were wrongly marking the Foo CONSTRUCTOR as complete after initializing the Empty member. Fixed by checking empty_base here as well. PR c++/112439 gcc/cp/ChangeLog: * constexpr.cc (cxx_eval_store_expression): Check empty_base before marking a CONSTRUCTOR readonly. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/no_unique_address15.C: New test.
This commit is contained in:
parent
0b786ff38a
commit
f499860990
2 changed files with 20 additions and 0 deletions
|
@ -6694,6 +6694,7 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t,
|
|||
object. Make a note of this fact by marking the CONSTRUCTOR
|
||||
TREE_READONLY. */
|
||||
if (TREE_CODE (t) == INIT_EXPR
|
||||
&& !empty_base
|
||||
&& TREE_CODE (*valp) == CONSTRUCTOR
|
||||
&& TYPE_READONLY (type))
|
||||
{
|
||||
|
|
19
gcc/testsuite/g++.dg/cpp2a/no_unique_address15.C
Normal file
19
gcc/testsuite/g++.dg/cpp2a/no_unique_address15.C
Normal file
|
@ -0,0 +1,19 @@
|
|||
// PR c++/112439
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
struct Empty {};
|
||||
|
||||
class Foo {
|
||||
public:
|
||||
constexpr Foo(int x, Empty y, int z) : a(x), b(y)
|
||||
{
|
||||
c = z;
|
||||
}
|
||||
|
||||
private:
|
||||
int a{};
|
||||
[[no_unique_address]] Empty b{};
|
||||
[[no_unique_address]] int c{};
|
||||
};
|
||||
|
||||
constexpr Foo r{1, {}, 3};
|
Loading…
Add table
Reference in a new issue