[clang] 96fb49c - [AST] Update LVal before evaluating lambda decl fields.
Zequan Wu via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 4 17:01:17 PST 2021
Author: Zequan Wu
Date: 2021-02-04T17:01:09-08:00
New Revision: 96fb49c3ff8e08680127ddd4ec45a0e6c199243b
URL: https://github.com/llvm/llvm-project/commit/96fb49c3ff8e08680127ddd4ec45a0e6c199243b
DIFF: https://github.com/llvm/llvm-project/commit/96fb49c3ff8e08680127ddd4ec45a0e6c199243b.diff
LOG: [AST] Update LVal before evaluating lambda decl fields.
Differential Revision: https://reviews.llvm.org/D96092
Added:
Modified:
clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/constant-expression-cxx2a.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 0f0c33b0ac85..b19f11208485 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -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;
diff --git a/clang/test/SemaCXX/constant-expression-cxx2a.cpp b/clang/test/SemaCXX/constant-expression-cxx2a.cpp
index 4adadc9988ab..86020a09db44 100644
--- a/clang/test/SemaCXX/constant-expression-cxx2a.cpp
+++ b/clang/test/SemaCXX/constant-expression-cxx2a.cpp
@@ -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);
+}
More information about the cfe-commits
mailing list