diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 3 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/temporaries.cpp | 18 | 
3 files changed, 23 insertions, 3 deletions
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 99e9002a482..1bbf8494fa2 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -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);  } diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 7b5c358f7de..973e92d214e 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -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); diff --git a/clang/test/CodeGenCXX/temporaries.cpp b/clang/test/CodeGenCXX/temporaries.cpp index 98e5ae3e6ee..e90c94796fa 100644 --- a/clang/test/CodeGenCXX/temporaries.cpp +++ b/clang/test/CodeGenCXX/temporaries.cpp @@ -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]) {}; +  } +}  | 

