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