11b76fbc5b711efc03c1fe924db6756ec1590577aDavid Blaikie// RUN: %clang_cc1 -std=c++11 -S -triple armv7-none-eabi -emit-llvm -o - %s | FileCheck %s 213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redlnamespace reference { 413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl struct A { 513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl int i1, i2; 613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl }; 713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl void single_init() { 913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // No superfluous instructions allowed here, they could be 1013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // hiding extra temporaries. 1113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 1213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK: store i32 1, i32* 1313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store i32* %{{.*}}, i32** 1413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const int &cri2a = 1; 1513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 1613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store i32 1, i32* 1713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store i32* %{{.*}}, i32** 1813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const int &cri1a = {1}; 1913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 2013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store i32 1, i32* 2113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl int i = 1; 2213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store i32* %{{.*}}, i32** 2313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl int &ri1a = {i}; 2413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 2513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: bitcast 2613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: memcpy 2713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl A a{1, 2}; 2813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** % 2913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl A &ra1a = {a}; 3013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 3113ec9100ca6bc03b5ce8832e4a0fcb724d47bcb1Richard Smith using T = A&; 3213ec9100ca6bc03b5ce8832e4a0fcb724d47bcb1Richard Smith // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** % 3313ec9100ca6bc03b5ce8832e4a0fcb724d47bcb1Richard Smith A &ra1b = T{a}; 3413ec9100ca6bc03b5ce8832e4a0fcb724d47bcb1Richard Smith 3513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: ret 3613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 3713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 3813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl void reference_to_aggregate() { 3913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK: getelementptr {{.*}}, i32 0, i32 0 4013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store i32 1 4113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: getelementptr {{.*}}, i32 0, i32 1 4213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store i32 2 4313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** %{{.*}}, align 4413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const A &ra1{1, 2}; 4513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 4613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: getelementptr inbounds [3 x i32]* %{{.*}}, i{{32|64}} 0, i{{32|64}} 0 4713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store i32 1 4813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: getelementptr inbounds i32* %{{.*}}, i{{32|64}} 1 4913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store i32 2 5013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: getelementptr inbounds i32* %{{.*}}, i{{32|64}} 1 5113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store i32 3 5213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store [3 x i32]* %{{.*}}, [3 x i32]** %{{.*}}, align 5313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const int (&arrayRef)[] = {1, 2, 3}; 5413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 5513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: ret 5613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 5713dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 5813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl struct B { 5913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl B(); 6013dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl ~B(); 6113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl }; 6213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 6313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl void single_init_temp_cleanup() 6413dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl { 6513dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // Ensure lifetime extension. 6613dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 671b76fbc5b711efc03c1fe924db6756ec1590577aDavid Blaikie // CHECK: call %"struct.reference::B"* @_ZN9reference1BC1Ev 6813dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl // CHECK-NEXT: store %{{.*}}* %{{.*}}, %{{.*}}** % 6913dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl const B &rb{ B() }; 701b76fbc5b711efc03c1fe924db6756ec1590577aDavid Blaikie // CHECK: call %"struct.reference::B"* @_ZN9reference1BD1Ev 7113dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl } 7213dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl 7313dc8f98f6108dca8aaa9721567ed5a2d9911e0fSebastian Redl} 74