1*7963e8beSErich Keane // RUN: %clang_cc1 -emit-llvm -triple i686-pc-win32 -std=c++11 -fms-extensions -verify -o - %s | FileCheck %s 2*7963e8beSErich Keane // expected-no-diagnostics 3*7963e8beSErich Keane 4*7963e8beSErich Keane // Class member templates 5*7963e8beSErich Keane 6*7963e8beSErich Keane #pragma code_seg(push, "something") 7*7963e8beSErich Keane 8*7963e8beSErich Keane template <typename T> 9*7963e8beSErich Keane struct __declspec(code_seg("foo_one")) ClassOne { bar1ClassOne10*7963e8beSErich Keane int bar1(T t) { return int(t); } 11*7963e8beSErich Keane int bar2(T t); 12*7963e8beSErich Keane int bar3(T t); 13*7963e8beSErich Keane }; 14*7963e8beSErich Keane 15*7963e8beSErich Keane template <typename T> bar2(T t)16*7963e8beSErich Keaneint ClassOne<T>::bar2(T t) { 17*7963e8beSErich Keane return int(t); 18*7963e8beSErich Keane } 19*7963e8beSErich Keane caller1()20*7963e8beSErich Keaneint caller1() { 21*7963e8beSErich Keane ClassOne<int> coi; 22*7963e8beSErich Keane return coi.bar1(6) + coi.bar2(3); 23*7963e8beSErich Keane } 24*7963e8beSErich Keane 25*7963e8beSErich Keane //CHECK: define {{.*}}bar1@?$ClassOne{{.*}} section "foo_one" 26*7963e8beSErich Keane //CHECK: define {{.*}}bar2@?$ClassOne{{.*}} section "foo_one" 27*7963e8beSErich Keane 28*7963e8beSErich Keane 29*7963e8beSErich Keane template <typename T> 30*7963e8beSErich Keane struct ClassTwo { bar11ClassTwo31*7963e8beSErich Keane int bar11(T t) { return int(t); } 32*7963e8beSErich Keane int bar22(T t); 33*7963e8beSErich Keane int bar33(T t); 34*7963e8beSErich Keane }; 35*7963e8beSErich Keane 36*7963e8beSErich Keane #pragma code_seg("newone") 37*7963e8beSErich Keane 38*7963e8beSErich Keane template <typename T> bar22(T t)39*7963e8beSErich Keaneint ClassTwo<T>::bar22(T t) { 40*7963e8beSErich Keane return int(t); 41*7963e8beSErich Keane } 42*7963e8beSErich Keane 43*7963e8beSErich Keane #pragma code_seg("someother") 44*7963e8beSErich Keane 45*7963e8beSErich Keane template <typename T> bar33(T t)46*7963e8beSErich Keaneint ClassTwo<T>::bar33(T t) { 47*7963e8beSErich Keane return int(t); 48*7963e8beSErich Keane } 49*7963e8beSErich Keane 50*7963e8beSErich Keane #pragma code_seg("yetanother") 51*7963e8beSErich Keane caller2()52*7963e8beSErich Keaneint caller2() { 53*7963e8beSErich Keane ClassTwo<int> coi; 54*7963e8beSErich Keane return coi.bar11(6) + coi.bar22(3) + coi.bar33(44); 55*7963e8beSErich Keane } 56*7963e8beSErich Keane 57*7963e8beSErich Keane //CHECK: define {{.*}}bar11@?$ClassTwo{{.*}} section "something" 58*7963e8beSErich Keane //CHECK: define {{.*}}bar22@?$ClassTwo{{.*}} section "newone" 59*7963e8beSErich Keane //CHECK: define {{.*}}bar33@?$ClassTwo{{.*}} section "someother" 60*7963e8beSErich Keane 61*7963e8beSErich Keane template<> 62*7963e8beSErich Keane struct ClassOne<double> 63*7963e8beSErich Keane { bar44ClassOne64*7963e8beSErich Keane int bar44(double d) { return 1; } 65*7963e8beSErich Keane }; 66*7963e8beSErich Keane template<> 67*7963e8beSErich Keane struct __declspec(code_seg("foo_three")) ClassOne<long> 68*7963e8beSErich Keane { bar55ClassOne69*7963e8beSErich Keane int bar55(long d) { return 1; } 70*7963e8beSErich Keane }; 71*7963e8beSErich Keane 72*7963e8beSErich Keane #pragma code_seg("onemore") caller3()73*7963e8beSErich Keaneint caller3() { 74*7963e8beSErich Keane ClassOne<double> d; 75*7963e8beSErich Keane ClassOne<long> l; 76*7963e8beSErich Keane return d.bar44(1.0)+l.bar55(1); 77*7963e8beSErich Keane } 78*7963e8beSErich Keane 79*7963e8beSErich Keane //CHECK: define {{.*}}bar44{{.*}} section "yetanother" 80*7963e8beSErich Keane //CHECK: define {{.*}}bar55{{.*}} section "foo_three" 81*7963e8beSErich Keane 82*7963e8beSErich Keane 83*7963e8beSErich Keane // Function templates 84*7963e8beSErich Keane template <typename T> bar66(T t)85*7963e8beSErich Keaneint __declspec(code_seg("foo_four")) bar66(T t) { return int(t); } 86*7963e8beSErich Keane 87*7963e8beSErich Keane // specializations do not take the segment from primary 88*7963e8beSErich Keane template<> bar66(int i)89*7963e8beSErich Keaneint bar66(int i) { return 0; } 90*7963e8beSErich Keane 91*7963e8beSErich Keane #pragma code_seg(pop) 92*7963e8beSErich Keane 93*7963e8beSErich Keane template<> bar66(char c)94*7963e8beSErich Keaneint bar66(char c) { return 0; } 95*7963e8beSErich Keane 96*7963e8beSErich Keane struct A1 {int i;}; 97*7963e8beSErich Keane template<> bar66(A1 a)98*7963e8beSErich Keaneint __declspec(code_seg("foo_five")) bar66(A1 a) { return a.i; } 99*7963e8beSErich Keane caller4()100*7963e8beSErich Keaneint caller4() 101*7963e8beSErich Keane { 102*7963e8beSErich Keane // but instantiations do use the section from the primary 103*7963e8beSErich Keane return bar66(0) + bar66(1.0) + bar66('c'); 104*7963e8beSErich Keane } 105*7963e8beSErich Keane //CHECK: define {{.*}}bar66@H{{.*}} section "onemore" 106*7963e8beSErich Keane //CHECK-NOT: define {{.*}}bar66@D{{.*}} section 107*7963e8beSErich Keane //CHECK: define {{.*}}bar66@UA1{{.*}} section "foo_five" 108*7963e8beSErich Keane //CHECK: define {{.*}}bar66@N{{.*}} section "foo_four" 109*7963e8beSErich Keane 110*7963e8beSErich Keane 111*7963e8beSErich Keane 112