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