forked from OSchip/llvm-project
PR43629: Fix crash evaluating constexpr placement new on a subobject of
an out-of-lifetime object. llvm-svn: 374465
This commit is contained in:
parent
a064edf55e
commit
e381f33651
|
@ -126,7 +126,8 @@ def note_constexpr_lifetime_ended : Note<
|
||||||
"%plural{8:storage duration|:lifetime}0 has ended">;
|
"%plural{8:storage duration|:lifetime}0 has ended">;
|
||||||
def note_constexpr_access_uninit : Note<
|
def note_constexpr_access_uninit : Note<
|
||||||
"%select{read of|read of|assignment to|increment of|decrement of|"
|
"%select{read of|read of|assignment to|increment of|decrement of|"
|
||||||
"member call on|dynamic_cast of|typeid applied to|<ERRPR>|destruction of}0 "
|
"member call on|dynamic_cast of|typeid applied to|"
|
||||||
|
"construction of subobject of|destruction of}0 "
|
||||||
"%select{object outside its lifetime|uninitialized object}1 "
|
"%select{object outside its lifetime|uninitialized object}1 "
|
||||||
"is not allowed in a constant expression">;
|
"is not allowed in a constant expression">;
|
||||||
def note_constexpr_use_uninit_reference : Note<
|
def note_constexpr_use_uninit_reference : Note<
|
||||||
|
|
|
@ -3178,7 +3178,7 @@ findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj,
|
||||||
// Walk the designator's path to find the subobject.
|
// Walk the designator's path to find the subobject.
|
||||||
for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {
|
for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {
|
||||||
// Reading an indeterminate value is undefined, but assigning over one is OK.
|
// Reading an indeterminate value is undefined, but assigning over one is OK.
|
||||||
if ((O->isAbsent() && handler.AccessKind != AK_Construct) ||
|
if ((O->isAbsent() && !(handler.AccessKind == AK_Construct && I == N)) ||
|
||||||
(O->isIndeterminate() && handler.AccessKind != AK_Construct &&
|
(O->isIndeterminate() && handler.AccessKind != AK_Construct &&
|
||||||
handler.AccessKind != AK_Assign &&
|
handler.AccessKind != AK_Assign &&
|
||||||
handler.AccessKind != AK_ReadObjectRepresentation)) {
|
handler.AccessKind != AK_ReadObjectRepresentation)) {
|
||||||
|
|
|
@ -166,3 +166,13 @@ constexpr bool construct_after_lifetime() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
static_assert(construct_after_lifetime()); // expected-error {{}} expected-note {{in call}}
|
static_assert(construct_after_lifetime()); // expected-error {{}} expected-note {{in call}}
|
||||||
|
|
||||||
|
constexpr bool construct_after_lifetime_2() {
|
||||||
|
struct A { struct B {} b; };
|
||||||
|
A a;
|
||||||
|
a.~A();
|
||||||
|
std::construct_at<A::B>(&a.b); // expected-note {{in call}}
|
||||||
|
// expected-note@#new {{construction of subobject of object outside its lifetime is not allowed in a constant expression}}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
static_assert(construct_after_lifetime_2()); // expected-error {{}} expected-note {{in call}}
|
||||||
|
|
Loading…
Reference in New Issue