196e7813f08c6adf1d8657b0da86741b54e850fd7Rafael Espindola// RUN: not %clang_cc1 -triple x86_64-apple-darwin -verify -emit-llvm -o - %s | FileCheck %s
2c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonvoid t1() {
393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_Z2t1v
42f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman  // CHECK: [[REFLOAD:%.*]] = load i32** @a, align 8
52f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman  // CHECK: load i32* [[REFLOAD]], align 4
6c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson  extern int& a;
7c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson  int b = a;
8c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson}
9c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson
10c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonvoid t2(int& a) {
1193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_Z2t2Ri
122f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman  // CHECK: [[REFLOAD2:%.*]] = load i32** {{.*}}, align 8
132f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman  // CHECK: load i32* [[REFLOAD2]], align 4
14c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson  int b = a;
15c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson}
16c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson
17c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonint g;
18c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonint& gr = g;
1950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedmanint& grr = gr;
20c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlssonvoid t3() {
21c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson  int b = gr;
22c8667a866bfc1d9f807282f2de5644d6aa4e9423Anders Carlsson}
234bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
244bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson// Test reference binding.
254bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
2668ea78a093271301dc6396fc683644d8e13a90ddAnders Carlssonstruct C { int a; };
27e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlssonvoid f(const bool&);
284bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid f(const int&);
294bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid f(const _Complex int&);
304bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid f(const C&);
314bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
32482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders CarlssonC aggregate_return();
33482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson
34482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlssonbool& bool_reference_return();
35482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlssonint& int_reference_return();
36482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson_Complex int& complex_int_reference_return();
3768ea78a093271301dc6396fc683644d8e13a90ddAnders CarlssonC& aggregate_reference_return();
385df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman
39e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlssonvoid test_bool() {
40e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson  bool a = true;
41e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson  f(a);
42e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson
43e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson  f(true);
44482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson
45482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson  bool_reference_return() = true;
46e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson  a = bool_reference_return();
47e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson
48e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson  struct { const bool& b; } b = { true };
49e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson}
50e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson
514bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid test_scalar() {
524bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  int a = 10;
534bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  f(a);
54e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson
5538d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson  struct { int bitfield : 3; } s = { 3 };
569f75e6be16b9df33d58ec73955b3e3e3c71b2682Anders Carlsson  f(s.bitfield);
5738d068e8f13a119b89a3b8b0f79f35cab1ffd09aAnders Carlsson
58e04d1c77ae15a6e973e2fac7723f6c364884f58dAnders Carlsson  f(10);
595df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman
605df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman  __attribute((vector_size(16))) typedef int vec4;
615df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman  f((vec4){1,2,3,4}[0]);
62482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson
63482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson  int_reference_return() = 10;
64e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson  a = int_reference_return();
65e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson
66e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson  struct { const int& a; } agg = { 10 };
674bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson}
684bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
694bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid test_complex() {
704bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  _Complex int a = 10i;
714bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  f(a);
727cd3a648b3d3057805c022b9470bbdfe21d732a5Anders Carlsson
737cd3a648b3d3057805c022b9470bbdfe21d732a5Anders Carlsson  f(10i);
74482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson
75482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson  complex_int_reference_return() = 10i;
76e9f2f45fe9bf79bd4aea47fa1ad9204b68510fd9Anders Carlsson  a = complex_int_reference_return();
77e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson
78e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson  struct { const _Complex int &a; } agg = { 10i };
794bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson}
804bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
814bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlssonvoid test_aggregate() {
824bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  C c;
834bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson  f(c);
845df0d426026b3820b5f0b13a8d4e60e9373d8d9dEli Friedman
85482656833a71b63f67f3e93ee8c2d45b3d351ca8Anders Carlsson  f(aggregate_return());
8668ea78a093271301dc6396fc683644d8e13a90ddAnders Carlsson  aggregate_reference_return().a = 10;
87e70e8f7fef3efb3d526ee25b3a0e2a4bf67a04b6Anders Carlsson
88e70e8f7fef3efb3d526ee25b3a0e2a4bf67a04b6Anders Carlsson  c = aggregate_reference_return();
89e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson
90e78ccb4d609a113c3e06a9c4583e845e90b1a037Anders Carlsson  struct { const C& a; } agg = { C() };
914bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson}
924bbab92167713bf4f79c0b14dcc4e83d08ac4019Anders Carlsson
93d54b6ac2f4f6f0bd0076cbfa885b57277066f06cEli Friedmanint& reference_return() {
94d54b6ac2f4f6f0bd0076cbfa885b57277066f06cEli Friedman  return g;
95d54b6ac2f4f6f0bd0076cbfa885b57277066f06cEli Friedman}
964a18784dea763be146df68546e6dbf4233c33077Eli Friedman
974a18784dea763be146df68546e6dbf4233c33077Eli Friedmanint reference_decl() {
984a18784dea763be146df68546e6dbf4233c33077Eli Friedman  int& a = g;
994a18784dea763be146df68546e6dbf4233c33077Eli Friedman  const int& b = 1;
1004a18784dea763be146df68546e6dbf4233c33077Eli Friedman  return a+b;
1014a18784dea763be146df68546e6dbf4233c33077Eli Friedman}
102faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson
103faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlssonstruct A {
104faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson  int& b();
105faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson};
106faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson
107faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlssonvoid f(A* a) {
108faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson  int b = a->b();
109faf86648bfab7e0fa975e2b32c10fe1d8b461e8cAnders Carlsson}
11026bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson
11126bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson// PR5122
11226bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlssonvoid *foo = 0;
11326bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlssonvoid * const & kFoo = foo;
11426bc220377705292a0519a71d3ea3aef68fcfec6Anders Carlsson
115b3f744252a460c45e2e77053491285978286c384Anders Carlssonstruct D : C { D(); ~D(); };
116b3f744252a460c45e2e77053491285978286c384Anders Carlsson
117b3f744252a460c45e2e77053491285978286c384Anders Carlssonvoid h() {
118b3f744252a460c45e2e77053491285978286c384Anders Carlsson  // CHECK: call void @_ZN1DD1Ev
119b3f744252a460c45e2e77053491285978286c384Anders Carlsson  const C& c = D();
120b3f744252a460c45e2e77053491285978286c384Anders Carlsson}
121b3f744252a460c45e2e77053491285978286c384Anders Carlsson
122e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlssonnamespace T {
123e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson  struct A {
124e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    A();
125e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    ~A();
126e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson  };
127e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson
128e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson  struct B {
129e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    B();
130e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    ~B();
131e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    A f();
132e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson  };
133e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson
134e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson  void f() {
135e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    // CHECK: call void @_ZN1T1BC1Ev
136e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    // CHECK: call void @_ZN1T1B1fEv
137e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    // CHECK: call void @_ZN1T1BD1Ev
138e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    const A& a = B().f();
139e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    // CHECK: call void @_ZN1T1fEv
140e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    f();
141e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson    // CHECK: call void @_ZN1T1AD1Ev
142e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson  }
143e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson}
144e1b7ea1b025c54b082f838ede2f483e657481fdcAnders Carlsson
14586aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlsson// PR5227.
14686aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlssonnamespace PR5227 {
14786aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlssonvoid f(int &a) {
14886aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlsson  (a = 10) = 20;
14986aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlsson}
15086aa0cdfd5aa7b099efbcd612a014d1b5f0ff799Anders Carlsson}
1515d484e8cf710207010720589d89602233de61d01Sebastian Redl
1525d484e8cf710207010720589d89602233de61d01Sebastian Redl// PR5590
1535d484e8cf710207010720589d89602233de61d01Sebastian Redlstruct s0;
1545d484e8cf710207010720589d89602233de61d01Sebastian Redlstruct s1 { struct s0 &s0; };
1555d484e8cf710207010720589d89602233de61d01Sebastian Redlvoid f0(s1 a) { s1 b = a; }
15633fd1fc1814a5573c972840d49317989e20deaceDouglas Gregor
15733fd1fc1814a5573c972840d49317989e20deaceDouglas Gregor// PR6024
15833fd1fc1814a5573c972840d49317989e20deaceDouglas Gregor// CHECK: @_Z2f2v()
15935b21b884e5c3447a52a74d7ffaba966b07ac81fChris Lattner// CHECK: alloca i32,
16035b21b884e5c3447a52a74d7ffaba966b07ac81fChris Lattner// CHECK-NEXT: store
16135b21b884e5c3447a52a74d7ffaba966b07ac81fChris Lattner// CHECK-NEXT: ret
16233fd1fc1814a5573c972840d49317989e20deaceDouglas Gregorconst int &f2() { return 0; }
163761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth
164761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth// Don't constant fold const reference parameters with default arguments to
165761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth// their default arguments.
166761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruthnamespace N1 {
167761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth  const int foo = 1;
168761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth  // CHECK: @_ZN2N14test
169045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson  void test(const int& arg = foo) {
170761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth    // Ensure this array is on the stack where we can set values instead of
171761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth    // being a global constant.
172761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth    // CHECK: %args_array = alloca
173761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth    const int* const args_array[] = { &arg };
174761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth  }
175761c94e3bffef0fcb8b4bbf202fd5ee73db134f3Chandler Carruth}
17660dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
17760dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor// Bind to subobjects while extending the life of the complete object.
17860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregornamespace N2 {
17960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  class X {
18060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  public:
18160dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    X(const X&);
18260dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    X &operator=(const X&);
18360dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    ~X();
18460dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  };
18560dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
18660dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  struct P {
18760dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    X first;
18860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  };
18960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
19060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  P getP();
19160dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
19293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN2N21fEi
19360dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  // CHECK: call void @_ZN2N24getPEv
19460dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  // CHECK: getelementptr inbounds
19560dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  // CHECK: store i32 17
19660dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  // CHECK: call void @_ZN2N21PD1Ev
19760dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  void f(int i) {
19860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    const X& xr = getP().first;
19960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    i = 17;
20060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  }
20160dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
20260dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  struct SpaceWaster {
20360dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    int i, j;
20460dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  };
20560dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
20660dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  struct ReallyHasX {
20760dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    X x;
20860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  };
20960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
21060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  struct HasX : ReallyHasX { };
21160dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
21260dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  struct HasXContainer {
21360dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    HasX has;
21460dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  };
21560dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
21660dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  struct Y : SpaceWaster, HasXContainer { };
21760dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  struct Z : SpaceWaster, Y { };
21860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
21960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  Z getZ();
22060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor
22193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN2N21gEi
22260dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  // CHECK: call void @_ZN2N24getZEv
2232d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor  // CHECK: {{getelementptr inbounds.*i32 0, i32 0}}
2242d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor  // CHECK: {{getelementptr inbounds.*i32 0, i32 0}}
2252d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor  // CHECK: store i32 19
2262d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor  // CHECK: call void @_ZN2N21ZD1Ev
2272d6b0e94db30c0e2754d270753c6f75478e451bfDouglas Gregor  // CHECK: ret void
22860dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  void g(int i) {
22960dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    const X &xr = getZ().has.x;
23060dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor    i = 19;
23160dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor  }
23260dcb8432cff2455488b9226b9cc65b80356146eDouglas Gregor}
233045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson
234045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonnamespace N3 {
235045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson
236045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson// PR7326
237045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson
238045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonstruct A {
239045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson  explicit A(int);
240045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson  ~A();
241045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson};
242045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson
24393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define internal void @__cxx_global_var_init
2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK: call void @_ZN2N31AC1Ei(%"struct.N3::A"* @_ZGRN2N35sA123E_, i32 123)
245045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson// CHECK: call i32 @__cxa_atexit
246045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson// CHECK: ret void
247045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonconst A &sA123 = A(123);
248045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson}
249045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson
250045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonnamespace N4 {
251045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson
252045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonstruct A {
253045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson  A();
254045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson  ~A();
255045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson};
256045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson
257045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlssonvoid f() {
25893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN2N41fEv
2596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: call void @_ZN2N41AC1Ev(%"struct.N4::A"* @_ZGRZN2N41fEvE2ar_)
260045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson  // CHECK: call i32 @__cxa_atexit
261045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson  // CHECK: ret void
262045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson  static const A& ar = A();
263045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson
264045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson}
265045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson}
266045a6d84a0fa672eb5d914be1bb8f3baa226beb3Anders Carlsson
267545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman// PR9494
268545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedmannamespace N5 {
269545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedmanstruct AnyS { bool b; };
270545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedmanvoid f(const bool&);
271545aa7a0f57d2bb2fc0eef83daa499300273d983Eli FriedmanAnyS g();
272545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedmanvoid h() {
273545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman  // CHECK: call i8 @_ZN2N51gEv()
274545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman  // CHECK: call void @_ZN2N51fERKb(i8*
275545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman  f(g().b);
276545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman}
277545aa7a0f57d2bb2fc0eef83daa499300273d983Eli Friedman}
27803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
27903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor// PR9565
28003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregornamespace PR9565 {
28103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  struct a { int a : 10, b : 10; };
28293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6PR95651fEv()
28303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  void f() {
28403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK: call void @llvm.memcpy
28503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    a x = { 0, 0 };
28672d2dab6058467036df73a5f668036a519043e5bChandler Carruth    // CHECK: [[WITH_SEVENTEEN:%[.a-zA-Z0-9]+]] = or i32 [[WITHOUT_SEVENTEEN:%[.a-zA-Z0-9]+]], 17
28772d2dab6058467036df73a5f668036a519043e5bChandler Carruth    // CHECK: store i32 [[WITH_SEVENTEEN]], i32* [[XA:%[.a-zA-Z0-9]+]]
28803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    x.a = 17;
28903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK-NEXT: bitcast
29072d2dab6058467036df73a5f668036a519043e5bChandler Carruth    // CHECK-NEXT: load
29103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK-NEXT: shl
29203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK-NEXT: ashr
29303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK-NEXT: store i32
29403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK-NEXT: store i32*
29503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    const int &y = x.a;
29603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK-NEXT: bitcast
29703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK-NEXT: load
29803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK-NEXT: and
29972d2dab6058467036df73a5f668036a519043e5bChandler Carruth    // CHECK-NEXT: or i32 {{.*}}, 19456
30003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK-NEXT: store i32
30103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    x.b = 19;
30203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    // CHECK-NEXT: ret void
30303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  }
30403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor}
3052f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman
3062f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedmannamespace N6 {
3072f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman  extern struct x {char& x;}y;
3082f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman  int a() { return y.x; }
30993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define i32 @_ZN2N61aEv
3102f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman  // CHECK: [[REFLOAD3:%.*]] = load i8** getelementptr inbounds (%"struct.N6::x"* @_ZN2N61yE, i32 0, i32 0), align 8
31132380594b6774af451cf34af79b086d6f920d052Eli Friedman  // CHECK: load i8* [[REFLOAD3]], align 1
3122f77b3d57031ded0de2b7b977fb63b4660f82624Eli Friedman}
313