1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -triple x86_64-linux -fblocks -emit-llvm -o - %s -std=c++1y | FileCheck %s
2f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: @"_ZZZNK17pr18020_constexpr3$_1clEvENKUlvE_clEvE2l2" =
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: internal global i32* @"_ZZNK17pr18020_constexpr3$_1clEvE2l1"
50e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZZL14deduced_returnvE1n = internal global i32 42
60e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZZZL20block_deduced_returnvEUb_E1n = internal global i32 42
70e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZZ18static_local_labelPvE1q = linkonce_odr global i8* blockaddress(@_Z18static_local_labelPv, %{{.*}})
80e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @"_ZZNK3$_2clEvE1x" = internal global i32 42
9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace pr6769 {
11f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanianstruct X {
12f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian  static void f();
13f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian};
14f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian
15f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanianvoid X::f() {
16f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian  static int *i;
17f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian  {
18f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian    struct Y {
19f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian      static void g() {
20f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian        i = new int();
21f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian	*i = 100;
22f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian	(*i) = (*i) +1;
23f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian      }
24f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian    };
25f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian    (void)Y::g();
26f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian  }
27f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian  (void)i;
28f573eaf3c7ff85ebd18b6f2861097e1a8b3d1d3fFariborz Jahanian}
29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
303a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanian
31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace pr7101 {
323a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanianvoid foo() {
333a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanian    static int n = 0;
343a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanian    struct Helper {
353a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanian        static void Execute() {
363a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanian            n++;
373a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanian        }
383a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanian    };
393a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanian    Helper::Execute();
403a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanian}
41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// These tests all break the assumption that the static var decl has to be
44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// emitted before use of the var decl.  This happens because we defer emission
45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// of variables with internal linkage and no initialization side effects, such
46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// as 'x'.  Then we hit operator()() in 'f', and emit the callee before we emit
47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// the arguments, so we emit the innermost function first.
48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace pr18020_lambda {
50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Referring to l1 before emitting it used to crash.
51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesauto x = []() {
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static int l1 = 0;
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return [] { return l1; };
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint f() { return x()(); }
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define internal i32 @"_ZZNK14pr18020_lambda3$_0clEvENKUlvE_clEv"
593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load i32, i32* @"_ZZNK14pr18020_lambda3$_0clEvE2l1"
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace pr18020_constexpr {
62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Taking the address of l1 in a constant expression used to crash.
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesauto x = []() {
64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static int l1 = 0;
65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return [] {
66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    static int *l2 = &l1;
67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return *l2;
68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint f() { return x()(); }
71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define internal i32 @"_ZZNK17pr18020_constexpr3$_1clEvENKUlvE_clEv"
743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load i32*, i32** @"_ZZZNK17pr18020_constexpr3$_1clEvENKUlvE_clEvE2l2"
75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Lambda-less reduction that references l1 before emitting it.  This didn't
77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// crash if you put it in a namespace.
78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct pr18020_class {
79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  auto operator()() {
80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    static int l1 = 0;
81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    struct U {
82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      int operator()() { return l1; }
83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    };
84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return U();
85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic pr18020_class x;
88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint pr18020_f() { return x()(); }
89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define linkonce_odr i32 @_ZZN13pr18020_classclEvEN1UclEv
913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load i32, i32* @_ZZN13pr18020_classclEvE2l1
92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// In this test case, the function containing the static local will not be
94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// emitted because it is unneeded. However, the operator call of the inner class
95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// is called, and the static local is referenced and must be emitted.
96176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic auto deduced_return() {
97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static int n = 42;
98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct S { int *operator()() { return &n; } };
99176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return S();
100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesextern "C" int call_deduced_return_operator() {
102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return *decltype(deduced_return())()();
103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define i32 @call_deduced_return_operator()
106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: call i32* @_ZZL14deduced_returnvEN1SclEv(
1073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load i32, i32* %
108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: ret i32 %
109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define internal i32* @_ZZL14deduced_returnvEN1SclEv(%struct.S* %this)
111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: ret i32* @_ZZL14deduced_returnvE1n
112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic auto block_deduced_return() {
114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  auto (^b)() = ^() {
115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    static int n = 42;
116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    struct S { int *operator()() { return &n; } };
117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return S();
118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return b();
120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesextern "C" int call_block_deduced_return() {
122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return *decltype(block_deduced_return())()();
123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define i32 @call_block_deduced_return()
126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: call i32* @_ZZZL20block_deduced_returnvEUb_EN1SclEv(
1273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: load i32, i32* %
128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: ret i32 %
129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define internal i32* @_ZZZL20block_deduced_returnvEUb_EN1SclEv(%struct.S.6* %this) #0 align 2 {
131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: ret i32* @_ZZZL20block_deduced_returnvEUb_E1n
132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesinline auto static_local_label(void *p) {
134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (p)
135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    goto *p;
136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static void *q = &&label;
137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct S { static void *get() { return q; } };
138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return S();
139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hineslabel:
140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  __builtin_abort();
141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid *global_label = decltype(static_local_label(0))::get();
143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define linkonce_odr i8* @_ZZ18static_local_labelPvEN1S3getEv()
1453ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[lbl:[^ ]*]] = load i8*, i8** @_ZZ18static_local_labelPvE1q
146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: ret i8* %[[lbl]]
147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesauto global_lambda = []() {
149176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static int x = 42;
150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  struct S { static int *get() { return &x; } };
151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return S();
152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesextern "C" int use_global_lambda() {
154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return *decltype(global_lambda())::get();
155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define i32 @use_global_lambda()
157176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: call i32* @"_ZZNK3$_2clEvEN1S3getEv"()
1583a593f68d59ff5c11b24ac6a35888dd174b46d67Fariborz Jahanian
159176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define internal i32* @"_ZZNK3$_2clEvEN1S3getEv"()
160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK: ret i32* @"_ZZNK3$_2clEvE1x"
161