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.
This is a CXXConstructExpr, so create a local temporary variable and initialize it. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D147591 Files: clang/lib/AST/Interp/ByteCodeExprGen.cpp clang/lib/AST/Interp/ByteCodeExprGen.h clang/test/AST/Interp/records.cpp Index: clang/test/AST/Interp/records.cpp =================================================================== --- clang/test/AST/Interp/records.cpp +++ clang/test/AST/Interp/records.cpp @@ -314,7 +314,7 @@ int Pos = 0; { - auto T = Test(Arr, Pos); + Test(Arr, Pos); // End of scope, should destroy Test. } Index: clang/lib/AST/Interp/ByteCodeExprGen.h =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.h +++ clang/lib/AST/Interp/ByteCodeExprGen.h @@ -91,6 +91,8 @@ bool VisitPointerCompoundAssignOperator(const CompoundAssignOperator *E); bool VisitExprWithCleanups(const ExprWithCleanups *E); bool VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E); + bool VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *E); + bool VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *E); bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); bool VisitTypeTraitExpr(const TypeTraitExpr *E); bool VisitLambdaExpr(const LambdaExpr *E); Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -898,6 +898,24 @@ return false; } +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitCXXBindTemporaryExpr( + const CXXBindTemporaryExpr *E) { + + return this->visit(E->getSubExpr()); +} + +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitCXXTemporaryObjectExpr( + const CXXTemporaryObjectExpr *E) { + + if (std::optional<unsigned> LocalIndex = + allocateLocal(E, /*IsExtended=*/false)) { + return this->visitLocalInitializer(E, *LocalIndex); + } + return false; +} + template <class Emitter> bool ByteCodeExprGen<Emitter>::VisitCompoundLiteralExpr( const CompoundLiteralExpr *E) {
Index: clang/test/AST/Interp/records.cpp =================================================================== --- clang/test/AST/Interp/records.cpp +++ clang/test/AST/Interp/records.cpp @@ -314,7 +314,7 @@ int Pos = 0; { - auto T = Test(Arr, Pos); + Test(Arr, Pos); // End of scope, should destroy Test. } Index: clang/lib/AST/Interp/ByteCodeExprGen.h =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.h +++ clang/lib/AST/Interp/ByteCodeExprGen.h @@ -91,6 +91,8 @@ bool VisitPointerCompoundAssignOperator(const CompoundAssignOperator *E); bool VisitExprWithCleanups(const ExprWithCleanups *E); bool VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E); + bool VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *E); + bool VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *E); bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); bool VisitTypeTraitExpr(const TypeTraitExpr *E); bool VisitLambdaExpr(const LambdaExpr *E); Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -898,6 +898,24 @@ return false; } +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitCXXBindTemporaryExpr( + const CXXBindTemporaryExpr *E) { + + return this->visit(E->getSubExpr()); +} + +template <class Emitter> +bool ByteCodeExprGen<Emitter>::VisitCXXTemporaryObjectExpr( + const CXXTemporaryObjectExpr *E) { + + if (std::optional<unsigned> LocalIndex = + allocateLocal(E, /*IsExtended=*/false)) { + return this->visitLocalInitializer(E, *LocalIndex); + } + return false; +} + template <class Emitter> bool ByteCodeExprGen<Emitter>::VisitCompoundLiteralExpr( const CompoundLiteralExpr *E) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits