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; 6d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // CHECK: @_ZGRN7PR162631rE = private constant i32 1234, 7d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // 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{}); 17d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // CHECK: @_ZGRN7PR162631aE = private global {{.*}} zeroinitializer, 18d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // CHECK: @_ZN7PR162631aE = constant {{.*}} bitcast ({{.*}}* @_ZGRN7PR162631aE to 19d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith 20d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith extern const int &&t = ((B&&)C{}).n; 21d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // CHECK: @_ZGRN7PR162631tE = private global {{.*}} zeroinitializer, 22d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // 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); 26d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // CHECK: @_ZGRN7PR162631uE = private global {{.*}} zeroinitializer 27d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith // CHECK: @_ZN7PR162631uE = constant i32* {{.*}} @_ZGRN7PR162631uE {{.*}} 12 28d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith} 29d6b698739ab157348acafcec5b06a05d3d35377dRichard Smith 307a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlssonstruct A { 317a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson A(); 327a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson ~A(); 337a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson void f(); 347a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson}; 357a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson 36ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlssonvoid f1() { 37fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1AC1Ev 38fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1AD1Ev 39ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson (void)A(); 40fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson 41fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1AC1Ev 42fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1AD1Ev 437a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson A().f(); 447a039eb88d03b35311cb2c99f84eb76634f37a71Anders Carlsson} 45ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson 466f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson// Function calls 47ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlssonstruct B { 48ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson B(); 49ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson ~B(); 50ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson}; 51ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson 52ec74c5929c78bd1670619022f6cfd471becf65aaAnders CarlssonB g(); 53ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson 54ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlssonvoid f2() { 55fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK-NOT: call void @_ZN1BC1Ev 56fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1BD1Ev 57ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson (void)g(); 58ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson} 59ec74c5929c78bd1670619022f6cfd471becf65aaAnders Carlsson 606f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson// Member function calls 616f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlssonstruct C { 626f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson C(); 636f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson ~C(); 646f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson 656f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson C f(); 666f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson}; 676f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson 686f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlssonvoid f3() { 69fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1CC1Ev 70fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1CD1Ev 71fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1CD1Ev 726f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson C().f(); 736f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson} 746f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson 75a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson// Function call operator 76a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlssonstruct D { 77a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson D(); 78a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson ~D(); 79a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson 80a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson D operator()(); 81a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson}; 82a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson 83a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlssonvoid f4() { 843114af3f7911befa8f05a9a76f7d9e380538075bBenjamin Kramer // CHECK: call void @_ZN1DC1Ev 853114af3f7911befa8f05a9a76f7d9e380538075bBenjamin Kramer // CHECK: call void @_ZN1DD1Ev 863114af3f7911befa8f05a9a76f7d9e380538075bBenjamin Kramer // CHECK: call void @_ZN1DD1Ev 87a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson D()(); 88a303f9eab9ceb356a24d84e178d079f0d41ad8d4Anders Carlsson} 896f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson 902d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson// Overloaded operators 912d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlssonstruct E { 922d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson E(); 932d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson ~E(); 942d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson E operator+(const E&); 952d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson E operator!(); 962d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson}; 972d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson 982d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlssonvoid f5() { 99fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1EC1Ev 100fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1EC1Ev 101fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1ED1Ev 102fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1ED1Ev 103fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1ED1Ev 1042d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson E() + E(); 105fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson 106fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1EC1Ev 107fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1ED1Ev 108fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1ED1Ev 1092d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson !E(); 1102d46eb21eb2c904831b0e9f75ab3523384c70e66Anders Carlsson} 1116f68027af2b6ce294a2706f23a1d3cb7ca1b8d37Anders Carlsson 112283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlssonstruct F { 113283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson F(); 114283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson ~F(); 115283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson F& f(); 116283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson}; 117283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson 118283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlssonvoid f6() { 119fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1FC1Ev 120fa4f55067bb62a61eb48f77b0216ab1bb1168d27Anders Carlsson // CHECK: call void @_ZN1FD1Ev 121283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson F().f(); 122283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson} 123283e4d59b8fe63e93f20b6ffb3a623a4f60a85eaAnders Carlsson 1244fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlssonstruct G { 1254fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson G(); 1264fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson G(A); 1274fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson ~G(); 1284fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson operator A(); 1294fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson}; 1304fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson 1314fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlssonvoid a(const A&); 1324fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson 1334fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlssonvoid f7() { 1344fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson // CHECK: call void @_ZN1AC1Ev 1354fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson // CHECK: call void @_Z1aRK1A 1364fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson // CHECK: call void @_ZN1AD1Ev 1374fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson a(A()); 1384fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson 1394fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson // CHECK: call void @_ZN1GC1Ev 1404fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson // CHECK: call void @_ZN1Gcv1AEv 1414fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson // CHECK: call void @_Z1aRK1A 1424fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson // CHECK: call void @_ZN1AD1Ev 1434fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson // CHECK: call void @_ZN1GD1Ev 1444fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson a(G()); 1454fa26848acfbec29a748df4b58d6d654027b49c7Anders Carlsson} 1461faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson 1471faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonnamespace PR5077 { 1481faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson 1491faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonstruct A { 1501faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson A(); 1511faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson ~A(); 1521faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson int f(); 1531faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson}; 1541faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson 1551faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonvoid f(); 1561faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonint g(const A&); 1571faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson 1581faf67478c6d423880726a327c737db13b8d9f0bAnders Carlssonstruct B { 1591faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson int a1; 1601faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson int a2; 1611faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson B(); 1625e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson ~B(); 1631faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson}; 1641faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson 1651faf67478c6d423880726a327c737db13b8d9f0bAnders CarlssonB::B() 1661faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson // CHECK: call void @_ZN6PR50771AC1Ev 1671faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson // CHECK: call i32 @_ZN6PR50771A1fEv 1681faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson // CHECK: call void @_ZN6PR50771AD1Ev 1691faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson : a1(A().f()) 1701faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson // CHECK: call void @_ZN6PR50771AC1Ev 1711faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson // CHECK: call i32 @_ZN6PR50771gERKNS_1AE 1721faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson // CHECK: call void @_ZN6PR50771AD1Ev 1731faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson , a2(g(A())) 1741faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson{ 1751faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson // CHECK: call void @_ZN6PR50771fEv 1761faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson f(); 1771faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson} 1781faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson 1795e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlssonstruct C { 1805e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson C(); 1815e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson 1825e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson const B& b; 1835e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson}; 1845e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson 1855e1b91875c275f0ec50d3680afbac150d684fdbaAnders CarlssonC::C() 1865e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson // CHECK: call void @_ZN6PR50771BC1Ev 1875e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson : b(B()) { 1885e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson // CHECK: call void @_ZN6PR50771fEv 1895e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson f(); 1905e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson 1915e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson // CHECK: call void @_ZN6PR50771BD1Ev 1925e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson} 19303d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson} 19403d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson 19503d8ed439f55b692634f9c71721ecfabbe347c4dAnders CarlssonA f8() { 19603d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson // CHECK: call void @_ZN1AC1Ev 19703d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson // CHECK-NOT: call void @_ZN1AD1Ev 19803d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson return A(); 19903d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson // CHECK: ret void 20003d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson} 2015e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson 20203d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlssonstruct H { 20303d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson H(); 20403d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson ~H(); 20503d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson H(const H&); 20603d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson}; 2075e1b91875c275f0ec50d3680afbac150d684fdbaAnders Carlsson 20803d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlssonvoid f9(H h) { 20903d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson // CHECK: call void @_ZN1HC1Ev 21003d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson // CHECK: call void @_Z2f91H 21103d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson // CHECK: call void @_ZN1HD1Ev 21203d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson f9(H()); 21303d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson 21403d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson // CHECK: call void @_ZN1HC1ERKS_ 21503d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson // CHECK: call void @_Z2f91H 21603d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson // CHECK: call void @_ZN1HD1Ev 21703d8ed439f55b692634f9c71721ecfabbe347c4dAnders Carlsson f9(h); 2181faf67478c6d423880726a327c737db13b8d9f0bAnders Carlsson} 2194b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson 2204b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlssonvoid f10(const H&); 2214b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson 2224b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlssonvoid f11(H h) { 2234b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson // CHECK: call void @_ZN1HC1Ev 2244b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson // CHECK: call void @_Z3f10RK1H 2254b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson // CHECK: call void @_ZN1HD1Ev 2264b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson f10(H()); 2274b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson 2284b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson // CHECK: call void @_Z3f10RK1H 2294b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson // CHECK-NOT: call void @_ZN1HD1Ev 2304b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson // CHECK: ret void 2314b3cbeaea60a1a2d1adc73738123c24549b7ce2cAnders Carlsson f10(h); 232a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar} 23318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 23418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// PR5808 23518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregorstruct I { 23618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor I(const char *); 23718ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor ~I(); 23818ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor}; 23918ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor 24018ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor// CHECK: _Z3f12v 24118ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas GregorI f12() { 24218ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // CHECK: call void @_ZN1IC1EPKc 24318ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // CHECK-NOT: call void @_ZN1ID1Ev 24418ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor // CHECK: ret void 24518ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor return "Hello"; 24618ef5e28a9a2677f8b1dce1fb2638d66e0a1621fDouglas Gregor} 24765552c424750aaa58533ca385a90b77c033cc635Douglas Gregor 24865552c424750aaa58533ca385a90b77c033cc635Douglas Gregor// PR5867 24965552c424750aaa58533ca385a90b77c033cc635Douglas Gregornamespace PR5867 { 25065552c424750aaa58533ca385a90b77c033cc635Douglas Gregor struct S { 25165552c424750aaa58533ca385a90b77c033cc635Douglas Gregor S(); 25265552c424750aaa58533ca385a90b77c033cc635Douglas Gregor S(const S &); 25365552c424750aaa58533ca385a90b77c033cc635Douglas Gregor ~S(); 25465552c424750aaa58533ca385a90b77c033cc635Douglas Gregor }; 25565552c424750aaa58533ca385a90b77c033cc635Douglas Gregor 25665552c424750aaa58533ca385a90b77c033cc635Douglas Gregor void f(S, int); 25765552c424750aaa58533ca385a90b77c033cc635Douglas Gregor // CHECK: define void @_ZN6PR58671gEv 25865552c424750aaa58533ca385a90b77c033cc635Douglas Gregor void g() { 25965552c424750aaa58533ca385a90b77c033cc635Douglas Gregor // CHECK: call void @_ZN6PR58671SC1Ev 26065552c424750aaa58533ca385a90b77c033cc635Douglas Gregor // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi 26165552c424750aaa58533ca385a90b77c033cc635Douglas Gregor // CHECK-NEXT: call void @_ZN6PR58671SD1Ev 26265552c424750aaa58533ca385a90b77c033cc635Douglas Gregor // CHECK-NEXT: ret void 26365552c424750aaa58533ca385a90b77c033cc635Douglas Gregor (f)(S(), 0); 26465552c424750aaa58533ca385a90b77c033cc635Douglas Gregor } 2655132655e4296b780672e9a96b46a740135073534Douglas Gregor 2665132655e4296b780672e9a96b46a740135073534Douglas Gregor // CHECK: define linkonce_odr void @_ZN6PR58672g2IiEEvT_ 2675132655e4296b780672e9a96b46a740135073534Douglas Gregor template<typename T> 2685132655e4296b780672e9a96b46a740135073534Douglas Gregor void g2(T) { 2695132655e4296b780672e9a96b46a740135073534Douglas Gregor // CHECK: call void @_ZN6PR58671SC1Ev 2705132655e4296b780672e9a96b46a740135073534Douglas Gregor // CHECK-NEXT: call void @_ZN6PR58671fENS_1SEi 2715132655e4296b780672e9a96b46a740135073534Douglas Gregor // CHECK-NEXT: call void @_ZN6PR58671SD1Ev 2725132655e4296b780672e9a96b46a740135073534Douglas Gregor // CHECK-NEXT: ret void 2735132655e4296b780672e9a96b46a740135073534Douglas Gregor (f)(S(), 0); 2745132655e4296b780672e9a96b46a740135073534Douglas Gregor } 2755132655e4296b780672e9a96b46a740135073534Douglas Gregor 2765132655e4296b780672e9a96b46a740135073534Douglas Gregor void h() { 2775132655e4296b780672e9a96b46a740135073534Douglas Gregor g2(17); 2785132655e4296b780672e9a96b46a740135073534Douglas Gregor } 27965552c424750aaa58533ca385a90b77c033cc635Douglas Gregor} 2802e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson 2812e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson// PR6199 2822e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlssonnamespace PR6199 { 2832e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson struct A { ~A(); }; 2842e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson 2852e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson struct B { operator A(); }; 2862e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson 2878f51a4f2d00b0abda3cde7f3828fb2e2b9beafb5Douglas Gregor // CHECK: define weak_odr void @_ZN6PR61992f2IiEENS_1AET_ 2882e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson template<typename T> A f2(T) { 2892e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson B b; 2902e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson // CHECK: call void @_ZN6PR61991BcvNS_1AEEv 2912e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson // CHECK-NEXT: ret void 2922e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson return b; 2932e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson } 2942e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson 2952e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson template A f2<int>(int); 2962e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson 2972e13db8bc64bc99922b0aeb45443c681c1643c82Anders Carlsson} 2980dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson 2990dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonnamespace T12 { 3000dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson 3010dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonstruct A { 3020dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson A(); 3030dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson ~A(); 3040dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson int f(); 3050dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson}; 3060dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson 3070dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonint& f(int); 3080dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson 3090dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson// CHECK: define void @_ZN3T121gEv 3100dc736627614b476ec696fa216dd2a524d0bafadAnders Carlssonvoid g() { 3110dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson // CHECK: call void @_ZN3T121AC1Ev 3120dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson // CHECK-NEXT: call i32 @_ZN3T121A1fEv( 3130dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson // CHECK-NEXT: call i32* @_ZN3T121fEi( 3140dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson // CHECK-NEXT: call void @_ZN3T121AD1Ev( 3150dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson int& i = f(A().f()); 3160dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson} 3170dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson 3180dc736627614b476ec696fa216dd2a524d0bafadAnders Carlsson} 3198682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola 3208682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindolanamespace PR6648 { 3218682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola struct B { 3228682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola ~B(); 3238682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola }; 3248682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola B foo; 3258682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola struct D; 3268682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola D& zed(B); 3278682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola void foobar() { 3288682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola // CHECK: call %"struct.PR6648::D"* @_ZN6PR66483zedENS_1BE 3298682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola zed(foo); 3308682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola } 3318682bdae7e3db4e5d7dd957754923bbdf75fc166Rafael Espindola} 332b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor 333b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregornamespace UserConvertToValue { 334b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor struct X { 335b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor X(int); 336b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor X(const X&); 337b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor ~X(); 338b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor }; 339b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor 340b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor void f(X); 341b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor 342b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // CHECK: void @_ZN18UserConvertToValue1gEv() 343b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor void g() { 344b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // CHECK: call void @_ZN18UserConvertToValue1XC1Ei 345b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // CHECK: call void @_ZN18UserConvertToValue1fENS_1XE 346b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor // CHECK: call void @_ZN18UserConvertToValue1XD1Ev 3479994eeda99b08f52bb0312aaddae00f9ae6c7debDouglas Gregor // CHECK: ret void 348b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor f(1); 349b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor } 350b86cf0c11712fa89f14197f3f0ed862e7b2add84Douglas Gregor} 351ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor 352ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregornamespace PR7556 { 353ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor struct A { ~A(); }; 354ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor struct B { int i; ~B(); }; 355ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor struct C { int C::*pm; ~C(); }; 356ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor // CHECK: define void @_ZN6PR75563fooEv() 357ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor void foo() { 358ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor // CHECK: call void @_ZN6PR75561AD1Ev 359ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor A(); 360ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor // CHECK: call void @llvm.memset.p0i8.i64 361ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor // CHECK: call void @_ZN6PR75561BD1Ev 362ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor B(); 363ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 364ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor // CHECK: call void @_ZN6PR75561CD1Ev 365ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor C(); 366ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor // CHECK-NEXT: ret void 367ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor } 368ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor} 369558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 370558d2abc7f9fd6801cc7677200992313ae90b5d8John McCallnamespace Elision { 371fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall struct A { 372fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall A(); A(const A &); ~A(); 373fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall void *p; 374fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall void foo() const; 375fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall }; 376558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 377558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall void foo(); 378558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall A fooA(); 37919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall void takeA(A a); 380558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 381558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: define void @_ZN7Elision5test0Ev() 382558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall void test0() { 383558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: [[I:%.*]] = alloca [[A:%.*]], align 8 384465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall // CHECK-NEXT: [[J:%.*]] = alloca [[A]], align 8 385465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall // CHECK-NEXT: [[T0:%.*]] = alloca [[A]], align 8 386465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall // CHECK-NEXT: [[K:%.*]] = alloca [[A]], align 8 387465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall // CHECK-NEXT: [[T1:%.*]] = alloca [[A]], align 8 388558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 389558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision3fooEv() 390558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[I]]) 391558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall A i = (foo(), A()); 392558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 393558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision4fooAEv([[A]]* sret [[T0]]) 394558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[J]]) 395558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T0]]) 396558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall A j = (fooA(), A()); 397558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 398558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[T1]]) 399558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision4fooAEv([[A]]* sret [[K]]) 400558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T1]]) 401558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall A k = (A(), fooA()); 402558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 403558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[K]]) 404558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[J]]) 405558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[I]]) 406558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall } 407558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 408558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 409558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: define void @_ZN7Elision5test1EbNS_1AE( 410558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall void test1(bool c, A x) { 411465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall // CHECK: [[I:%.*]] = alloca [[A]], align 8 412465e8c1f05ee77647a3cf2deb9d8e534b2c14cafJohn McCall // CHECK-NEXT: [[J:%.*]] = alloca [[A]], align 8 413558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 414558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision1AC1Ev([[A]]* [[I]]) 415558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[I]], [[A]]* [[X:%.*]]) 416558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall A i = (c ? A() : x); 417558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 418558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[J]], [[A]]* [[X]]) 419558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision1AC1Ev([[A]]* [[J]]) 420558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall A j = (c ? x : A()); 421558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 422558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision1AD1Ev([[A]]* [[J]]) 423558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[I]]) 424558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall } 425558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 4265e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling // CHECK: define void @_ZN7Elision5test2Ev([[A]]* noalias sret 427558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall A test2() { 428558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision3fooEv() 429558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[RET:%.*]]) 430558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: ret void 431558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall return (foo(), A()); 432558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall } 433558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 4345e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling // CHECK: define void @_ZN7Elision5test3EiNS_1AE([[A]]* noalias sret 435558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall A test3(int v, A x) { 436558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall if (v < 5) 437558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision1AC1Ev([[A]]* [[RET:%.*]]) 438558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET]], [[A]]* [[X:%.*]]) 439558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall return (v < 0 ? A() : x); 440558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall else 441558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET]], [[A]]* [[X]]) 442558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision1AC1Ev([[A]]* [[RET]]) 443558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall return (v > 10 ? x : A()); 444558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 445558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: ret void 446558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall } 447558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 448558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: define void @_ZN7Elision5test4Ev() 449558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall void test4() { 450558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: [[X:%.*]] = alloca [[A]], align 8 451558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: [[XS:%.*]] = alloca [2 x [[A]]], align 16 452558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 453558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[X]]) 454558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall A x; 455558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 456bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: [[XS0:%.*]] = getelementptr inbounds [2 x [[A]]]* [[XS]], i64 0, i64 0 457558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AC1Ev([[A]]* [[XS0]]) 458bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: [[XS1:%.*]] = getelementptr inbounds [[A]]* [[XS0]], i64 1 459558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[XS1]], [[A]]* [[X]]) 460558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall A xs[] = { A(), x }; 461558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 462bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [2 x [[A]]]* [[XS]], i32 0, i32 0 463bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 2 464558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK-NEXT: br label 465bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK: [[AFTER:%.*]] = phi [[A]]* 466bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds [[A]]* [[AFTER]], i64 -1 467bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[CUR]]) 468bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: [[T0:%.*]] = icmp eq [[A]]* [[CUR]], [[BEGIN]] 469bdc4d80956c83a486e58d3df6bb524a1f66ff574John McCall // CHECK-NEXT: br i1 [[T0]], 470558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall 471558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall // CHECK: call void @_ZN7Elision1AD1Ev([[A]]* [[X]]) 472558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall } 47319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall 47419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // rdar://problem/8433352 4755e31474b9c8348e8d0404264ae6a8775e34df6acBill Wendling // CHECK: define void @_ZN7Elision5test5Ev([[A]]* noalias sret 47619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall struct B { A a; B(); }; 47719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall A test5() { 47819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK: [[AT0:%.*]] = alloca [[A]], align 8 47919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: [[BT0:%.*]] = alloca [[B:%.*]], align 8 48019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: [[X:%.*]] = alloca [[A]], align 8 48119e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: [[BT1:%.*]] = alloca [[B]], align 8 48219e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: [[BT2:%.*]] = alloca [[B]], align 8 48319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall 48419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK: call void @_ZN7Elision1BC1Ev([[B]]* [[BT0]]) 48519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT0]], i32 0, i32 0 48619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[AT0]], [[A]]* [[AM]]) 48719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: call void @_ZN7Elision5takeAENS_1AE([[A]]* [[AT0]]) 48819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[AT0]]) 48919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT0]]) 49019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall takeA(B().a); 49119e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall 49219e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: call void @_ZN7Elision1BC1Ev([[B]]* [[BT1]]) 49319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT1]], i32 0, i32 0 49419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[X]], [[A]]* [[AM]]) 49519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT1]]) 49619e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall A x = B().a; 49719e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall 49819e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: call void @_ZN7Elision1BC1Ev([[B]]* [[BT2]]) 49919e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: [[AM:%.*]] = getelementptr inbounds [[B]]* [[BT2]], i32 0, i32 0 50019e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: call void @_ZN7Elision1AC1ERKS0_([[A]]* [[RET:%.*]], [[A]]* [[AM]]) 50119e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK-NEXT: call void @_ZN7Elision1BD1Ev([[B]]* [[BT2]]) 50219e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall return B().a; 50319e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall 50419e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall // CHECK: call void @_ZN7Elision1AD1Ev([[A]]* [[X]]) 50519e60ad937af50843a653fa19c8be6a83a64f24fJohn McCall } 506fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall 507fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall // Reduced from webkit. 508fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall // CHECK: define void @_ZN7Elision5test6EPKNS_1CE([[C:%.*]]* 509fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall struct C { operator A() const; }; 510fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall void test6(const C *x) { 511fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall // CHECK: [[T0:%.*]] = alloca [[A]], align 8 512fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall // CHECK: [[X:%.*]] = load [[C]]** {{%.*}}, align 8 513fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall // CHECK-NEXT: call void @_ZNK7Elision1CcvNS_1AEEv([[A]]* sret [[T0]], [[C]]* [[X]]) 514fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall // CHECK-NEXT: call void @_ZNK7Elision1A3fooEv([[A]]* [[T0]]) 515fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall // CHECK-NEXT: call void @_ZN7Elision1AD1Ev([[A]]* [[T0]]) 516fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall // CHECK-NEXT: ret void 517fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall A(*x).foo(); 518fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall } 519558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall} 52074fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall 52174fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCallnamespace PR8623 { 52274fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall struct A { A(int); ~A(); }; 52374fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall 52474fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK: define void @_ZN6PR86233fooEb( 52574fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall void foo(bool b) { 52674fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK: [[TMP:%.*]] = alloca [[A:%.*]], align 1 52774fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: [[LCONS:%.*]] = alloca i1 52874fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: [[RCONS:%.*]] = alloca i1 5294bbcbda302cba8b1b0d88c20d735d09b483bd005John McCall // CHECK: store i1 false, i1* [[LCONS]] 53074fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: store i1 false, i1* [[RCONS]] 5314bbcbda302cba8b1b0d88c20d735d09b483bd005John McCall // CHECK-NEXT: br i1 53274fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK: call void @_ZN6PR86231AC1Ei([[A]]* [[TMP]], i32 2) 53374fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: store i1 true, i1* [[LCONS]] 53474fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: br label 53574fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK: call void @_ZN6PR86231AC1Ei([[A]]* [[TMP]], i32 3) 53674fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: store i1 true, i1* [[RCONS]] 53774fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: br label 53874fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK: load i1* [[RCONS]] 53974fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: br i1 54074fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK: call void @_ZN6PR86231AD1Ev([[A]]* [[TMP]]) 54174fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: br label 54274fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK: load i1* [[LCONS]] 54374fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: br i1 54474fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK: call void @_ZN6PR86231AD1Ev([[A]]* [[TMP]]) 54574fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK-NEXT: br label 54674fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall // CHECK: ret void 54774fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall b ? A(2) : A(3); 54874fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall } 54974fb0edb44b7ed52af9b8053032ccaab29b5c0ccJohn McCall} 550bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne 551bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbournenamespace PR11365 { 552bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne struct A { A(); ~A(); }; 553bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne 554bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne // CHECK: define void @_ZN7PR113653fooEv( 555bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne void foo() { 556bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne // CHECK: [[BEGIN:%.*]] = getelementptr inbounds [3 x [[A:%.*]]]* {{.*}}, i32 0, i32 0 557bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[A]]* [[BEGIN]], i64 3 558bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne // CHECK-NEXT: br label 559bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne 560bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne // CHECK: [[PHI:%.*]] = phi 561bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne // CHECK-NEXT: [[ELEM:%.*]] = getelementptr inbounds [[A]]* [[PHI]], i64 -1 562bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne // CHECK-NEXT: call void @_ZN7PR113651AD1Ev([[A]]* [[ELEM]]) 563bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne // CHECK-NEXT: icmp eq [[A]]* [[ELEM]], [[BEGIN]] 564bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne // CHECK-NEXT: br i1 565bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne (void) (A [3]) {}; 566bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne } 567bceb75528a4a9757f85df002ab45c6002dc10f94Peter Collingbourne} 568044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith 569044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smithnamespace AssignmentOp { 570044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith struct A { ~A(); }; 571044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith struct B { A operator=(const B&); }; 572044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith struct C : B { B b1, b2; }; 573044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // CHECK: define void @_ZN12AssignmentOp1fE 574044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith void f(C &c1, const C &c2) { 575044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // CHECK: call {{.*}} @_ZN12AssignmentOp1CaSERKS0_( 576044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith c1 = c2; 577044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith } 578044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith 579044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // Ensure that each 'A' temporary is destroyed before the next subobject is 580044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // copied. 581044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // CHECK: define {{.*}} @_ZN12AssignmentOp1CaSERKS0_( 582044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS 583044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev( 584044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS 585044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev( 586044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // CHECK: call {{.*}} @_ZN12AssignmentOp1BaSERKS 587044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith // CHECK: call {{.*}} @_ZN12AssignmentOp1AD1Ev( 588044c8aa39d582ebc6bca1720c65ddd06fb27780cRichard Smith} 5894e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith 5904e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smithnamespace BindToSubobject { 5914e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith struct A { 5924e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith A(); 5934e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith ~A(); 5944e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith int a; 5954e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith }; 5964e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith 5974e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith void f(), g(); 5984e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith 5994e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1aE) 6004e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1aE to i8*), i8* @__dso_handle) 6014e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: store i32* getelementptr inbounds ({{.*}} @_ZGRN15BindToSubobject1aE, i32 0, i32 0), i32** @_ZN15BindToSubobject1aE, align 8 6024e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith int &&a = A().a; 6034e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith 6044e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call void @_ZN15BindToSubobject1fEv() 6054e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1bE) 6064e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1bE to i8*), i8* @__dso_handle) 6074e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: store i32* getelementptr inbounds ({{.*}} @_ZGRN15BindToSubobject1bE, i32 0, i32 0), i32** @_ZN15BindToSubobject1bE, align 8 6084e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith int &&b = (f(), A().a); 6094e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith 6104e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith int A::*h(); 6114e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith 6124e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call void @_ZN15BindToSubobject1fEv() 6134e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call void @_ZN15BindToSubobject1gEv() 6144e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call void @_ZN15BindToSubobject1AC1Ev({{.*}} @_ZGRN15BindToSubobject1cE) 6158a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1AD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1cE to i8*), i8* @__dso_handle) 6164e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call {{.*}} @_ZN15BindToSubobject1hE 6174e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: getelementptr 6184e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: store i32* {{.*}}, i32** @_ZN15BindToSubobject1cE, align 8 6194e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith int &&c = (f(), (g(), A().*h())); 6204e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith 6214e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith struct B { 6224e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith int padding; 6234e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith A a; 6244e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith }; 6254e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith 6264e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call void @_ZN15BindToSubobject1BC1Ev({{.*}} @_ZGRN15BindToSubobject1dE) 6278a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call i32 @__cxa_atexit({{.*}} bitcast ({{.*}} @_ZN15BindToSubobject1BD1Ev to void (i8*)*), i8* bitcast ({{.*}} @_ZGRN15BindToSubobject1dE to i8*), i8* @__dso_handle) 6284e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: call {{.*}} @_ZN15BindToSubobject1hE 6294e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: getelementptr {{.*}} getelementptr 6304e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith // CHECK: store i32* {{.*}}, i32** @_ZN15BindToSubobject1dE, align 8 6314e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith int &&d = (B().a).*h(); 6324e43dec4df9d7dd8e07b47bb15967f1b733a9bc6Richard Smith} 633d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith 634d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smithnamespace Bitfield { 635d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith struct S { int a : 5; ~S(); }; 636d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith 637d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith // Do not lifetime extend the S() temporary here. 63875ddd1465edeb0ced330263b3d6b30f706a4d33dRichard Smith // CHECK: alloca 63975ddd1465edeb0ced330263b3d6b30f706a4d33dRichard Smith // CHECK: call {{.*}}memset 6408a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store i32 {{.*}}, i32* @_ZGRN8Bitfield1rE 641d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith // CHECK: call void @_ZN8Bitfield1SD1 64275ddd1465edeb0ced330263b3d6b30f706a4d33dRichard Smith // CHECK: store i32* @_ZGRN8Bitfield1rE, i32** @_ZN8Bitfield1rE, align 8 643d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith int &&r = S().a; 644d1b55dcf6bd61d4350b01e15590bde9bb5a334bbRichard Smith} 64534f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith 64634f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smithnamespace Vector { 64734f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith typedef __attribute__((vector_size(16))) int vi4a; 64834f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith typedef __attribute__((ext_vector_type(4))) int vi4b; 64934f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith struct S { 65034f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith vi4a v; 65134f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith vi4b w; 65234f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith }; 65334f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith // CHECK: alloca 65434f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith // CHECK: extractelement 6558a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store i32 {{.*}}, i32* @_ZGRN6Vector1rE 65634f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith // CHECK: store i32* @_ZGRN6Vector1rE, i32** @_ZN6Vector1rE, 65734f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith int &&r = S().v[1]; 65834f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith 65934f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith // CHECK: alloca 66034f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith // CHECK: extractelement 6618a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store i32 {{.*}}, i32* @_ZGRN6Vector1sE 66234f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith // CHECK: store i32* @_ZGRN6Vector1sE, i32** @_ZN6Vector1sE, 66334f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith int &&s = S().w[1]; 66434f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith // FIXME PR16204: The following code leads to an assertion in Sema. 66534f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith //int &&s = S().w.y; 66634f94f93dc20e08c9327441e4b5bcbce9ba23e9cRichard Smith} 6678a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 6688a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smithnamespace ImplicitTemporaryCleanup { 6698a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith struct A { A(int); ~A(); }; 6708a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith void g(); 6718a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 6728a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: define void @_ZN24ImplicitTemporaryCleanup1fEv( 6738a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith void f() { 6748a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1AC1Ei( 6758a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith A &&a = 0; 6768a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 6778a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1gEv( 6788a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith g(); 6798a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 6808a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call {{.*}} @_ZN24ImplicitTemporaryCleanup1AD1Ev( 6818a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith } 6828a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith} 6838a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 6848a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smithnamespace MultipleExtension { 6858a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith struct A { A(); ~A(); }; 6868a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith struct B { B(); ~B(); }; 6878a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith struct C { C(); ~C(); }; 6888a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith struct D { D(); ~D(); int n; C c; }; 6898a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith struct E { const A &a; B b; const C &c; ~E(); }; 6908a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 6918a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith E &&e1 = { A(), B(), D().c }; 6928a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 6938a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @_ZN17MultipleExtension1AC1Ev({{.*}} @[[TEMPA:_ZGRN17MultipleExtension2e1E.*]]) 6948a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1AD1Ev {{.*}} @[[TEMPA]] 6958a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store {{.*}} @[[TEMPA]], {{.*}} getelementptr inbounds ({{.*}} @[[TEMPE:_ZGRN17MultipleExtension2e1E.*]], i32 0, i32 0) 6968a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 6978a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @_ZN17MultipleExtension1BC1Ev({{.*}} getelementptr inbounds ({{.*}} @[[TEMPE]], i32 0, i32 1)) 6988a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 6998a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @_ZN17MultipleExtension1DC1Ev({{.*}} @[[TEMPD:_ZGRN17MultipleExtension2e1E.*]]) 7008a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1DD1Ev {{.*}} @[[TEMPD]] 7018a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store {{.*}} @[[TEMPD]], {{.*}} getelementptr inbounds ({{.*}} @[[TEMPE]], i32 0, i32 2) 7028a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1ED1Ev {{.*}} @[[TEMPE]] 7038a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store {{.*}} @[[TEMPE]], %"struct.MultipleExtension::E"** @_ZN17MultipleExtension2e1E, align 8 7048a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 7058a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith E e2 = { A(), B(), D().c }; 7068a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 7078a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @_ZN17MultipleExtension1AC1Ev({{.*}} @[[TEMPA:_ZGRN17MultipleExtension2e2E.*]]) 7088a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1AD1Ev {{.*}} @[[TEMPA]] 7098a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store {{.*}} @[[TEMPA]], {{.*}} getelementptr inbounds ({{.*}} @[[E:_ZN17MultipleExtension2e2E]], i32 0, i32 0) 7108a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 7118a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @_ZN17MultipleExtension1BC1Ev({{.*}} getelementptr inbounds ({{.*}} @[[E]], i32 0, i32 1)) 7128a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 7138a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @_ZN17MultipleExtension1DC1Ev({{.*}} @[[TEMPD:_ZGRN17MultipleExtension2e2E.*]]) 7148a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1DD1Ev {{.*}} @[[TEMPD]] 7158a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store {{.*}} @[[TEMPD]], {{.*}} getelementptr inbounds ({{.*}} @[[E]], i32 0, i32 2) 7168a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call i32 @__cxa_atexit({{.*}} @_ZN17MultipleExtension1ED1Ev {{.*}} @[[E]] 7178a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 7188a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 7198a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith void g(); 7208a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: define void @[[NS:_ZN17MultipleExtension]]1fEv( 7218a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith void f() { 7228a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith E &&e1 = { A(), B(), D().c }; 7238a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: %[[TEMPE1_A:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1:.*]], i32 0, i32 0 7248a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1AC1Ev({{.*}} %[[TEMPA1:.*]]) 7258a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store {{.*}} %[[TEMPA1]], {{.*}} %[[TEMPE1_A]] 7268a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: %[[TEMPE1_B:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1]], i32 0, i32 1 7278a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1BC1Ev({{.*}} %[[TEMPE1_B]]) 7288a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: %[[TEMPE1_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPE1]], i32 0, i32 2 7298a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1DC1Ev({{.*}} %[[TEMPD1:.*]]) 7308a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: %[[TEMPD1_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPD1]], i32 0, i32 1 7318a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store {{.*}} %[[TEMPD1_C]], {{.*}} %[[TEMPE1_C]] 7328a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store {{.*}} %[[TEMPE1]], {{.*}} %[[E1:.*]] 7338a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 7348a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith g(); 7358a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1gEv() 7368a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 7378a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith E e2 = { A(), B(), D().c }; 7388a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: %[[TEMPE2_A:.*]] = getelementptr inbounds {{.*}} %[[E2:.*]], i32 0, i32 0 7398a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1AC1Ev({{.*}} %[[TEMPA2:.*]]) 7408a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store {{.*}} %[[TEMPA2]], {{.*}} %[[TEMPE2_A]] 7418a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: %[[TEMPE2_B:.*]] = getelementptr inbounds {{.*}} %[[E2]], i32 0, i32 1 7428a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1BC1Ev({{.*}} %[[TEMPE2_B]]) 7438a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: %[[TEMPE2_C:.*]] = getelementptr inbounds {{.*}} %[[E2]], i32 0, i32 2 7448a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1DC1Ev({{.*}} %[[TEMPD2:.*]]) 7458a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: %[[TEMPD2_C:.*]] = getelementptr inbounds {{.*}} %[[TEMPD2]], i32 0, i32 1 7468a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: store {{.*}} %[[TEMPD2_C]], {{.*}}* %[[TEMPE2_C]] 7478a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 7488a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith g(); 7498a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1gEv() 7508a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 7518a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1ED1Ev({{.*}} %[[E2]]) 7528a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1DD1Ev({{.*}} %[[TEMPD2]]) 7538a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1AD1Ev({{.*}} %[[TEMPA2]]) 7548a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1ED1Ev({{.*}} %[[TEMPE1]]) 7558a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1DD1Ev({{.*}} %[[TEMPD1]]) 7568a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @[[NS]]1AD1Ev({{.*}} %[[TEMPA1]]) 7578a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith } 7588a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith} 7598a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith 76017dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smithnamespace PR14130 { 76117dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith struct S { S(int); }; 76217dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith struct U { S &&s; }; 76317dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith U v { { 0 } }; 76417dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith // CHECK: call void @_ZN7PR141301SC1Ei({{.*}} @_ZGRN7PR141301vE, i32 0) 76517dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith // CHECK: store {{.*}} @_ZGRN7PR141301vE, {{.*}} @_ZN7PR141301vE 76617dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith} 76717dfe3fd8b8b64e202c7f63b94146db8284903c6Richard Smith 7688a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smithnamespace Ctor { 7698a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith struct A { A(); ~A(); }; 7708a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith void f(); 7718a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith struct B { 7728a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith A &&a; 7738a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith B() : a{} { f(); } 7748a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith } b; 7758a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: define {{.*}}void @_ZN4Ctor1BC1Ev( 7768a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @_ZN4Ctor1AC1Ev( 7778a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @_ZN4Ctor1fEv( 7788a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith // CHECK: call void @_ZN4Ctor1AD1Ev( 7798a07cd3f59a0ede54906bdc8ed21724815db27adRichard Smith} 780