14e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -std=c++11 | FileCheck %s
2d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith
3d6b698739ab157348acafcec5b06a05d3d35377dRichard Smithnamespace PR16263 {
4d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  const unsigned int n = 1234;
5d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  extern const int &r = (const int&)n;
66bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: @_ZGRN7PR162631rE_ = private constant i32 1234,
76bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: @_ZN7PR162631rE = constant i32* @_ZGRN7PR162631rE_,
8d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith
9d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  extern const int &s = reinterpret_cast<const int&>(n);
10d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  // CHECK: @_ZN7PR16263L1nE = internal constant i32 1234, align 4
11d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  // CHECK: @_ZN7PR162631sE = constant i32* @_ZN7PR16263L1nE, align 8
12d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith
13d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  struct A { int n; };
14d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  struct B { int n; };
15d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  struct C : A, B {};
16d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  extern const A &&a = (A&&)(A&&)(C&&)(C{});
176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: @_ZGRN7PR162631aE_ = private global {{.*}} zeroinitializer,
186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: @_ZN7PR162631aE = constant {{.*}} bitcast ({{.*}}* @_ZGRN7PR162631aE_ to
19d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith
20d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  extern const int &&t = ((B&&)C{}).n;
216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: @_ZGRN7PR162631tE_ = private global {{.*}} zeroinitializer,
226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: @_ZN7PR162631tE = constant i32* {{.*}}* @_ZGRN7PR162631tE_ {{.*}} 4
23d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith
24d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  struct D { double d; C c; };
25d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith  extern const int &&u = (123, static_cast<B&&>(0, ((D&&)D{}).*&D::c).n);
266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: @_ZGRN7PR162631uE_ = private global {{.*}} zeroinitializer
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: @_ZN7PR162631uE = constant i32* {{.*}} @_ZGRN7PR162631uE_ {{.*}} 12
28d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith}
29d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith
30ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace PR20227 {
31ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct A { ~A(); };
32ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct B { virtual ~B(); };
33ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct C : B {};
34ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
35ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  A &&a = dynamic_cast<A&&>(A{});
36ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: @_ZGRN7PR202271aE_ = private global
37ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
38ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  B &&b = dynamic_cast<C&&>(dynamic_cast<B&&>(C{}));
39ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: @_ZGRN7PR202271bE_ = private global
40ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
41ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  B &&c = static_cast<C&&>(static_cast<B&&>(C{}));
42ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: @_ZGRN7PR202271cE_ = private global
43ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
44ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
457a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlssonstruct A {
467a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson  A();
477a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson  ~A();
487a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson  void f();
497a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson};
507a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson
51ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlssonvoid f1() {
52fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1AC1Ev
53fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1AD1Ev
54ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson  (void)A();
55fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson
56fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1AC1Ev
57fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1AD1Ev
587a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson  A().f();
597a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson}
60ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson
616f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson// Function calls
62ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlssonstruct B {
63ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson  B();
64ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson  ~B();
65ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson};
66ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson
67ec74c5929c78bd1670619022f6cfd471becf65aaAnders CarlssonB g();
68ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson
69ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlssonvoid f2() {
70fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK-NOT: call void @_ZN1BC1Ev
71fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1BD1Ev
72ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson  (void)g();
73ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson}
74ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson
756f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson// Member function calls
766f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlssonstruct C {
776f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson  C();
786f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson  ~C();
796f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson
806f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson  C f();
816f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson};
826f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson
836f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlssonvoid f3() {
84fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1CC1Ev
85fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1CD1Ev
86fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1CD1Ev
876f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson  C().f();
886f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson}
896f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson
90a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson// Function call operator
91a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlssonstruct D {
92a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson  D();
93a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson  ~D();
94a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson
95a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson  D operator()();
96a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson};
97a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson
98a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlssonvoid f4() {
993114af3f7911befa8f05a9a76f7d9e380538075bBenjamin Kramer  // CHECK: call void @_ZN1DC1Ev
1003114af3f7911befa8f05a9a76f7d9e380538075bBenjamin Kramer  // CHECK: call void @_ZN1DD1Ev
1013114af3f7911befa8f05a9a76f7d9e380538075bBenjamin Kramer  // CHECK: call void @_ZN1DD1Ev
102a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson  D()();
103a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson}
1046f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson
1052d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson// Overloaded operators
1062d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlssonstruct E {
1072d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  E();
1082d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  ~E();
1092d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  E operator+(const E&);
1102d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  E operator!();
1112d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson};
1122d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson
1132d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlssonvoid f5() {
114fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1EC1Ev
115fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1EC1Ev
116fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1ED1Ev
117fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1ED1Ev
118fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1ED1Ev
1192d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  E() + E();
120fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson
121fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1EC1Ev
122fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1ED1Ev
123fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1ED1Ev
1242d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  !E();
1252d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson}
1266f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson
127283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlssonstruct F {
128283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson  F();
129283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson  ~F();
130283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson  F& f();
131283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson};
132283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson
133283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlssonvoid f6() {
134fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1FC1Ev
135fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1FD1Ev
136283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson  F().f();
137283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson}
138283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson
1394fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlssonstruct G {
1404fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  G();
1414fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  G(A);
1424fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  ~G();
1434fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  operator A();
1444fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson};
1454fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson
1464fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlssonvoid a(const A&);
1474fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson
1484fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlssonvoid f7() {
1494fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1AC1Ev
1504fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_Z1aRK1A
1514fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1AD1Ev
1524fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  a(A());
1534fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson
1544fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1GC1Ev
1554fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1Gcv1AEv
1564fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_Z1aRK1A
1574fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1AD1Ev
1584fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1GD1Ev
1594fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  a(G());
1604fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson}
1611faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1621faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonnamespace PR5077 {
1631faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1641faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonstruct A {
1651faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  A();
1661faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  ~A();
1671faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  int f();
1681faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson};
1691faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1701faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonvoid f();
1711faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonint g(const A&);
1721faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1731faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonstruct B {
1741faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  int a1;
1751faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  int a2;
1761faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  B();
1775e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  ~B();
1781faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson};
1791faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1801faf67478c6d423880726a327c737db13b8d9f0bAnders CarlssonB::B()
1811faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call void @_ZN6PR50771AC1Ev
1821faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call i32 @_ZN6PR50771A1fEv
1831faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call void @_ZN6PR50771AD1Ev
1841faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  : a1(A().f())
1851faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call void @_ZN6PR50771AC1Ev
1861faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call i32 @_ZN6PR50771gERKNS_1AE
1871faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call void @_ZN6PR50771AD1Ev
1881faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  , a2(g(A()))
1891faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson{
1901faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call void @_ZN6PR50771fEv
1911faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  f();
1921faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson}
1931faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1945e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlssonstruct C {
1955e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  C();
1965e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson
1975e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  const B& b;
1985e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson};
1995e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson
2005e1b91875c275f0ec50d3680afbac150d684fdbaAnders CarlssonC::C()
2015e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  // CHECK: call void @_ZN6PR50771BC1Ev
2025e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  : b(B()) {
2035e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  // CHECK: call void @_ZN6PR50771fEv
2045e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  f();
2055e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson
2065e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  // CHECK: call void @_ZN6PR50771BD1Ev
2075e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson}
20803d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson}
20903d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson
21003d8ed439f55b692634f9c71721ecfabbe347c4dAnders CarlssonA f8() {
21103d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_ZN1AC1Ev
21203d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK-NOT: call void @_ZN1AD1Ev
21303d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  return A();
21403d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: ret void
21503d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson}
2165e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson
21703d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlssonstruct H {
21803d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  H();
21903d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  ~H();
22003d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  H(const H&);
22103d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson};
2225e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson
22303d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlssonvoid f9(H h) {
22403d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_ZN1HC1Ev
22503d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_Z2f91H
22603d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_ZN1HD1Ev
22703d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  f9(H());
22803d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson
22903d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_ZN1HC1ERKS_
23003d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_Z2f91H
23103d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_ZN1HD1Ev
23203d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  f9(h);
2331faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson}
2344b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson
2354b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlssonvoid f10(const H&);
2364b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson
2374b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlssonvoid f11(H h) {
2384b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK: call void @_ZN1HC1Ev
2394b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK: call void @_Z3f10RK1H
2404b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK: call void @_ZN1HD1Ev
2414b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  f10(H());
2424b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson
2434b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK: call void @_Z3f10RK1H
2444b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK-NOT: call void @_ZN1HD1Ev
2454b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK: ret void
2464b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  f10(h);
247a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar}
24818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor
24918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// PR5808
25018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorstruct I {
25118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  I(const char *);
25218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  ~I();
25318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor};
25418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor
25518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// CHECK: _Z3f12v
25618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorI f12() {
25718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  // CHECK: call void @_ZN1IC1EPKc
25818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  // CHECK-NOT: call void @_ZN1ID1Ev
25918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  // CHECK: ret void
26018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  return "Hello";
26118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor}
26265552c424750aaa58533ca385a90b77c033cc635Douglas Gregor
26365552c424750aaa58533ca385a90b77c033cc635Douglas Gregor// PR5867
26465552c424750aaa58533ca385a90b77c033cc635Douglas Gregornamespace PR5867 {
26565552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  struct S {
26665552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    S();
26765552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    S(const S &);
26865552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    ~S();
26965552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  };
27065552c424750aaa58533ca385a90b77c033cc635Douglas Gregor
27165552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  void f(S, int);
27293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6PR58671gEv
27365552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  void g() {
27465552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    // CHECK: call void @_ZN6PR58671SC1Ev
27565552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi
27665552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    // CHECK-NEXT: call void @_ZN6PR58671SD1Ev
27765552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    // CHECK-NEXT: ret void
27865552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    (f)(S(), 0);
27965552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  }
2805132655e4296b780672e9a96b46a740135073534Douglas Gregor
28193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6PR58672g2IiEEvT_
2825132655e4296b780672e9a96b46a740135073534Douglas Gregor  template<typename T>
2835132655e4296b780672e9a96b46a740135073534Douglas Gregor  void g2(T) {
2845132655e4296b780672e9a96b46a740135073534Douglas Gregor    // CHECK: call void @_ZN6PR58671SC1Ev
2855132655e4296b780672e9a96b46a740135073534Douglas Gregor    // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi
2865132655e4296b780672e9a96b46a740135073534Douglas Gregor    // CHECK-NEXT: call void @_ZN6PR58671SD1Ev
2875132655e4296b780672e9a96b46a740135073534Douglas Gregor    // CHECK-NEXT: ret void
2885132655e4296b780672e9a96b46a740135073534Douglas Gregor    (f)(S(), 0);
2895132655e4296b780672e9a96b46a740135073534Douglas Gregor  }
2905132655e4296b780672e9a96b46a740135073534Douglas Gregor
2915132655e4296b780672e9a96b46a740135073534Douglas Gregor  void h() {
2925132655e4296b780672e9a96b46a740135073534Douglas Gregor    g2(17);
2935132655e4296b780672e9a96b46a740135073534Douglas Gregor  }
29465552c424750aaa58533ca385a90b77c033cc635Douglas Gregor}
2952e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson
2962e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson// PR6199
2972e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlssonnamespace PR6199 {
2982e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson  struct A { ~A(); };
2992e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson
3002e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson  struct B { operator A(); };
3012e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson
30293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6PR61992f2IiEENS_1AET_
3032e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson  template<typename T> A f2(T) {
3042e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson    B b;
3052e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson    // CHECK: call void @_ZN6PR61991BcvNS_1AEEv
3062e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson    // CHECK-NEXT: ret void
3072e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson    return b;
3082e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson  }
3092e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson
3102e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson  template A f2<int>(int);
3112e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson
3122e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson}
3130dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson
3140dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonnamespace T12 {
3150dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson
3160dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonstruct A {
3170dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  A();
3180dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  ~A();
3190dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  int f();
3200dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson};
3210dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson
3220dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonint& f(int);
3230dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson
32493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN3T121gEv
3250dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonvoid g() {
3260dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  // CHECK: call void @_ZN3T121AC1Ev
3270dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  // CHECK-NEXT: call i32 @_ZN3T121A1fEv(
328ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK-NEXT: call nonnull i32* @_ZN3T121fEi(
3290dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  // CHECK-NEXT: call void @_ZN3T121AD1Ev(
3300dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  int& i = f(A().f());
3310dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson}
3320dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson
3330dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson}
3348682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola
3358682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindolanamespace PR6648 {
3368682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  struct B {
3378682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola    ~B();
3388682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  };
3398682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  B foo;
3408682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  struct D;
3418682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  D& zed(B);
3428682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  void foobar() {
343ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK: call nonnull %"struct.PR6648::D"* @_ZN6PR66483zedENS_1BE
3448682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola    zed(foo);
3458682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  }
3468682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola}
347b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor
348b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregornamespace UserConvertToValue {
349b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  struct X {
350b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    X(int);
351b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    X(const X&);
352b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    ~X();
353b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  };
354b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor
355b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  void f(X);
356b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor
357b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  // CHECK: void @_ZN18UserConvertToValue1gEv()
358b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  void g() {
359b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    // CHECK: call void @_ZN18UserConvertToValue1XC1Ei
360b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    // CHECK: call void @_ZN18UserConvertToValue1fENS_1XE
361b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    // CHECK: call void @_ZN18UserConvertToValue1XD1Ev
3629994eeda99b08f52bb0312aaddae00f9ae6c7debDouglas Gregor    // CHECK: ret void
363b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    f(1);
364b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  }
365b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor}
366ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor
367ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregornamespace PR7556 {
368ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  struct A { ~A(); };
369ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  struct B { int i; ~B(); };
370ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  struct C { int C::*pm; ~C(); };
37193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6PR75563fooEv()
372ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  void foo() {
373ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK: call void @_ZN6PR75561AD1Ev
374ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    A();
375ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK: call void @llvm.memset.p0i8.i64
376ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK: call void @_ZN6PR75561BD1Ev
377ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    B();
378ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
379ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK: call void @_ZN6PR75561CD1Ev
380ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    C();
381ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK-NEXT: ret void
382ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  }
383ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor}
384558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
385558d2abc7f9fd6801cc7677200992313ae90b5d8John McCallnamespace Elision {
386fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  struct A {
387fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    A(); A(const A &); ~A();
388fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    void *p;
389fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    void foo() const;
390fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  };
391558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
392558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  void foo();
393558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  A fooA();
39419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  void takeA(A a);
395558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
39693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN7Elision5test0Ev()
397558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  void test0() {
398558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      [[I:%.*]] = alloca [[A:%.*]], align 8
399465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK-NEXT: [[J:%.*]] = alloca [[A]], align 8
400465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK-NEXT: [[T0:%.*]] = alloca [[A]], align 8
401465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK-NEXT: [[K:%.*]] = alloca [[A]], align 8
402465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK-NEXT: [[T1:%.*]] = alloca [[A]], align 8
403558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
404558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision3fooEv()
405558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[I]])
406558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A i = (foo(), A());
407558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
408558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision4fooAEv([[A]]* sret [[T0]])
409558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[J]])
410558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T0]])
411558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A j = (fooA(), A());
412558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
413558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[T1]])
414558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision4fooAEv([[A]]* sret [[K]])
415558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T1]])
416558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A k = (A(), fooA());
417558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
418558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[K]])
419558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[J]])
420558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[I]])
421558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
422558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
423558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
42493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN7Elision5test1EbNS_1AE(
425558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  void test1(bool c, A x) {
426465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK:      [[I:%.*]] = alloca [[A]], align 8
427465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK-NEXT: [[J:%.*]] = alloca [[A]], align 8
428558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
429558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1Ev([[A]]* [[I]])
430ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK:      call void @_ZN7Elision1AC1ERKS0_([[A]]* [[I]], [[A]]* nonnull [[X:%.*]])
431558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A i = (c ? A() : x);
432558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
433ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK:      call void @_ZN7Elision1AC1ERKS0_([[A]]* [[J]], [[A]]* nonnull [[X]])
434558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1Ev([[A]]* [[J]])
435558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A j = (c ? x : A());
436558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
437558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AD1Ev([[A]]* [[J]])
438558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[I]])
439558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
440558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
4415e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling  // CHECK: define void @_ZN7Elision5test2Ev([[A]]* noalias sret
442558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  A test2() {
443558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision3fooEv()
444558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[RET:%.*]])
445558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: ret void
446558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    return (foo(), A());
447558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
448558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
4495e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling  // CHECK: define void @_ZN7Elision5test3EiNS_1AE([[A]]* noalias sret
450558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  A test3(int v, A x) {
451558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    if (v < 5)
452558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1Ev([[A]]* [[RET:%.*]])
453ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK:      call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET]], [[A]]* nonnull [[X:%.*]])
454558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall      return (v < 0 ? A() : x);
455558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    else
456ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK:      call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET]], [[A]]* nonnull [[X]])
457558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1Ev([[A]]* [[RET]])
458558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall      return (v > 10 ? x : A());
459558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
460558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      ret void
461558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
462558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
46393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN7Elision5test4Ev()
464558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  void test4() {
465558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      [[X:%.*]] = alloca [[A]], align 8
466558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: [[XS:%.*]] = alloca [2 x [[A]]], align 16
467558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
468558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[X]])
469558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A x;
470558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
471bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[XS0:%.*]] = getelementptr inbounds [2 x [[A]]]* [[XS]], i64 0, i64 0
472558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[XS0]])
473bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[XS1:%.*]] = getelementptr inbounds [[A]]* [[XS0]], i64 1
474ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[XS1]], [[A]]* nonnull [[X]])
475558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A xs[] = { A(), x };
476558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
477bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [2 x [[A]]]* [[XS]], i32 0, i32 0
478bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 2
479558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: br label
480bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK:      [[AFTER:%.*]] = phi [[A]]*
481bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]]* [[AFTER]], i64 -1
482bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[CUR]])
483bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[CUR]], [[BEGIN]]
484bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: br i1 [[T0]],
485558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
486558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AD1Ev([[A]]* [[X]])
487558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
48819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
48919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  // rdar://problem/8433352
4905e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling  // CHECK: define void @_ZN7Elision5test5Ev([[A]]* noalias sret
49119e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  struct B { A a; B(); };
49219e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  A test5() {
49319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK:      [[AT0:%.*]] = alloca [[A]], align 8
49419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[BT0:%.*]] = alloca [[B:%.*]], align 8
49519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[X:%.*]] = alloca [[A]], align 8
49619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[BT1:%.*]] = alloca [[B]], align 8
49719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[BT2:%.*]] = alloca [[B]], align 8
49819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
49919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK:      call void @_ZN7Elision1BC1Ev([[B]]* [[BT0]])
50019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT0]], i32 0, i32 0
501ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[AT0]], [[A]]* nonnull [[AM]])
50219e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision5takeAENS_1AE([[A]]* [[AT0]])
50319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[AT0]])
50419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT0]])
50519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    takeA(B().a);
50619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
50719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1BC1Ev([[B]]* [[BT1]])
50819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT1]], i32 0, i32 0
509ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[X]], [[A]]* nonnull [[AM]])
51019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT1]])
51119e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    A x = B().a;
51219e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
51319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1BC1Ev([[B]]* [[BT2]])
51419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT2]], i32 0, i32 0
515ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET:%.*]], [[A]]* nonnull [[AM]])
51619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT2]])
51719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    return B().a;
51819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
51919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK:      call void @_ZN7Elision1AD1Ev([[A]]* [[X]])
52019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  }
521fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall
522fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  // Reduced from webkit.
523fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  // CHECK: define void @_ZN7Elision5test6EPKNS_1CE([[C:%.*]]*
524fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  struct C { operator A() const; };
525fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  void test6(const C *x) {
526fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK:      [[T0:%.*]] = alloca [[A]], align 8
527fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK:      [[X:%.*]] = load [[C]]** {{%.*}}, align 8
528fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK-NEXT: call void @_ZNK7Elision1CcvNS_1AEEv([[A]]* sret [[T0]], [[C]]* [[X]])
529fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK-NEXT: call void @_ZNK7Elision1A3fooEv([[A]]* [[T0]])
530fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T0]])
531fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK-NEXT: ret void
532fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    A(*x).foo();
533fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  }
534558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall}
53574fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall
53674fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCallnamespace PR8623 {
53774fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall  struct A { A(int); ~A(); };
53874fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall
53993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6PR86233fooEb(
54074fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall  void foo(bool b) {
54174fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      [[TMP:%.*]] = alloca [[A:%.*]], align 1
54274fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: [[LCONS:%.*]] = alloca i1
54374fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: [[RCONS:%.*]] = alloca i1
5444bbcbda302cba8b1b0d88c20d735d09b483bd005John McCall    // CHECK:      store i1 false, i1* [[LCONS]]
54574fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: store i1 false, i1* [[RCONS]]
5464bbcbda302cba8b1b0d88c20d735d09b483bd005John McCall    // CHECK-NEXT: br i1
54774fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      call void @_ZN6PR86231AC1Ei([[A]]* [[TMP]], i32 2)
54874fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: store i1 true, i1* [[LCONS]]
54974fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br label
55074fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      call void @_ZN6PR86231AC1Ei([[A]]* [[TMP]], i32 3)
55174fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: store i1 true, i1* [[RCONS]]
55274fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br label
55374fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      load i1* [[RCONS]]
55474fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br i1
55574fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      call void @_ZN6PR86231AD1Ev([[A]]* [[TMP]])
55674fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br label
55774fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      load i1* [[LCONS]]
55874fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br i1
55974fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      call void @_ZN6PR86231AD1Ev([[A]]* [[TMP]])
56074fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br label
56174fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      ret void
56274fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    b ? A(2) : A(3);
56374fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall  }
56474fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall}
565bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne
566bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbournenamespace PR11365 {
567bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne  struct A { A(); ~A(); };
568bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne
56993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN7PR113653fooEv(
570bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne  void foo() {
571bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK: [[BEGIN:%.*]] = getelementptr inbounds [3 x [[A:%.*]]]* {{.*}}, i32 0, i32 0
572bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 3
573bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: br label
574bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne
575bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK: [[PHI:%.*]] = phi
576bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: [[ELEM:%.*]] = getelementptr inbounds [[A]]* [[PHI]], i64 -1
577bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: call void @_ZN7PR113651AD1Ev([[A]]* [[ELEM]])
578bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: icmp eq [[A]]* [[ELEM]], [[BEGIN]]
579bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: br i1
580bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    (void) (A [3]) {};
581bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne  }
582bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne}
583044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith
584044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smithnamespace AssignmentOp {
585044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  struct A { ~A(); };
586044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  struct B { A operator=(const B&); };
587044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  struct C : B { B b1, b2; };
58893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN12AssignmentOp1fE
589044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  void f(C &c1, const C &c2) {
590044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith    // CHECK: call {{.*}} @_ZN12AssignmentOp1CaSERKS0_(
591044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith    c1 = c2;
592044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  }
593044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith
594044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // Ensure that each 'A' temporary is destroyed before the next subobject is
595044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // copied.
596044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: define {{.*}} @_ZN12AssignmentOp1CaSERKS0_(
597044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
598044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
599044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
600044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
601044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
602044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
603044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith}
6044e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
6054e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smithnamespace BindToSubobject {
6064e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  struct A {
6074e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith    A();
6084e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith    ~A();
6094e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith    int a;
6104e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  };
6114e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
6124e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  void f(), g();
6134e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
6146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1aE_)
6156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1aE_ to i8*), i8* @__dso_handle)
6166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: store i32* getelementptr inbounds ({{.*}} @_ZGRN15BindToSubobject1aE_, i32 0, i32 0), i32** @_ZN15BindToSubobject1aE, align 8
6174e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  int &&a = A().a;
6184e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
6194e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call void @_ZN15BindToSubobject1fEv()
6206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1bE_)
6216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1bE_ to i8*), i8* @__dso_handle)
6226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: store i32* getelementptr inbounds ({{.*}} @_ZGRN15BindToSubobject1bE_, i32 0, i32 0), i32** @_ZN15BindToSubobject1bE, align 8
6234e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  int &&b = (f(), A().a);
6244e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
6254e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  int A::*h();
6264e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
6274e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call void @_ZN15BindToSubobject1fEv()
6284e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call void @_ZN15BindToSubobject1gEv()
6296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1cE_)
6306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1cE_ to i8*), i8* @__dso_handle)
6314e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call {{.*}} @_ZN15BindToSubobject1hE
6324e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: getelementptr
6334e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: store i32* {{.*}}, i32** @_ZN15BindToSubobject1cE, align 8
6344e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  int &&c = (f(), (g(), A().*h()));
6354e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
6364e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  struct B {
6374e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith    int padding;
6384e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith    A a;
6394e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  };
6404e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
6416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: call void @_ZN15BindToSubobject1BC1Ev({{.*}} @_ZGRN15BindToSubobject1dE_)
6426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1BD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1dE_ to i8*), i8* @__dso_handle)
6434e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call {{.*}} @_ZN15BindToSubobject1hE
6444e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: getelementptr {{.*}} getelementptr
6454e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: store i32* {{.*}}, i32** @_ZN15BindToSubobject1dE, align 8
6464e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  int &&d = (B().a).*h();
6474e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith}
648d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith
649d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smithnamespace Bitfield {
650d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith  struct S { int a : 5; ~S(); };
651d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith
652d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith  // Do not lifetime extend the S() temporary here.
65375ddd1465edeb0ced330263b3d6b30f706a4d33dRichard Smith  // CHECK: alloca
65475ddd1465edeb0ced330263b3d6b30f706a4d33dRichard Smith  // CHECK: call {{.*}}memset
6556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: store i32 {{.*}}, i32* @_ZGRN8Bitfield1rE_
656d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith  // CHECK: call void @_ZN8Bitfield1SD1
6576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: store i32* @_ZGRN8Bitfield1rE_, i32** @_ZN8Bitfield1rE, align 8
658d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith  int &&r = S().a;
659d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith}
66034f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith
66134f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smithnamespace Vector {
66234f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  typedef __attribute__((vector_size(16))) int vi4a;
66334f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  typedef __attribute__((ext_vector_type(4))) int vi4b;
66434f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  struct S {
66534f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith    vi4a v;
66634f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith    vi4b w;
66734f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  };
66834f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  // CHECK: alloca
66934f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  // CHECK: extractelement
6706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: store i32 {{.*}}, i32* @_ZGRN6Vector1rE_
6716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: store i32* @_ZGRN6Vector1rE_, i32** @_ZN6Vector1rE,
67234f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  int &&r = S().v[1];
67334f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith
67434f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  // CHECK: alloca
67534f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  // CHECK: extractelement
6766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: store i32 {{.*}}, i32* @_ZGRN6Vector1sE_
6776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: store i32* @_ZGRN6Vector1sE_, i32** @_ZN6Vector1sE,
67834f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  int &&s = S().w[1];
67934f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  // FIXME PR16204: The following code leads to an assertion in Sema.
68034f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith  //int &&s = S().w.y;
68134f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith}
6828a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
6838a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smithnamespace ImplicitTemporaryCleanup {
6848a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  struct A { A(int); ~A(); };
6858a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  void g();
6868a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
68793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN24ImplicitTemporaryCleanup1fEv(
6888a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  void f() {
6898a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1AC1Ei(
6908a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    A &&a = 0;
6918a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
6928a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1gEv(
6938a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    g();
6948a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
6958a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1AD1Ev(
6968a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  }
6978a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith}
6988a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
6998a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smithnamespace MultipleExtension {
7008a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  struct A { A(); ~A(); };
7018a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  struct B { B(); ~B(); };
7028a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  struct C { C(); ~C(); };
7038a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  struct D { D(); ~D(); int n; C c; };
7048a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  struct E { const A &a; B b; const C &c; ~E(); };
7058a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7068a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  E &&e1 = { A(), B(), D().c };
7078a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7088a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call void @_ZN17MultipleExtension1AC1Ev({{.*}} @[[TEMPA:_ZGRN17MultipleExtension2e1E.*]])
7098a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1AD1Ev {{.*}} @[[TEMPA]]
7108a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: store {{.*}} @[[TEMPA]], {{.*}} getelementptr inbounds ({{.*}} @[[TEMPE:_ZGRN17MultipleExtension2e1E.*]], i32 0, i32 0)
7118a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7128a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call void @_ZN17MultipleExtension1BC1Ev({{.*}} getelementptr inbounds ({{.*}} @[[TEMPE]], i32 0, i32 1))
7138a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7148a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call void @_ZN17MultipleExtension1DC1Ev({{.*}} @[[TEMPD:_ZGRN17MultipleExtension2e1E.*]])
7158a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1DD1Ev {{.*}} @[[TEMPD]]
7168a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: store {{.*}} @[[TEMPD]], {{.*}} getelementptr inbounds ({{.*}} @[[TEMPE]], i32 0, i32 2)
7178a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1ED1Ev {{.*}} @[[TEMPE]]
7188a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: store {{.*}} @[[TEMPE]], %"struct.MultipleExtension::E"** @_ZN17MultipleExtension2e1E, align 8
7198a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7208a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  E e2 = { A(), B(), D().c };
7218a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7228a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call void @_ZN17MultipleExtension1AC1Ev({{.*}} @[[TEMPA:_ZGRN17MultipleExtension2e2E.*]])
7238a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1AD1Ev {{.*}} @[[TEMPA]]
7248a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: store {{.*}} @[[TEMPA]], {{.*}} getelementptr inbounds ({{.*}} @[[E:_ZN17MultipleExtension2e2E]], i32 0, i32 0)
7258a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7268a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call void @_ZN17MultipleExtension1BC1Ev({{.*}} getelementptr inbounds ({{.*}} @[[E]], i32 0, i32 1))
7278a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7288a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call void @_ZN17MultipleExtension1DC1Ev({{.*}} @[[TEMPD:_ZGRN17MultipleExtension2e2E.*]])
7298a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1DD1Ev {{.*}} @[[TEMPD]]
7308a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: store {{.*}} @[[TEMPD]], {{.*}} getelementptr inbounds ({{.*}} @[[E]], i32 0, i32 2)
7318a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1ED1Ev {{.*}} @[[E]]
7328a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7338a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7348a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  void g();
7358a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: define void @[[NS:_ZN17MultipleExtension]]1fEv(
7368a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  void f() {
7378a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    E &&e1 = { A(), B(), D().c };
7388a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: %[[TEMPE1_A:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1:.*]], i32 0, i32 0
7398a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1AC1Ev({{.*}} %[[TEMPA1:.*]])
7408a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: store {{.*}} %[[TEMPA1]], {{.*}} %[[TEMPE1_A]]
7418a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: %[[TEMPE1_B:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1]], i32 0, i32 1
7428a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1BC1Ev({{.*}} %[[TEMPE1_B]])
7438a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: %[[TEMPE1_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1]], i32 0, i32 2
7448a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1DC1Ev({{.*}} %[[TEMPD1:.*]])
7458a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: %[[TEMPD1_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPD1]], i32 0, i32 1
7468a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: store {{.*}} %[[TEMPD1_C]], {{.*}} %[[TEMPE1_C]]
7478a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: store {{.*}} %[[TEMPE1]], {{.*}} %[[E1:.*]]
7488a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7498a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    g();
7508a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1gEv()
7518a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7528a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    E e2 = { A(), B(), D().c };
7538a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: %[[TEMPE2_A:.*]] = getelementptr inbounds {{.*}} %[[E2:.*]], i32 0, i32 0
7548a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1AC1Ev({{.*}} %[[TEMPA2:.*]])
7558a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: store {{.*}} %[[TEMPA2]], {{.*}} %[[TEMPE2_A]]
7568a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: %[[TEMPE2_B:.*]] = getelementptr inbounds {{.*}} %[[E2]], i32 0, i32 1
7578a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1BC1Ev({{.*}} %[[TEMPE2_B]])
7588a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: %[[TEMPE2_C:.*]] = getelementptr inbounds {{.*}} %[[E2]], i32 0, i32 2
7598a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1DC1Ev({{.*}} %[[TEMPD2:.*]])
7608a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: %[[TEMPD2_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPD2]], i32 0, i32 1
7618a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: store {{.*}} %[[TEMPD2_C]], {{.*}}* %[[TEMPE2_C]]
7628a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7638a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    g();
7648a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1gEv()
7658a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
7668a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1ED1Ev({{.*}} %[[E2]])
7678a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1DD1Ev({{.*}} %[[TEMPD2]])
7688a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1AD1Ev({{.*}} %[[TEMPA2]])
7698a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1ED1Ev({{.*}} %[[TEMPE1]])
7708a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1DD1Ev({{.*}} %[[TEMPD1]])
7718a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    // CHECK: call void @[[NS]]1AD1Ev({{.*}} %[[TEMPA1]])
7728a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  }
7738a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith}
7748a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith
77517dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smithnamespace PR14130 {
77617dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith  struct S { S(int); };
77717dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith  struct U { S &&s; };
77817dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith  U v { { 0 } };
7796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: call void @_ZN7PR141301SC1Ei({{.*}} @_ZGRN7PR141301vE_, i32 0)
7806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: store {{.*}} @_ZGRN7PR141301vE_, {{.*}} @_ZN7PR141301vE
78117dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith}
78217dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith
7838a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smithnamespace Ctor {
7848a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  struct A { A(); ~A(); };
7858a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  void f();
7868a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  struct B {
7878a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    A &&a;
7888a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith    B() : a{} { f(); }
7898a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  } b;
7908a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: define {{.*}}void @_ZN4Ctor1BC1Ev(
7918a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call void @_ZN4Ctor1AC1Ev(
7928a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call void @_ZN4Ctor1fEv(
7938a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith  // CHECK: call void @_ZN4Ctor1AD1Ev(
7948a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith}
795