tbaeder created this revision. tbaeder added reviewers: aaron.ballman, erichkeane, tahonermann, shafik. Herald added a project: All. tbaeder requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Fixes a so far broken Lambda test case. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D153689 Files: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/ByteCodeExprGen.h clang/test/AST/Interp/lambda.cpp 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; 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 <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitCXXConstructExpr( + const CXXConstructExpr *E) { + if (std::optional<unsigned> 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 <class Emitter> bool ByteCodeExprGen<Emitter>::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; 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 <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitCXXConstructExpr( + const CXXConstructExpr *E) { + if (std::optional<unsigned> 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 <class Emitter> bool ByteCodeExprGen<Emitter>::discard(const Expr *E) { if (E->containsErrors()) return false;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits