]> granicus.if.org Git - clang/commitdiff
In Sema::MaybeBindToTemporary, create a CXXBindTemporaryExpr for an
authorPeter Collingbourne <peter@pcc.me.uk>
Sun, 27 Nov 2011 22:09:28 +0000 (22:09 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Sun, 27 Nov 2011 22:09:28 +0000 (22:09 +0000)
array of objects with non-trivial destructors.  PR11365.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145203 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprCXX.cpp
lib/Sema/SemaExprCXX.cpp
test/CodeGenCXX/temporaries.cpp

index 99e9002a48293fa4d40457d6fbe3ef891937b27d..1bbf8494fa22c1ce968962be3be662862f1685a1 100644 (file)
@@ -618,8 +618,9 @@ CXXTemporary *CXXTemporary::Create(ASTContext &C,
 CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C,
                                                    CXXTemporary *Temp,
                                                    Expr* SubExpr) {
-  assert(SubExpr->getType()->isRecordType() &&
-         "Expression bound to a temporary must have record type!");
+  assert((SubExpr->getType()->isRecordType() ||
+          SubExpr->getType()->isArrayType()) &&
+         "Expression bound to a temporary must have record or array type!");
 
   return new (C) CXXBindTemporaryExpr(Temp, SubExpr);
 }
index 7b5c358f7de38a09a2f9976fdf8cb7651ac31c55..973e92d214ec2f204e46b9996a182d5a171912c8 100644 (file)
@@ -4116,7 +4116,8 @@ ExprResult Sema::MaybeBindToTemporary(Expr *E) {
   if (!getLangOptions().CPlusPlus)
     return Owned(E);
 
-  const RecordType *RT = E->getType()->getAs<RecordType>();
+  QualType ET = Context.getBaseElementType(E->getType());
+  const RecordType *RT = ET->getAs<RecordType>();
   if (!RT)
     return Owned(E);
 
index 98e5ae3e6ee7d80518794377a5be42c37211d60b..e90c94796faaed6546165d1690c9a9f41a948c8c 100644 (file)
@@ -519,3 +519,21 @@ namespace PR8623 {
     b ? A(2) : A(3);
   }
 }
+
+namespace PR11365 {
+  struct A { A(); ~A(); };
+
+  // CHECK: define void @_ZN7PR113653fooEv(
+  void foo() {
+    // CHECK: [[BEGIN:%.*]] = getelementptr inbounds [3 x [[A:%.*]]]* {{.*}}, i32 0, i32 0
+    // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 3
+    // CHECK-NEXT: br label
+
+    // CHECK: [[PHI:%.*]] = phi
+    // CHECK-NEXT: [[ELEM:%.*]] = getelementptr inbounds [[A]]* [[PHI]], i64 -1
+    // CHECK-NEXT: call void @_ZN7PR113651AD1Ev([[A]]* [[ELEM]])
+    // CHECK-NEXT: icmp eq [[A]]* [[ELEM]], [[BEGIN]]
+    // CHECK-NEXT: br i1
+    (void) (A [3]) {};
+  }
+}