Author: rsmith Date: Mon Sep 30 17:41:16 2019 New Revision: 373279 URL: http://llvm.org/viewvc/llvm-project?rev=373279&view=rev Log: During constant evaluation, handle CXXBindTemporaryExprs for array-of-class types, not just for class types.
Modified: cfe/trunk/lib/AST/ExprConstant.cpp cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp Modified: cfe/trunk/lib/AST/ExprConstant.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=373279&r1=373278&r2=373279&view=diff ============================================================================== --- cfe/trunk/lib/AST/ExprConstant.cpp (original) +++ cfe/trunk/lib/AST/ExprConstant.cpp Mon Sep 30 17:41:16 2019 @@ -6493,6 +6493,12 @@ public: return StmtVisitorTy::Visit(E->getSubExpr()) && Scope.destroy(); } + // Temporaries are registered when created, so we don't care about + // CXXBindTemporaryExpr. + bool VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *E) { + return StmtVisitorTy::Visit(E->getSubExpr()); + } + bool VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *E) { CCEDiag(E, diag::note_constexpr_invalid_cast) << 0; return static_cast<Derived*>(this)->VisitCastExpr(E); @@ -8448,13 +8454,6 @@ namespace { bool VisitCXXInheritedCtorInitExpr(const CXXInheritedCtorInitExpr *E); bool VisitCXXConstructExpr(const CXXConstructExpr *E, QualType T); bool VisitCXXStdInitializerListExpr(const CXXStdInitializerListExpr *E); - - // Temporaries are registered when created, so we don't care about - // CXXBindTemporaryExpr. - bool VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *E) { - return Visit(E->getSubExpr()); - } - bool VisitBinCmp(const BinaryOperator *E); }; } Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp?rev=373279&r1=373278&r2=373279&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp (original) +++ cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp Mon Sep 30 17:41:16 2019 @@ -802,6 +802,11 @@ namespace dtor { return true; } static_assert(run_dtors_on_array_filler()); + + // Ensure that we can handle temporary cleanups for array temporaries. + struct ArrElem { constexpr ~ArrElem() {} }; + using Arr = ArrElem[3]; + static_assert((Arr{}, true)); } namespace dynamic_alloc { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits