Skip to content

Commit

Permalink
PR43629: Fix crash evaluating constexpr placement new on a subobject of
Browse files Browse the repository at this point in the history
an out-of-lifetime object.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@374465 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
zygoloid committed Oct 10, 2019
1 parent dea3d1b commit 005fa4c
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 2 deletions.
3 changes: 2 additions & 1 deletion include/clang/Basic/DiagnosticASTKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,8 @@ def note_constexpr_lifetime_ended : Note<
"%plural{8:storage duration|:lifetime}0 has ended">;
def note_constexpr_access_uninit : Note<
"%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 "
"is not allowed in a constant expression">;
def note_constexpr_use_uninit_reference : Note<
Expand Down
2 changes: 1 addition & 1 deletion lib/AST/ExprConstant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3178,7 +3178,7 @@ findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj,
// Walk the designator's path to find the subobject.
for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {
// 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 &&
handler.AccessKind != AK_Assign &&
handler.AccessKind != AK_ReadObjectRepresentation)) {
Expand Down
10 changes: 10 additions & 0 deletions test/SemaCXX/cxx2a-constexpr-dynalloc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,3 +166,13 @@ constexpr bool construct_after_lifetime() {
return true;
}
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}}

0 comments on commit 005fa4c

Please sign in to comment.