Index: clang/lib/AST/Interp/ByteCodeExprGen.h =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.h +++ clang/lib/AST/Interp/ByteCodeExprGen.h @@ -99,6 +99,7 @@ bool VisitPredefinedExpr(const PredefinedExpr *E); bool VisitCXXThrowExpr(const CXXThrowExpr *E); bool VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *E); + bool VisitCXXConstructExpr(const CXXConstructExpr *E); protected: bool visitExpr(const Expr *E) override; Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1105,6 +1105,24 @@ return this->emitInvalidCast(CastKind::Reinterpret, E); } +template +bool ByteCodeExprGen::VisitCXXConstructExpr( + const CXXConstructExpr *E) { + if (std::optional GI = allocateLocal(E, /*IsExtended=*/false)) { + if (!this->emitGetPtrLocal(*GI, E)) + return false; + + if (!this->visitRecordInitializer(E)) + return false; + + if (DiscardResult) + return this->emitPopPtr(E); + return true; + } + + return false; +} + template bool ByteCodeExprGen::discard(const Expr *E) { if (E->containsErrors()) return false; Index: clang/test/AST/Interp/lambda.cpp =================================================================== --- clang/test/AST/Interp/lambda.cpp +++ clang/test/AST/Interp/lambda.cpp @@ -159,10 +159,6 @@ } static_assert(sv4(12) == 12); - - - /// FIXME: This is broken for lambda-unrelated reasons. -#if 0 constexpr int sv5(int i) { struct F { int a; float f; }; auto l = [](int m, F f) { return m; }; @@ -170,7 +166,6 @@ return fp(i, F{12, 14.0}); } static_assert(sv5(12) == 12); -#endif constexpr int sv6(int i) { struct F { int a;