1*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc -DLOAD
2*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fvisibility protected -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -DLOAD | FileCheck %s
3*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fvisibility protected -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t
4*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fvisibility protected -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -o - -DLOAD | FileCheck %s
54f4bf7c3SAlexey Bataev 
6*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - -DOMP5 | FileCheck %s --check-prefix HOST5
7*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc -DOMP5
8*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fvisibility protected -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -DOMP5 | FileCheck %s --check-prefix DEV5
9729e242aSAlexey Bataev 
10*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - -DOMP5 | FileCheck %s --check-prefix KMPC-ONLY
114db9dc6fSAlexey Bataev 
12*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - -DOMP5 | FileCheck %s --check-prefix SIMD-ONLY
13*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc -DOMP5
14*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fvisibility protected -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -DOMP5 | FileCheck %s --check-prefix SIMD-ONLY
15729e242aSAlexey Bataev 
16*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc -fopenmp-version=45
17*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fvisibility protected -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -fopenmp-version=45 | FileCheck %s --check-prefix SIMD-ONLY
18*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fvisibility protected -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t -fopenmp-version=45
19*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fvisibility protected -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify -o - -fopenmp-version=45 | FileCheck %s --check-prefix SIMD-ONLY
204f4bf7c3SAlexey Bataev 
214f4bf7c3SAlexey Bataev // expected-no-diagnostics
224f4bf7c3SAlexey Bataev 
234f4bf7c3SAlexey Bataev // SIMD-ONLY-NOT: {{__kmpc|__tgt}}
244db9dc6fSAlexey Bataev // KMPC-ONLY-NOT: __tgt
254f4bf7c3SAlexey Bataev 
262a6f3f5fSAlexey Bataev // CHECK-NOT: define {{.*}}{{baz1|baz4|maini1|Base|virtual_}}
27d2c1dd59SAlexey Bataev // CHECK-DAG: Bake
28d01b7497SAlexey Bataev // CHECK-NOT: @{{hhh|ggg|fff|eee}} =
290dfe9532SJoseph Huber // CHECK-DAG: @flag = protected global i8 undef,
30d01b7497SAlexey Bataev // CHECK-DAG: @aaa = external global i32,
310dfe9532SJoseph Huber // CHECK-DAG: @bbb ={{ protected | }}global i32 0,
328259cc33SAlexey Bataev // CHECK-DAG: weak constant %struct.__tgt_offload_entry { i8* bitcast (i32* @bbb to i8*),
33d01b7497SAlexey Bataev // CHECK-DAG: @ccc = external global i32,
340dfe9532SJoseph Huber // CHECK-DAG: @ddd ={{ protected | }}global i32 0,
35625f59d1SGheorghe-Teodor Bercea // CHECK-DAG: @hhh_decl_tgt_ref_ptr = weak global i32* null
36625f59d1SGheorghe-Teodor Bercea // CHECK-DAG: @ggg_decl_tgt_ref_ptr = weak global i32* null
37625f59d1SGheorghe-Teodor Bercea // CHECK-DAG: @fff_decl_tgt_ref_ptr = weak global i32* null
38625f59d1SGheorghe-Teodor Bercea // CHECK-DAG: @eee_decl_tgt_ref_ptr = weak global i32* null
394f4bf7c3SAlexey Bataev // CHECK-DAG: @{{.*}}maini1{{.*}}aaa = internal global i64 23,
40cbe8b57aSJohannes Doerfert // CHECK-DAG: @pair = {{.*}}addrspace(3) global %struct.PAIR undef
410dfe9532SJoseph Huber // CHECK-DAG: @_ZN2SS3SSSE ={{ protected | }}global i32 1,
420dfe9532SJoseph Huber // CHECK-DAG: @b ={{ protected | }}global i32 15,
430dfe9532SJoseph Huber // CHECK-DAG: @d ={{ protected | }}global i32 0,
444f4bf7c3SAlexey Bataev // CHECK-DAG: @c = external global i32,
450dfe9532SJoseph Huber // CHECK-DAG: @globals ={{ protected | }}global %struct.S zeroinitializer,
463823514bSAlexey Bataev // CHECK-DAG: [[STAT:@.+stat]] = internal global %struct.S zeroinitializer,
473823514bSAlexey Bataev // CHECK-DAG: [[STAT_REF:@.+]] = internal constant %struct.S* [[STAT]]
480dfe9532SJoseph Huber // CHECK-DAG: @out_decl_target ={{ protected | }}global i32 0,
493823514bSAlexey Bataev // CHECK-DAG: @llvm.compiler.used = appending global [1 x i8*] [i8* bitcast (%struct.S** [[STAT_REF]] to i8*)],
504f4bf7c3SAlexey Bataev 
516d944109SAlexey Bataev // CHECK-DAG: define {{.*}}i32 @{{.*}}{{foo|bar|baz2|baz3|FA|f_method}}{{.*}}()
5269cd776eSCJ Johnson // CHECK-DAG: define {{.*}}void @{{.*}}TemplateClass{{.*}}(%class.TemplateClass* {{[^,]*}} %{{.*}})
5369cd776eSCJ Johnson // CHECK-DAG: define {{.*}}i32 @{{.*}}TemplateClass{{.*}}f_method{{.*}}(%class.TemplateClass* {{[^,]*}} %{{.*}})
54729e242aSAlexey Bataev // CHECK-DAG: define {{.*}}void @__omp_offloading__{{.*}}_globals_l[[@LINE+78]]_ctor()
554f4bf7c3SAlexey Bataev 
564f4bf7c3SAlexey Bataev #ifndef HEADER
574f4bf7c3SAlexey Bataev #define HEADER
58d01b7497SAlexey Bataev #pragma omp declare target
59f6f21dcdSAlexey Bataev bool flag [[clang::loader_uninitialized]];
608259cc33SAlexey Bataev extern int bbb;
618259cc33SAlexey Bataev #pragma omp end declare target
628259cc33SAlexey Bataev #pragma omp declare target
638259cc33SAlexey Bataev extern int bbb;
648259cc33SAlexey Bataev #pragma omp end declare target
658259cc33SAlexey Bataev 
668259cc33SAlexey Bataev #pragma omp declare target
67d01b7497SAlexey Bataev extern int aaa;
68d01b7497SAlexey Bataev int bbb = 0;
69d01b7497SAlexey Bataev extern int ccc;
70d01b7497SAlexey Bataev int ddd = 0;
71d01b7497SAlexey Bataev #pragma omp end declare target
72d01b7497SAlexey Bataev 
738259cc33SAlexey Bataev #pragma omp declare target
748259cc33SAlexey Bataev extern int bbb;
758259cc33SAlexey Bataev #pragma omp end declare target
768259cc33SAlexey Bataev 
77d01b7497SAlexey Bataev extern int eee;
78d01b7497SAlexey Bataev int fff = 0;
79d01b7497SAlexey Bataev extern int ggg;
80d01b7497SAlexey Bataev int hhh = 0;
81d01b7497SAlexey Bataev #pragma omp declare target link(eee, fff, ggg, hhh)
82d01b7497SAlexey Bataev 
83bf8fe71bSAlexey Bataev int out_decl_target = 0;
84729e242aSAlexey Bataev #ifdef OMP5
85729e242aSAlexey Bataev #pragma omp declare target(out_decl_target)
86729e242aSAlexey Bataev #endif
87729e242aSAlexey Bataev 
88bf8fe71bSAlexey Bataev #pragma omp declare target
lambda()89bf8fe71bSAlexey Bataev void lambda () {
90bf8fe71bSAlexey Bataev #ifdef __cpp_lambdas
91bf8fe71bSAlexey Bataev   (void)[&] { (void)out_decl_target; };
92bf8fe71bSAlexey Bataev #else
93bf8fe71bSAlexey Bataev #pragma clang __debug captured
94bf8fe71bSAlexey Bataev   {
95bf8fe71bSAlexey Bataev     (void)out_decl_target;
96bf8fe71bSAlexey Bataev   }
97bf8fe71bSAlexey Bataev #endif
98bf8fe71bSAlexey Bataev };
99bf8fe71bSAlexey Bataev #pragma omp end declare target
100bf8fe71bSAlexey Bataev 
1016d944109SAlexey Bataev template <typename T>
1026d944109SAlexey Bataev class TemplateClass {
1036d944109SAlexey Bataev   T a;
1046d944109SAlexey Bataev public:
TemplateClass()1056d944109SAlexey Bataev   TemplateClass() {}
f_method() const1066d944109SAlexey Bataev   T f_method() const { return a; }
1076d944109SAlexey Bataev };
1086d944109SAlexey Bataev 
1094f4bf7c3SAlexey Bataev int foo();
1104f4bf7c3SAlexey Bataev 
baz1()111bd8ff9bdSAlexey Bataev static int baz1() { return 0; }
1124f4bf7c3SAlexey Bataev 
1134f4bf7c3SAlexey Bataev int baz2();
1144f4bf7c3SAlexey Bataev 
baz4()1154f4bf7c3SAlexey Bataev int baz4() { return 5; }
1164f4bf7c3SAlexey Bataev 
117fb38828cSAlexey Bataev template <typename T>
FA()118fb38828cSAlexey Bataev T FA() {
1196d944109SAlexey Bataev   TemplateClass<T> s;
1206d944109SAlexey Bataev   return s.f_method();
121fb38828cSAlexey Bataev }
122fb38828cSAlexey Bataev 
1234f4bf7c3SAlexey Bataev #pragma omp declare target
124dadf2d12SAlexey Bataev struct S {
125dadf2d12SAlexey Bataev   int a;
SS126dadf2d12SAlexey Bataev   S(int a) : a(a) {}
127dadf2d12SAlexey Bataev };
128dadf2d12SAlexey Bataev 
foo()1294f4bf7c3SAlexey Bataev int foo() { return 0; }
1304f4bf7c3SAlexey Bataev int b = 15;
1314f4bf7c3SAlexey Bataev int d;
132e253f2f8SAlexey Bataev S globals(d);
1332f5b2671SAlexey Bataev static S stat(d);
1344f4bf7c3SAlexey Bataev #pragma omp end declare target
1354f4bf7c3SAlexey Bataev int c;
1364f4bf7c3SAlexey Bataev 
bar()1374f4bf7c3SAlexey Bataev int bar() { return 1 + foo() + bar() + baz1() + baz2(); }
1384f4bf7c3SAlexey Bataev 
maini1()1394f4bf7c3SAlexey Bataev int maini1() {
1404f4bf7c3SAlexey Bataev   int a;
141d01b7497SAlexey Bataev   static long aa = 32 + bbb + ccc + fff + ggg;
142b9f67d44SJoseph Huber // CHECK-DAG: define weak_odr void @__omp_offloading_{{.*}}maini1{{.*}}_l[[@LINE+1]](i32* noundef nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %{{.*}}, i64 {{.*}}, i64 {{.*}})
1434f4bf7c3SAlexey Bataev #pragma omp target map(tofrom \
1442c1dffecSAlexey Bataev                        : a, b)
1454f4bf7c3SAlexey Bataev   {
146dadf2d12SAlexey Bataev     S s(a);
1474f4bf7c3SAlexey Bataev     static long aaa = 23;
148fb38828cSAlexey Bataev     a = foo() + bar() + b + c + d + aa + aaa + FA<int>();
1494f4bf7c3SAlexey Bataev   }
1504f4bf7c3SAlexey Bataev   return baz4();
1514f4bf7c3SAlexey Bataev }
1524f4bf7c3SAlexey Bataev 
baz3()153fb38828cSAlexey Bataev int baz3() { return 2 + baz2(); }
baz2()1544f4bf7c3SAlexey Bataev int baz2() {
155b9f67d44SJoseph Huber // CHECK-DAG: define weak_odr void @__omp_offloading_{{.*}}baz2{{.*}}_l[[@LINE+1]](i64 {{.*}})
1564ac68a21SAlexey Bataev #pragma omp target parallel
1574f4bf7c3SAlexey Bataev   ++c;
1584f4bf7c3SAlexey Bataev   return 2 + baz3();
1594f4bf7c3SAlexey Bataev }
1604f4bf7c3SAlexey Bataev 
1617f792cabSAlexey Bataev extern int create() throw();
1627f792cabSAlexey Bataev 
1637f792cabSAlexey Bataev static __typeof(create) __t_create __attribute__((__weakref__("__create")));
1647f792cabSAlexey Bataev 
baz5()1657f792cabSAlexey Bataev int baz5() {
1667f792cabSAlexey Bataev   bool a;
167b9f67d44SJoseph Huber // CHECK-DAG: define weak_odr void @__omp_offloading_{{.*}}baz5{{.*}}_l[[@LINE+1]](i64 {{.*}})
1687f792cabSAlexey Bataev #pragma omp target
1697f792cabSAlexey Bataev   a = __extension__(void *) & __t_create != 0;
1707f792cabSAlexey Bataev   return a;
1717f792cabSAlexey Bataev }
1727f792cabSAlexey Bataev 
173d2c1dd59SAlexey Bataev template <typename T>
174d2c1dd59SAlexey Bataev struct Base {
~BaseBase175d2c1dd59SAlexey Bataev   virtual ~Base() {}
176d2c1dd59SAlexey Bataev };
177d2c1dd59SAlexey Bataev 
178d2c1dd59SAlexey Bataev template class Base<int>;
179d2c1dd59SAlexey Bataev 
180d2c1dd59SAlexey Bataev template <typename T>
181d2c1dd59SAlexey Bataev struct Bake {
~BakeBake182d2c1dd59SAlexey Bataev   virtual ~Bake() {}
183d2c1dd59SAlexey Bataev };
184d2c1dd59SAlexey Bataev 
185d2c1dd59SAlexey Bataev #pragma omp declare target
186d2c1dd59SAlexey Bataev template class Bake<int>;
187d2c1dd59SAlexey Bataev #pragma omp end declare target
188d2c1dd59SAlexey Bataev 
189f898d1deSAlexey Bataev struct BaseNonT {
~BaseNonTBaseNonT190f898d1deSAlexey Bataev   virtual ~BaseNonT() {}
191f898d1deSAlexey Bataev };
192f898d1deSAlexey Bataev 
193f898d1deSAlexey Bataev #pragma omp declare target
194f898d1deSAlexey Bataev struct BakeNonT {
~BakeNonTBakeNonT195f898d1deSAlexey Bataev   virtual ~BakeNonT() {}
196f898d1deSAlexey Bataev };
197f898d1deSAlexey Bataev #pragma omp end declare target
198f898d1deSAlexey Bataev 
1992a6f3f5fSAlexey Bataev template <typename T>
2002a6f3f5fSAlexey Bataev struct B {
2012a6f3f5fSAlexey Bataev   virtual void virtual_foo();
2022a6f3f5fSAlexey Bataev };
2032a6f3f5fSAlexey Bataev 
new_bar()2042a6f3f5fSAlexey Bataev void new_bar() { new B<int>(); }
2052a6f3f5fSAlexey Bataev 
2062a6f3f5fSAlexey Bataev template <typename T>
virtual_foo()2072a6f3f5fSAlexey Bataev void B<T>::virtual_foo() {
2082a6f3f5fSAlexey Bataev #pragma omp target
2092a6f3f5fSAlexey Bataev   {}
2102a6f3f5fSAlexey Bataev }
2112a6f3f5fSAlexey Bataev 
212719713abSAlexey Bataev struct A {
emittedA213719713abSAlexey Bataev   virtual void emitted() {}
214719713abSAlexey Bataev };
215719713abSAlexey Bataev 
216719713abSAlexey Bataev template <typename T>
217719713abSAlexey Bataev struct C : public A {
218719713abSAlexey Bataev   virtual void emitted();
219719713abSAlexey Bataev };
220719713abSAlexey Bataev 
221719713abSAlexey Bataev template <typename T>
emitted()222719713abSAlexey Bataev void C<T>::emitted() {
223719713abSAlexey Bataev #pragma omp target
224719713abSAlexey Bataev   {}
225719713abSAlexey Bataev }
226719713abSAlexey Bataev 
main()227719713abSAlexey Bataev int main() {
228719713abSAlexey Bataev   A *X = new C<int>();
229719713abSAlexey Bataev   X->emitted();
230719713abSAlexey Bataev   return 0;
231719713abSAlexey Bataev }
232719713abSAlexey Bataev 
233719713abSAlexey Bataev // CHECK-DAG: define {{.*}}void @__omp_offloading_{{.*}}virtual_foo{{.*}}_l[[@LINE-25]]()
234719713abSAlexey Bataev // CHECK-DAG: define {{.*}}void @__omp_offloading_{{.*}}emitted{{.*}}_l[[@LINE-11]]()
235719713abSAlexey Bataev 
236b841b9e9SAlexey Bataev template <typename T>
237b841b9e9SAlexey Bataev struct TTT {
emittedTTT238b841b9e9SAlexey Bataev   virtual void emitted() {
239b841b9e9SAlexey Bataev #pragma omp target
240b841b9e9SAlexey Bataev   {}
241b841b9e9SAlexey Bataev   }
242b841b9e9SAlexey Bataev };
243b841b9e9SAlexey Bataev 
244b841b9e9SAlexey Bataev // CHECK-DAG: define {{.*}}void @__omp_offloading_{{.*}}emitted{{.*}}_l[[@LINE-5]]()
245b841b9e9SAlexey Bataev 
2461b1c8d83Shyeongyu kim // CHECK-DAG: declare extern_weak noundef signext i32 @__create()
2477f792cabSAlexey Bataev 
2482a6f3f5fSAlexey Bataev // CHECK-NOT: define {{.*}}{{baz1|baz4|maini1|Base|virtual_}}
249b4dd6d24SAlexey Bataev 
250b4dd6d24SAlexey Bataev // CHECK-DAG: !{i32 1, !"aaa", i32 0, i32 {{[0-9]+}}}
251b4dd6d24SAlexey Bataev // CHECK-DAG: !{i32 1, !"ccc", i32 0, i32 {{[0-9]+}}}
2522a6f3f5fSAlexey Bataev // CHECK-DAG: !{{{.+}}virtual_foo
253b4dd6d24SAlexey Bataev 
254729e242aSAlexey Bataev #ifdef OMP5
host_fun()255729e242aSAlexey Bataev void host_fun() {}
256729e242aSAlexey Bataev #pragma omp declare target to(host_fun) device_type(host)
device_fun()257729e242aSAlexey Bataev void device_fun() {}
258729e242aSAlexey Bataev #pragma omp declare target to(device_fun) device_type(nohost)
259729e242aSAlexey Bataev // HOST5-NOT: define {{.*}}void {{.*}}device_fun{{.*}}
260729e242aSAlexey Bataev // HOST5: define {{.*}}void {{.*}}host_fun{{.*}}
261729e242aSAlexey Bataev // HOST5-NOT: define {{.*}}void {{.*}}device_fun{{.*}}
262729e242aSAlexey Bataev 
263729e242aSAlexey Bataev // DEV5-NOT: define {{.*}}void {{.*}}host_fun{{.*}}
264729e242aSAlexey Bataev // DEV5: define {{.*}}void {{.*}}device_fun{{.*}}
265729e242aSAlexey Bataev // DEV5-NOT: define {{.*}}void {{.*}}host_fun{{.*}}
266729e242aSAlexey Bataev #endif // OMP5
267729e242aSAlexey Bataev 
268cbe8b57aSJohannes Doerfert struct PAIR {
269cbe8b57aSJohannes Doerfert   int a;
270cbe8b57aSJohannes Doerfert   int b;
271cbe8b57aSJohannes Doerfert };
272cbe8b57aSJohannes Doerfert 
273cbe8b57aSJohannes Doerfert #pragma omp declare target
274cbe8b57aSJohannes Doerfert PAIR pair __attribute__((address_space(3), loader_uninitialized));
275cbe8b57aSJohannes Doerfert #pragma omp end declare target
276cbe8b57aSJohannes Doerfert 
2774f4bf7c3SAlexey Bataev #endif // HEADER
278b841b9e9SAlexey Bataev 
279b841b9e9SAlexey Bataev #ifdef LOAD
280b841b9e9SAlexey Bataev #pragma omp declare target
new_bar1()281b841b9e9SAlexey Bataev void new_bar1() {
282b841b9e9SAlexey Bataev   TTT<int> *X = new TTT<int>();
283b841b9e9SAlexey Bataev   X->emitted();
284b841b9e9SAlexey Bataev }
285b841b9e9SAlexey Bataev #pragma omp end declare target
286ca6c9e43SJoseph Huber 
287ca6c9e43SJoseph Huber struct SS {
288ca6c9e43SJoseph Huber #pragma omp declare target
289ca6c9e43SJoseph Huber   static int SSS;
290ca6c9e43SJoseph Huber #pragma omp end declare target
291ca6c9e43SJoseph Huber };
292ca6c9e43SJoseph Huber int SS::SSS = 1;
2930dfe9532SJoseph Huber 
294b841b9e9SAlexey Bataev #endif
295