1 // RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
2 
3 template <typename T>
4 struct HasStaticInit {
5 static const int index;
6 };
7 extern "C"
8 int the_count = 0;
9 template <typename T>
10 const int HasStaticInit<T>::index = the_count++;
11 
func_tmpl1()12 template <typename T> int func_tmpl1() { return HasStaticInit<T>::index; }
func_tmpl2()13 template <typename T> int func_tmpl2() { return HasStaticInit<T>::index; }
func_tmpl3()14 template <typename T> int func_tmpl3() { return HasStaticInit<T>::index; }
useit()15 void useit() {
16   func_tmpl1<int>();
17   func_tmpl2<int>();
18   func_tmpl3<int>();
19 }
20 
21 // Throw in a final explicit instantiation to see that it doesn't screw things
22 // up.
23 template struct HasStaticInit<int>;
24 
25 // There should only be one entry, not 3.
26 // CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }]
27 
28 // There should only be one update to @the_count.
29 // CHECK-NOT: store i32 %{{.*}}, i32* @the_count
30 // CHECK: store i32 %{{.*}}, i32* @the_count
31 // CHECK-NOT: store i32 %{{.*}}, i32* @the_count
32