temporaries.cpp revision 044c8aa39d582ebc6bca1720c65ddd06fb27780c
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | 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 398410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall // 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 406410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall // 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 447410ffb2bc5f072d58a73c14560345bcf77dec1ccJohn McCall // 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} 561