temporaries.cpp revision 4e43dec4df9d7dd8e07b47bb15967f1b733a9bc6
14e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 -std=c++11 | FileCheck %s
27a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlssonstruct A {
37a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson  A();
47a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson  ~A();
57a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson  void f();
67a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson};
77a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson
8ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlssonvoid f1() {
9fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1AC1Ev
10fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1AD1Ev
11ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson  (void)A();
12fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson
13fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1AC1Ev
14fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1AD1Ev
157a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson  A().f();
167a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson}
17ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson
186f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson// Function calls
19ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlssonstruct B {
20ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson  B();
21ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson  ~B();
22ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson};
23ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson
24ec74c5929c78bd1670619022f6cfd471becf65aaAnders CarlssonB g();
25ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson
26ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlssonvoid f2() {
27fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK-NOT: call void @_ZN1BC1Ev
28fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1BD1Ev
29ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson  (void)g();
30ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson}
31ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson
326f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson// Member function calls
336f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlssonstruct C {
346f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson  C();
356f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson  ~C();
366f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson
376f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson  C f();
386f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson};
396f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson
406f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlssonvoid f3() {
41fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1CC1Ev
42fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1CD1Ev
43fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1CD1Ev
446f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson  C().f();
456f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson}
466f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson
47a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson// Function call operator
48a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlssonstruct D {
49a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson  D();
50a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson  ~D();
51a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson
52a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson  D operator()();
53a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson};
54a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson
55a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlssonvoid f4() {
563114af3f7911befa8f05a9a76f7d9e380538075bBenjamin Kramer  // CHECK: call void @_ZN1DC1Ev
573114af3f7911befa8f05a9a76f7d9e380538075bBenjamin Kramer  // CHECK: call void @_ZN1DD1Ev
583114af3f7911befa8f05a9a76f7d9e380538075bBenjamin Kramer  // CHECK: call void @_ZN1DD1Ev
59a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson  D()();
60a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson}
616f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson
622d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson// Overloaded operators
632d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlssonstruct E {
642d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  E();
652d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  ~E();
662d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  E operator+(const E&);
672d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  E operator!();
682d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson};
692d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson
702d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlssonvoid f5() {
71fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1EC1Ev
72fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1EC1Ev
73fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1ED1Ev
74fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1ED1Ev
75fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1ED1Ev
762d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  E() + E();
77fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson
78fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1EC1Ev
79fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1ED1Ev
80fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1ED1Ev
812d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson  !E();
822d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson}
836f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson
84283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlssonstruct F {
85283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson  F();
86283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson  ~F();
87283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson  F& f();
88283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson};
89283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson
90283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlssonvoid f6() {
91fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1FC1Ev
92fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson  // CHECK: call void @_ZN1FD1Ev
93283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson  F().f();
94283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson}
95283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson
964fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlssonstruct G {
974fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  G();
984fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  G(A);
994fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  ~G();
1004fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  operator A();
1014fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson};
1024fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson
1034fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlssonvoid a(const A&);
1044fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson
1054fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlssonvoid f7() {
1064fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1AC1Ev
1074fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_Z1aRK1A
1084fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1AD1Ev
1094fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  a(A());
1104fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson
1114fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1GC1Ev
1124fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1Gcv1AEv
1134fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_Z1aRK1A
1144fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1AD1Ev
1154fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  // CHECK: call void @_ZN1GD1Ev
1164fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson  a(G());
1174fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson}
1181faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1191faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonnamespace PR5077 {
1201faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1211faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonstruct A {
1221faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  A();
1231faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  ~A();
1241faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  int f();
1251faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson};
1261faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1271faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonvoid f();
1281faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonint g(const A&);
1291faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1301faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonstruct B {
1311faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  int a1;
1321faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  int a2;
1331faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  B();
1345e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  ~B();
1351faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson};
1361faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1371faf67478c6d423880726a327c737db13b8d9f0bAnders CarlssonB::B()
1381faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call void @_ZN6PR50771AC1Ev
1391faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call i32 @_ZN6PR50771A1fEv
1401faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call void @_ZN6PR50771AD1Ev
1411faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  : a1(A().f())
1421faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call void @_ZN6PR50771AC1Ev
1431faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call i32 @_ZN6PR50771gERKNS_1AE
1441faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call void @_ZN6PR50771AD1Ev
1451faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  , a2(g(A()))
1461faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson{
1471faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  // CHECK: call void @_ZN6PR50771fEv
1481faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson  f();
1491faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson}
1501faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson
1515e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlssonstruct C {
1525e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  C();
1535e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson
1545e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  const B& b;
1555e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson};
1565e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson
1575e1b91875c275f0ec50d3680afbac150d684fdbaAnders CarlssonC::C()
1585e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  // CHECK: call void @_ZN6PR50771BC1Ev
1595e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  : b(B()) {
1605e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  // CHECK: call void @_ZN6PR50771fEv
1615e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  f();
1625e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson
1635e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson  // CHECK: call void @_ZN6PR50771BD1Ev
1645e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson}
16503d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson}
16603d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson
16703d8ed439f55b692634f9c71721ecfabbe347c4dAnders CarlssonA f8() {
16803d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_ZN1AC1Ev
16903d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK-NOT: call void @_ZN1AD1Ev
17003d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  return A();
17103d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: ret void
17203d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson}
1735e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson
17403d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlssonstruct H {
17503d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  H();
17603d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  ~H();
17703d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  H(const H&);
17803d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson};
1795e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson
18003d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlssonvoid f9(H h) {
18103d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_ZN1HC1Ev
18203d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_Z2f91H
18303d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_ZN1HD1Ev
18403d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  f9(H());
18503d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson
18603d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_ZN1HC1ERKS_
18703d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_Z2f91H
18803d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  // CHECK: call void @_ZN1HD1Ev
18903d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson  f9(h);
1901faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson}
1914b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson
1924b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlssonvoid f10(const H&);
1934b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson
1944b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlssonvoid f11(H h) {
1954b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK: call void @_ZN1HC1Ev
1964b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK: call void @_Z3f10RK1H
1974b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK: call void @_ZN1HD1Ev
1984b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  f10(H());
1994b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson
2004b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK: call void @_Z3f10RK1H
2014b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK-NOT: call void @_ZN1HD1Ev
2024b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  // CHECK: ret void
2034b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson  f10(h);
204a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar}
20518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor
20618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// PR5808
20718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorstruct I {
20818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  I(const char *);
20918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  ~I();
21018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor};
21118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor
21218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// CHECK: _Z3f12v
21318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorI f12() {
21418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  // CHECK: call void @_ZN1IC1EPKc
21518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  // CHECK-NOT: call void @_ZN1ID1Ev
21618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  // CHECK: ret void
21718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor  return "Hello";
21818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor}
21965552c424750aaa58533ca385a90b77c033cc635Douglas Gregor
22065552c424750aaa58533ca385a90b77c033cc635Douglas Gregor// PR5867
22165552c424750aaa58533ca385a90b77c033cc635Douglas Gregornamespace PR5867 {
22265552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  struct S {
22365552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    S();
22465552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    S(const S &);
22565552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    ~S();
22665552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  };
22765552c424750aaa58533ca385a90b77c033cc635Douglas Gregor
22865552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  void f(S, int);
22965552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  // CHECK: define void @_ZN6PR58671gEv
23065552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  void g() {
23165552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    // CHECK: call void @_ZN6PR58671SC1Ev
23265552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi
23365552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    // CHECK-NEXT: call void @_ZN6PR58671SD1Ev
23465552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    // CHECK-NEXT: ret void
23565552c424750aaa58533ca385a90b77c033cc635Douglas Gregor    (f)(S(), 0);
23665552c424750aaa58533ca385a90b77c033cc635Douglas Gregor  }
2375132655e4296b780672e9a96b46a740135073534Douglas Gregor
2385132655e4296b780672e9a96b46a740135073534Douglas Gregor  // CHECK: define linkonce_odr void @_ZN6PR58672g2IiEEvT_
2395132655e4296b780672e9a96b46a740135073534Douglas Gregor  template<typename T>
2405132655e4296b780672e9a96b46a740135073534Douglas Gregor  void g2(T) {
2415132655e4296b780672e9a96b46a740135073534Douglas Gregor    // CHECK: call void @_ZN6PR58671SC1Ev
2425132655e4296b780672e9a96b46a740135073534Douglas Gregor    // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi
2435132655e4296b780672e9a96b46a740135073534Douglas Gregor    // CHECK-NEXT: call void @_ZN6PR58671SD1Ev
2445132655e4296b780672e9a96b46a740135073534Douglas Gregor    // CHECK-NEXT: ret void
2455132655e4296b780672e9a96b46a740135073534Douglas Gregor    (f)(S(), 0);
2465132655e4296b780672e9a96b46a740135073534Douglas Gregor  }
2475132655e4296b780672e9a96b46a740135073534Douglas Gregor
2485132655e4296b780672e9a96b46a740135073534Douglas Gregor  void h() {
2495132655e4296b780672e9a96b46a740135073534Douglas Gregor    g2(17);
2505132655e4296b780672e9a96b46a740135073534Douglas Gregor  }
25165552c424750aaa58533ca385a90b77c033cc635Douglas Gregor}
2522e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson
2532e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson// PR6199
2542e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlssonnamespace PR6199 {
2552e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson  struct A { ~A(); };
2562e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson
2572e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson  struct B { operator A(); };
2582e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson
2598f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor  // CHECK: define weak_odr void @_ZN6PR61992f2IiEENS_1AET_
2602e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson  template<typename T> A f2(T) {
2612e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson    B b;
2622e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson    // CHECK: call void @_ZN6PR61991BcvNS_1AEEv
2632e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson    // CHECK-NEXT: ret void
2642e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson    return b;
2652e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson  }
2662e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson
2672e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson  template A f2<int>(int);
2682e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson
2692e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson}
2700dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson
2710dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonnamespace T12 {
2720dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson
2730dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonstruct A {
2740dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  A();
2750dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  ~A();
2760dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  int f();
2770dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson};
2780dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson
2790dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonint& f(int);
2800dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson
2810dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson// CHECK: define void @_ZN3T121gEv
2820dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonvoid g() {
2830dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  // CHECK: call void @_ZN3T121AC1Ev
2840dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  // CHECK-NEXT: call i32 @_ZN3T121A1fEv(
2850dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  // CHECK-NEXT: call i32* @_ZN3T121fEi(
2860dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  // CHECK-NEXT: call void @_ZN3T121AD1Ev(
2870dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson  int& i = f(A().f());
2880dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson}
2890dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson
2900dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson}
2918682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola
2928682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindolanamespace PR6648 {
2938682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  struct B {
2948682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola    ~B();
2958682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  };
2968682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  B foo;
2978682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  struct D;
2988682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  D& zed(B);
2998682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  void foobar() {
3008682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola    // CHECK: call %"struct.PR6648::D"* @_ZN6PR66483zedENS_1BE
3018682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola    zed(foo);
3028682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola  }
3038682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola}
304b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor
305b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregornamespace UserConvertToValue {
306b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  struct X {
307b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    X(int);
308b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    X(const X&);
309b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    ~X();
310b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  };
311b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor
312b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  void f(X);
313b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor
314b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  // CHECK: void @_ZN18UserConvertToValue1gEv()
315b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  void g() {
316b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    // CHECK: call void @_ZN18UserConvertToValue1XC1Ei
317b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    // CHECK: call void @_ZN18UserConvertToValue1fENS_1XE
318b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    // CHECK: call void @_ZN18UserConvertToValue1XD1Ev
3199994eeda99b08f52bb0312aaddae00f9ae6c7debDouglas Gregor    // CHECK: ret void
320b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor    f(1);
321b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor  }
322b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor}
323ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor
324ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregornamespace PR7556 {
325ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  struct A { ~A(); };
326ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  struct B { int i; ~B(); };
327ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  struct C { int C::*pm; ~C(); };
328ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  // CHECK: define void @_ZN6PR75563fooEv()
329ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  void foo() {
330ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK: call void @_ZN6PR75561AD1Ev
331ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    A();
332ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK: call void @llvm.memset.p0i8.i64
333ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK: call void @_ZN6PR75561BD1Ev
334ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    B();
335ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
336ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK: call void @_ZN6PR75561CD1Ev
337ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    C();
338ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    // CHECK-NEXT: ret void
339ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor  }
340ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor}
341558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
342558d2abc7f9fd6801cc7677200992313ae90b5d8John McCallnamespace Elision {
343fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  struct A {
344fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    A(); A(const A &); ~A();
345fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    void *p;
346fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    void foo() const;
347fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  };
348558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
349558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  void foo();
350558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  A fooA();
35119e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  void takeA(A a);
352558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
353558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  // CHECK: define void @_ZN7Elision5test0Ev()
354558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  void test0() {
355558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      [[I:%.*]] = alloca [[A:%.*]], align 8
356465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK-NEXT: [[J:%.*]] = alloca [[A]], align 8
357465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK-NEXT: [[T0:%.*]] = alloca [[A]], align 8
358465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK-NEXT: [[K:%.*]] = alloca [[A]], align 8
359465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK-NEXT: [[T1:%.*]] = alloca [[A]], align 8
360558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
361558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision3fooEv()
362558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[I]])
363558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A i = (foo(), A());
364558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
365558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision4fooAEv([[A]]* sret [[T0]])
366558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[J]])
367558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T0]])
368558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A j = (fooA(), A());
369558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
370558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[T1]])
371558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision4fooAEv([[A]]* sret [[K]])
372558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T1]])
373558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A k = (A(), fooA());
374558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
375558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[K]])
376558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[J]])
377558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[I]])
378558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
379558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
380558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
381558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  // CHECK: define void @_ZN7Elision5test1EbNS_1AE(
382558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  void test1(bool c, A x) {
383465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK:      [[I:%.*]] = alloca [[A]], align 8
384465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall    // CHECK-NEXT: [[J:%.*]] = alloca [[A]], align 8
385558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
386558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1Ev([[A]]* [[I]])
387558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1ERKS0_([[A]]* [[I]], [[A]]* [[X:%.*]])
388558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A i = (c ? A() : x);
389558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
390558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1ERKS0_([[A]]* [[J]], [[A]]* [[X]])
391558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1Ev([[A]]* [[J]])
392558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A j = (c ? x : A());
393558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
394558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AD1Ev([[A]]* [[J]])
395558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[I]])
396558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
397558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
3985e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling  // CHECK: define void @_ZN7Elision5test2Ev([[A]]* noalias sret
399558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  A test2() {
400558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision3fooEv()
401558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[RET:%.*]])
402558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: ret void
403558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    return (foo(), A());
404558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
405558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
4065e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling  // CHECK: define void @_ZN7Elision5test3EiNS_1AE([[A]]* noalias sret
407558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  A test3(int v, A x) {
408558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    if (v < 5)
409558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1Ev([[A]]* [[RET:%.*]])
410558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET]], [[A]]* [[X:%.*]])
411558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall      return (v < 0 ? A() : x);
412558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    else
413558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET]], [[A]]* [[X]])
414558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AC1Ev([[A]]* [[RET]])
415558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall      return (v > 10 ? x : A());
416558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
417558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      ret void
418558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
419558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
420558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  // CHECK: define void @_ZN7Elision5test4Ev()
421558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  void test4() {
422558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      [[X:%.*]] = alloca [[A]], align 8
423558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: [[XS:%.*]] = alloca [2 x [[A]]], align 16
424558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
425558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[X]])
426558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A x;
427558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
428bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[XS0:%.*]] = getelementptr inbounds [2 x [[A]]]* [[XS]], i64 0, i64 0
429558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[XS0]])
430bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[XS1:%.*]] = getelementptr inbounds [[A]]* [[XS0]], i64 1
431558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[XS1]], [[A]]* [[X]])
432558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    A xs[] = { A(), x };
433558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
434bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [2 x [[A]]]* [[XS]], i32 0, i32 0
435bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 2
436558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK-NEXT: br label
437bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK:      [[AFTER:%.*]] = phi [[A]]*
438bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]]* [[AFTER]], i64 -1
439bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[CUR]])
440bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[CUR]], [[BEGIN]]
441bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall    // CHECK-NEXT: br i1 [[T0]],
442558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall
443558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    // CHECK:      call void @_ZN7Elision1AD1Ev([[A]]* [[X]])
444558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
44519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
44619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  // rdar://problem/8433352
4475e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling  // CHECK: define void @_ZN7Elision5test5Ev([[A]]* noalias sret
44819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  struct B { A a; B(); };
44919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  A test5() {
45019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK:      [[AT0:%.*]] = alloca [[A]], align 8
45119e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[BT0:%.*]] = alloca [[B:%.*]], align 8
45219e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[X:%.*]] = alloca [[A]], align 8
45319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[BT1:%.*]] = alloca [[B]], align 8
45419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[BT2:%.*]] = alloca [[B]], align 8
45519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
45619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK:      call void @_ZN7Elision1BC1Ev([[B]]* [[BT0]])
45719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT0]], i32 0, i32 0
45819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[AT0]], [[A]]* [[AM]])
45919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision5takeAENS_1AE([[A]]* [[AT0]])
46019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[AT0]])
46119e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT0]])
46219e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    takeA(B().a);
46319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
46419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1BC1Ev([[B]]* [[BT1]])
46519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT1]], i32 0, i32 0
46619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[X]], [[A]]* [[AM]])
46719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT1]])
46819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    A x = B().a;
46919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
47019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1BC1Ev([[B]]* [[BT2]])
47119e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT2]], i32 0, i32 0
47219e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET:%.*]], [[A]]* [[AM]])
47319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT2]])
47419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    return B().a;
47519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall
47619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall    // CHECK:      call void @_ZN7Elision1AD1Ev([[A]]* [[X]])
47719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall  }
478fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall
479fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  // Reduced from webkit.
480fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  // CHECK: define void @_ZN7Elision5test6EPKNS_1CE([[C:%.*]]*
481fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  struct C { operator A() const; };
482fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  void test6(const C *x) {
483fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK:      [[T0:%.*]] = alloca [[A]], align 8
484fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK:      [[X:%.*]] = load [[C]]** {{%.*}}, align 8
485fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK-NEXT: call void @_ZNK7Elision1CcvNS_1AEEv([[A]]* sret [[T0]], [[C]]* [[X]])
486fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK-NEXT: call void @_ZNK7Elision1A3fooEv([[A]]* [[T0]])
487fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T0]])
488fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    // CHECK-NEXT: ret void
489fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    A(*x).foo();
490fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  }
491558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall}
49274fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall
49374fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCallnamespace PR8623 {
49474fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall  struct A { A(int); ~A(); };
49574fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall
49674fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall  // CHECK: define void @_ZN6PR86233fooEb(
49774fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall  void foo(bool b) {
49874fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      [[TMP:%.*]] = alloca [[A:%.*]], align 1
49974fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: [[LCONS:%.*]] = alloca i1
50074fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: [[RCONS:%.*]] = alloca i1
5014bbcbda302cba8b1b0d88c20d735d09b483bd005John McCall    // CHECK:      store i1 false, i1* [[LCONS]]
50274fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: store i1 false, i1* [[RCONS]]
5034bbcbda302cba8b1b0d88c20d735d09b483bd005John McCall    // CHECK-NEXT: br i1
50474fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      call void @_ZN6PR86231AC1Ei([[A]]* [[TMP]], i32 2)
50574fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: store i1 true, i1* [[LCONS]]
50674fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br label
50774fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      call void @_ZN6PR86231AC1Ei([[A]]* [[TMP]], i32 3)
50874fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: store i1 true, i1* [[RCONS]]
50974fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br label
51074fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      load i1* [[RCONS]]
51174fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br i1
51274fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      call void @_ZN6PR86231AD1Ev([[A]]* [[TMP]])
51374fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br label
51474fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      load i1* [[LCONS]]
51574fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br i1
51674fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      call void @_ZN6PR86231AD1Ev([[A]]* [[TMP]])
51774fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK-NEXT: br label
51874fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    // CHECK:      ret void
51974fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall    b ? A(2) : A(3);
52074fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall  }
52174fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall}
522bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne
523bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbournenamespace PR11365 {
524bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne  struct A { A(); ~A(); };
525bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne
526bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne  // CHECK: define void @_ZN7PR113653fooEv(
527bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne  void foo() {
528bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK: [[BEGIN:%.*]] = getelementptr inbounds [3 x [[A:%.*]]]* {{.*}}, i32 0, i32 0
529bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 3
530bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: br label
531bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne
532bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK: [[PHI:%.*]] = phi
533bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: [[ELEM:%.*]] = getelementptr inbounds [[A]]* [[PHI]], i64 -1
534bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: call void @_ZN7PR113651AD1Ev([[A]]* [[ELEM]])
535bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: icmp eq [[A]]* [[ELEM]], [[BEGIN]]
536bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    // CHECK-NEXT: br i1
537bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne    (void) (A [3]) {};
538bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne  }
539bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne}
540044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith
541044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smithnamespace AssignmentOp {
542044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  struct A { ~A(); };
543044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  struct B { A operator=(const B&); };
544044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  struct C : B { B b1, b2; };
545044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: define void @_ZN12AssignmentOp1fE
546044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  void f(C &c1, const C &c2) {
547044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith    // CHECK: call {{.*}} @_ZN12AssignmentOp1CaSERKS0_(
548044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith    c1 = c2;
549044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  }
550044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith
551044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // Ensure that each 'A' temporary is destroyed before the next subobject is
552044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // copied.
553044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: define {{.*}} @_ZN12AssignmentOp1CaSERKS0_(
554044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
555044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
556044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
557044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
558044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS
559044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith  // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev(
560044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith}
5614e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
5624e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smithnamespace BindToSubobject {
5634e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  struct A {
5644e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith    A();
5654e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith    ~A();
5664e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith    int a;
5674e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  };
5684e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
5694e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  void f(), g();
5704e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
5714e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1aE)
5724e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1aE to i8*), i8* @__dso_handle)
5734e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: store i32* getelementptr inbounds ({{.*}} @_ZGRN15BindToSubobject1aE, i32 0, i32 0), i32** @_ZN15BindToSubobject1aE, align 8
5744e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  int &&a = A().a;
5754e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
5764e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call void @_ZN15BindToSubobject1fEv()
5774e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1bE)
5784e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1bE to i8*), i8* @__dso_handle)
5794e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: store i32* getelementptr inbounds ({{.*}} @_ZGRN15BindToSubobject1bE, i32 0, i32 0), i32** @_ZN15BindToSubobject1bE, align 8
5804e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  int &&b = (f(), A().a);
5814e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
5824e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  int A::*h();
5834e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
5844e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call void @_ZN15BindToSubobject1fEv()
5854e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call void @_ZN15BindToSubobject1gEv()
5864e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1cE)
5874e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // FIXME: This is wrong. We should emit the call to __cxa_atexit prior to
5884e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // calling h(), in case h() throws.
5894e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call {{.*}} @_ZN15BindToSubobject1hE
5904e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: getelementptr
5914e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1cE to i8*), i8* @__dso_handle)
5924e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: store i32* {{.*}}, i32** @_ZN15BindToSubobject1cE, align 8
5934e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  int &&c = (f(), (g(), A().*h()));
5944e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
5954e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  struct B {
5964e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith    int padding;
5974e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith    A a;
5984e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  };
5994e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith
6004e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call void @_ZN15BindToSubobject1BC1Ev({{.*}} @_ZGRN15BindToSubobject1dE)
6014e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call {{.*}} @_ZN15BindToSubobject1hE
6024e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: getelementptr {{.*}} getelementptr
6034e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1BD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1dE to i8*), i8* @__dso_handle)
6044e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  // CHECK: store i32* {{.*}}, i32** @_ZN15BindToSubobject1dE, align 8
6054e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith  int &&d = (B().a).*h();
6064e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith}
607