summaryrefslogtreecommitdiff
path: root/test/CodeGenCXX/code-seg2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGenCXX/code-seg2.cpp')
-rw-r--r--test/CodeGenCXX/code-seg2.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/test/CodeGenCXX/code-seg2.cpp b/test/CodeGenCXX/code-seg2.cpp
new file mode 100644
index 0000000000000..ab72bf44cb89e
--- /dev/null
+++ b/test/CodeGenCXX/code-seg2.cpp
@@ -0,0 +1,111 @@
+// RUN: %clang_cc1 -emit-llvm -triple i686-pc-win32 -std=c++11 -fms-extensions -verify -o - %s | FileCheck %s
+// expected-no-diagnostics
+
+// Class member templates
+
+#pragma code_seg(push, "something")
+
+template <typename T>
+struct __declspec(code_seg("foo_one")) ClassOne {
+ int bar1(T t) { return int(t); }
+ int bar2(T t);
+ int bar3(T t);
+};
+
+template <typename T>
+int ClassOne<T>::bar2(T t) {
+ return int(t);
+}
+
+int caller1() {
+ ClassOne<int> coi;
+ return coi.bar1(6) + coi.bar2(3);
+}
+
+//CHECK: define {{.*}}bar1@?$ClassOne{{.*}} section "foo_one"
+//CHECK: define {{.*}}bar2@?$ClassOne{{.*}} section "foo_one"
+
+
+template <typename T>
+struct ClassTwo {
+ int bar11(T t) { return int(t); }
+ int bar22(T t);
+ int bar33(T t);
+};
+
+#pragma code_seg("newone")
+
+template <typename T>
+int ClassTwo<T>::bar22(T t) {
+ return int(t);
+}
+
+#pragma code_seg("someother")
+
+template <typename T>
+int ClassTwo<T>::bar33(T t) {
+ return int(t);
+}
+
+#pragma code_seg("yetanother")
+
+int caller2() {
+ ClassTwo<int> coi;
+ return coi.bar11(6) + coi.bar22(3) + coi.bar33(44);
+}
+
+//CHECK: define {{.*}}bar11@?$ClassTwo{{.*}} section "something"
+//CHECK: define {{.*}}bar22@?$ClassTwo{{.*}} section "newone"
+//CHECK: define {{.*}}bar33@?$ClassTwo{{.*}} section "someother"
+
+template<>
+struct ClassOne<double>
+{
+ int bar44(double d) { return 1; }
+};
+template<>
+struct __declspec(code_seg("foo_three")) ClassOne<long>
+{
+ int bar55(long d) { return 1; }
+};
+
+#pragma code_seg("onemore")
+int caller3() {
+ ClassOne<double> d;
+ ClassOne<long> l;
+ return d.bar44(1.0)+l.bar55(1);
+}
+
+//CHECK: define {{.*}}bar44{{.*}} section "yetanother"
+//CHECK: define {{.*}}bar55{{.*}} section "foo_three"
+
+
+// Function templates
+template <typename T>
+int __declspec(code_seg("foo_four")) bar66(T t) { return int(t); }
+
+// specializations do not take the segment from primary
+template<>
+int bar66(int i) { return 0; }
+
+#pragma code_seg(pop)
+
+template<>
+int bar66(char c) { return 0; }
+
+struct A1 {int i;};
+template<>
+int __declspec(code_seg("foo_five")) bar66(A1 a) { return a.i; }
+
+int caller4()
+{
+// but instantiations do use the section from the primary
+return bar66(0) + bar66(1.0) + bar66('c');
+}
+//CHECK: define {{.*}}bar66@H{{.*}} section "onemore"
+//CHECK-NOT: define {{.*}}bar66@D{{.*}} section
+//CHECK: define {{.*}}bar66@UA1{{.*}} section "foo_five"
+//CHECK: define {{.*}}bar66@N{{.*}} section "foo_four"
+
+
+