diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-12-05 07:49:14 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-12-05 07:49:14 +0000 |
commit | 88800602c0baafb8739cb838c2fa3f5fb6cc6968 (patch) | |
tree | f304a4fbfa2024a043a57d56eea1ce4343a21818 /test/CodeGenCXX/temporaries.cpp | |
parent | 7bf57ebec1e6eb5f92a317101426436fc9f07100 (diff) |
DR1213: element access on an array xvalue or prvalue produces an xvalue. In the
latter case, a temporary array object is materialized, and can be
lifetime-extended by binding a reference to the member access. Likewise, in an
array-to-pointer decay, an rvalue array is materialized before being converted
into a pointer.
This caused IR generation to stop treating file-scope array compound literals
as having static storage duration in some cases in C++; that has been rectified
by modeling such a compound literal as an lvalue. This also improves clang's
compatibility with GCC for those cases.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@288654 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/temporaries.cpp')
-rw-r--r-- | test/CodeGenCXX/temporaries.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/test/CodeGenCXX/temporaries.cpp b/test/CodeGenCXX/temporaries.cpp index c537124c46..bad51ba353 100644 --- a/test/CodeGenCXX/temporaries.cpp +++ b/test/CodeGenCXX/temporaries.cpp @@ -779,6 +779,36 @@ namespace MultipleExtension { } } +namespace ArrayAccess { + struct A { A(int); ~A(); }; + void g(); + void f() { + using T = A[3]; + + // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 1 + // CHECK-NOT: @_ZN11ArrayAccess1AD + // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 2 + // CHECK-NOT: @_ZN11ArrayAccess1AD + // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 3 + // CHECK-NOT: @_ZN11ArrayAccess1AD + A &&a = T{1, 2, 3}[1]; + + // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 4 + // CHECK-NOT: @_ZN11ArrayAccess1AD + // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 5 + // CHECK-NOT: @_ZN11ArrayAccess1AD + // CHECK: call void @_ZN11ArrayAccess1AC1Ei({{.*}}, i32 6 + // CHECK-NOT: @_ZN11ArrayAccess1AD + A &&b = 2[T{4, 5, 6}]; + + // CHECK: call void @_ZN11ArrayAccess1gEv( + g(); + + // CHECK: call void @_ZN11ArrayAccess1AD + // CHECK: call void @_ZN11ArrayAccess1AD + } +} + namespace PR14130 { struct S { S(int); }; struct U { S &&s; }; |