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