forked from OSchip/llvm-project
[AST] Update LVal before evaluating lambda decl fields.
Differential Revision: https://reviews.llvm.org/D96092
This commit is contained in:
parent
807a8daf1b
commit
96fb49c3ff
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue