During constant evaluation, handle CXXBindTemporaryExprs for
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 1 Oct 2019 00:41:16 +0000 (00:41 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 1 Oct 2019 00:41:16 +0000 (00:41 +0000)
array-of-class types, not just for class types.

llvm-svn: 373279

clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/constant-expression-cxx2a.cpp

index 5659a0e..cf28ecb 100644 (file)
@@ -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);
   };
 }
index 2f23975..ef3ce5c 100644 (file)
@@ -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 {