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