xref: /llvm-project/clang/test/CodeGenCXX/code-seg2.cpp (revision 7963e8bebb90543d997bf99ae5f8cf9be579d9ea)
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 Keane int ClassOne<T>::bar2(T t) {
17*7963e8beSErich Keane   return int(t);
18*7963e8beSErich Keane }
19*7963e8beSErich Keane 
caller1()20*7963e8beSErich Keane int 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 Keane int 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 Keane int 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 Keane int 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 Keane int 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 Keane int __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 Keane int 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 Keane int bar66(char c) { return 0; }
95*7963e8beSErich Keane 
96*7963e8beSErich Keane struct A1 {int i;};
97*7963e8beSErich Keane template<>
bar66(A1 a)98*7963e8beSErich Keane int __declspec(code_seg("foo_five")) bar66(A1 a) { return a.i; }
99*7963e8beSErich Keane 
caller4()100*7963e8beSErich Keane int 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