summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2011-11-13 00:51:30 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2011-11-13 00:51:30 +0000
commitfcc764d140d6c8d34f67b0806f4f50618b2dc90c (patch)
treec0802270cb54c1387d8287188a1bcfee5820927d
parent38b3f312ca1d64c342fdbe9dc2dd6eb5e956f5e6 (diff)
downloadbcm5719-llvm-fcc764d140d6c8d34f67b0806f4f50618b2dc90c.tar.gz
bcm5719-llvm-fcc764d140d6c8d34f67b0806f4f50618b2dc90c.zip
When reference binding array rvalues, such as those created by compound
literals of array type, materialise a temporary. llvm-svn: 144483
-rw-r--r--clang/lib/Sema/SemaInit.cpp2
-rw-r--r--clang/test/CodeGenCXX/compound-literals.cpp12
2 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index a24e708b1e7..c24f8aa5e21 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -3187,7 +3187,7 @@ static void TryReferenceInitialization(Sema &S,
if (T1Quals != T2Quals)
Sequence.AddQualificationConversionStep(cv1T1, ValueKind);
Sequence.AddReferenceBindingStep(cv1T1,
- /*bindingTemporary=*/(InitCategory.isPRValue() && !T2->isArrayType()));
+ /*bindingTemporary=*/InitCategory.isPRValue());
return;
}
diff --git a/clang/test/CodeGenCXX/compound-literals.cpp b/clang/test/CodeGenCXX/compound-literals.cpp
index cd44e97c674..f520ff99516 100644
--- a/clang/test/CodeGenCXX/compound-literals.cpp
+++ b/clang/test/CodeGenCXX/compound-literals.cpp
@@ -25,3 +25,15 @@ int f() {
// CHECK-NEXT: ret i32 [[RESULT]]
return ((Y){17, "seventeen"}).i;
}
+
+// CHECK: define i32 @_Z1gv()
+int g() {
+ // CHECK: store [2 x i32]* %{{[a-z0-9.]+}}, [2 x i32]** [[V:%[a-z0-9.]+]]
+ const int (&v)[2] = (int [2]) {1,2};
+
+ // CHECK: [[A:%[a-z0-9.]+]] = load [2 x i32]** [[V]]
+ // CHECK-NEXT: [[A0ADDR:%[a-z0-9.]+]] = getelementptr inbounds [2 x i32]* [[A]], i32 0, {{.*}} 0
+ // CHECK-NEXT: [[A0:%[a-z0-9.]+]] = load i32* [[A0ADDR]]
+ // CHECK-NEXT: ret i32 [[A0]]
+ return v[0];
+}
OpenPOWER on IntegriCloud