1 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -std=c++1y -O1 -disable-llvm-passes %s -o - | FileCheck %s -check-prefix=CHECKA -check-prefix=CHECK
2 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -std=c++1y -O1 -disable-llvm-passes -fcxx-exceptions %s -o - | FileCheck %s -check-prefix=CHECKB -check-prefix=CHECK
3 // expected-no-diagnostics
4
5 // The variable template specialization x<Foo> generated in each file
6 // should be 'internal global' and not 'linkonce_odr global'.
7
8 template <typename T> int x = 42;
9 // CHECK-DAG: @_Z1xIiE = linkonce_odr global
10 // CHECK-DAG: @_Z1xIZL3foovE3FooE = internal global
11
12 // 'static' affects the linkage of the global
13 template <typename T> static int y = 42;
14 // CHECK-DAG: @_ZL1yIiE = internal global
15 // CHECK-DAG: @_ZL1yIZL3foovE3FooE = internal global
16
17 // 'const' does not
18 template <typename T> const int z = 42;
19 // CHECK-DAG: @_Z1zIiE = linkonce_odr constant
20 // CHECK-DAG: @_Z1zIZL3foovE3FooE = internal constant
21
22 template <typename T> T t = 42;
23 // CHECK-DAG: @_Z1tIiE = linkonce_odr global
24 // CHECK-DAG: @_Z1tIKiE = linkonce_odr constant
25
26 int mode;
27
28 // CHECK-DAG: define internal nonnull align 4 dereferenceable(4) i32* @_ZL3foov(
foo()29 static const int &foo() {
30 struct Foo { };
31
32 switch (mode) {
33 case 0:
34 // CHECK-DAG: @_Z1xIiE
35 return x<int>;
36 case 1:
37 // CHECK-DAG: @_Z1xIZL3foovE3FooE
38 return x<Foo>;
39 case 2:
40 // CHECK-DAG: @_ZL1yIiE
41 return y<int>;
42 case 3:
43 // CHECK-DAG: @_ZL1yIZL3foovE3FooE
44 return y<Foo>;
45 case 4:
46 // CHECK-DAG: @_Z1zIiE
47 return z<int>;
48 case 5:
49 // CHECK-DAG: @_Z1zIZL3foovE3FooE
50 return z<Foo>;
51 case 6:
52 // CHECK-DAG: @_Z1tIiE
53 return t<int>;
54 case 7:
55 // CHECK-DAG: @_Z1tIKiE
56 return t<const int>;
57 }
58 }
59
60
61 #if !__has_feature(cxx_exceptions) // File A
62 // CHECKA-DAG: define{{.*}} nonnull align 4 dereferenceable(4) i32* @_Z3barv(
bar()63 const int &bar() {
64 // CHECKA-DAG: call nonnull align 4 dereferenceable(4) i32* @_ZL3foov()
65 return foo();
66 }
67
68 #else // File B
69
70 // CHECKB-DAG: declare nonnull align 4 dereferenceable(4) i32* @_Z3barv(
71 const int &bar();
72
main()73 int main() {
74 // CHECKB-DAG: call nonnull align 4 dereferenceable(4) i32* @_Z3barv()
75 // CHECKB-DAG: call nonnull align 4 dereferenceable(4) i32* @_ZL3foov()
76 &bar() == &foo() ? throw 0 : (void)0; // Should not throw exception at runtime.
77 }
78
79 #endif // end of Files A and B
80
81