1*7963e8beSErich Keane // RUN: %clang_cc1 -fsyntax-only -verify -fms-extensions %s -triple x86_64-pc-win32 2*7963e8beSErich Keane // expected-no-diagnostics 3*7963e8beSErich Keane 4*7963e8beSErich Keane // Non-Member Function Overloading is involved 5*7963e8beSErich Keane bar_one(int)6*7963e8beSErich Keaneint __declspec(code_seg("foo_one")) bar_one(int) { return 1; } 7*7963e8beSErich Keane //CHECK: define {{.*}}bar_one{{.*}} section "foo_one" bar_one(int,float)8*7963e8beSErich Keaneint __declspec(code_seg("foo_two")) bar_one(int,float) { return 11; } 9*7963e8beSErich Keane //CHECK: define {{.*}}bar_one{{.*}} section "foo_two" bar_one(float)10*7963e8beSErich Keaneint __declspec(code_seg("foo_three")) bar_one(float) { return 12; } 11*7963e8beSErich Keane //CHECK: define {{.*}}bar_one{{.*}} section "foo_three" 12*7963e8beSErich Keane 13*7963e8beSErich Keane // virtual function overloading is involved 14*7963e8beSErich Keane 15*7963e8beSErich Keane struct __declspec(code_seg("my_one")) Base3 { barABase316*7963e8beSErich Keane virtual int barA(int) { return 1; } barABase317*7963e8beSErich Keane virtual int barA(int,float) { return 2; } barABase318*7963e8beSErich Keane virtual int barA(float) { return 3; } 19*7963e8beSErich Keane barBBase320*7963e8beSErich Keane virtual void __declspec(code_seg("my_two")) barB(int) { } barBBase321*7963e8beSErich Keane virtual void __declspec(code_seg("my_three")) barB(float) { } barBBase322*7963e8beSErich Keane virtual void __declspec(code_seg("my_four")) barB(int, float) { } 23*7963e8beSErich Keane 24*7963e8beSErich Keane }; 25*7963e8beSErich Keane 26*7963e8beSErich Keane //CHECK: define {{.*}}barA@Base3{{.*}} section "my_one" 27*7963e8beSErich Keane //CHECK: define {{.*}}barA@Base3{{.*}} section "my_one" 28*7963e8beSErich Keane //CHECK: define {{.*}}barA@Base3{{.*}} section "my_one" 29*7963e8beSErich Keane //CHECK: define {{.*}}barB@Base3{{.*}} section "my_two" 30*7963e8beSErich Keane //CHECK: define {{.*}}barB@Base3{{.*}} section "my_three" 31*7963e8beSErich Keane //CHECK: define {{.*}}barB@Base3{{.*}} section "my_four" 32*7963e8beSErich Keane 33*7963e8beSErich Keane #pragma code_seg("another") 34*7963e8beSErich Keane // Member functions 35*7963e8beSErich Keane struct __declspec(code_seg("foo_four")) Foo { bar3Foo36*7963e8beSErich Keane int bar3() {return 0;} caller()37*7963e8beSErich Keane __declspec(code_seg("foo_lala")) int bar4() {return 0;} }; int caller() {Foo f; return f.bar3() + f.bar4(); } 38*7963e8beSErich Keane 39*7963e8beSErich Keane //CHECK: define {{.*}}bar3@Foo{{.*}} section "foo_four" 40*7963e8beSErich Keane //CHECK: define {{.*}}bar4@Foo{{.*}} section "foo_lala" 41*7963e8beSErich Keane 42*7963e8beSErich Keane // Lambdas 43*7963e8beSErich Keane #pragma code_seg("something") 44*7963e8beSErich Keane bar1()45*7963e8beSErich Keaneint __declspec(code_seg("foo")) bar1() 46*7963e8beSErich Keane { 47*7963e8beSErich Keane int lala = 4; 48*7963e8beSErich Keane auto l = [=](int i) { return i+4; }; 49*7963e8beSErich Keane return l(-4); 50*7963e8beSErich Keane } 51*7963e8beSErich Keane 52*7963e8beSErich Keane //CHECK: define {{.*}}bar1{{.*}} section "foo" 53*7963e8beSErich Keane //CHECK: define {{.*}}lambda{{.*}}bar1{{.*}} section "something" 54*7963e8beSErich Keane bar2()55*7963e8beSErich Keanedouble __declspec(code_seg("foo")) bar2() 56*7963e8beSErich Keane { 57*7963e8beSErich Keane double lala = 4.0; 58*7963e8beSErich Keane auto l = [=](double d) __declspec(code_seg("another")) { return d+4.0; }; 59*7963e8beSErich Keane return l(4.0); 60*7963e8beSErich Keane } 61*7963e8beSErich Keane 62*7963e8beSErich Keane //CHECK: define {{.*}}bar2{{.*}} section "foo" 63*7963e8beSErich Keane //CHECK: define {{.*}}lambda{{.*}}bar2{{.*}} section "another" 64*7963e8beSErich Keane 65*7963e8beSErich Keane 66