[AST] Update LVal before evaluating lambda decl fields.

Differential Revision: https://reviews.llvm.org/D96092
This commit is contained in:
Zequan Wu 2021-02-04 17:00:09 -08:00
parent 807a8daf1b
commit 96fb49c3ff
2 changed files with 17 additions and 1 deletions

View File

@ -10016,6 +10016,7 @@ bool RecordExprEvaluator::VisitLambdaExpr(const LambdaExpr *E) {
auto *CaptureInitIt = E->capture_init_begin();
const LambdaCapture *CaptureIt = ClosureClass->captures_begin();
bool Success = true;
const ASTRecordLayout &Layout = Info.Ctx.getASTRecordLayout(ClosureClass);
for (const auto *Field : ClosureClass->fields()) {
assert(CaptureInitIt != E->capture_init_end());
// Get the initializer for this field
@ -10026,8 +10027,13 @@ bool RecordExprEvaluator::VisitLambdaExpr(const LambdaExpr *E) {
if (!CurFieldInit)
return Error(E);
LValue Subobject = This;
if (!HandleLValueMember(Info, E, Subobject, Field, &Layout))
return false;
APValue &FieldVal = Result.getStructField(Field->getFieldIndex());
if (!EvaluateInPlace(FieldVal, Info, This, CurFieldInit)) {
if (!EvaluateInPlace(FieldVal, Info, Subobject, CurFieldInit)) {
if (!Info.keepEvaluatingAfterFailure())
return false;
Success = false;

View File

@ -1437,3 +1437,13 @@ constexpr bool destroy_at_test() {
return true;
}
static_assert(destroy_at_test());
namespace PR48582 {
struct S {
void *p = this;
constexpr S() {}
constexpr S(const S&) {}
};
constexpr bool b = [a = S(), b = S()] { return a.p == b.p; }();
static_assert(!b);
}