158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainartemplate <typename T>
458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstruct HasStaticInit {
558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic const int index;
658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar};
758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarextern "C"
858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarint the_count = 0;
958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainartemplate <typename T>
1058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarconst int HasStaticInit<T>::index = the_count++;
1158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
1258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainartemplate <typename T> int func_tmpl1() { return HasStaticInit<T>::index; }
1358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainartemplate <typename T> int func_tmpl2() { return HasStaticInit<T>::index; }
1458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainartemplate <typename T> int func_tmpl3() { return HasStaticInit<T>::index; }
1558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarvoid useit() {
1658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  func_tmpl1<int>();
1758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  func_tmpl2<int>();
1858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  func_tmpl3<int>();
1958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
2058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
2158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// Throw in a final explicit instantiation to see that it doesn't screw things
2258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// up.
2358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainartemplate struct HasStaticInit<int>;
2458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
2558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// There should only be one entry, not 3.
2658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }]
2758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
2858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// There should only be one update to @the_count.
2958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK-NOT: store i32 %{{.*}}, i32* @the_count
3058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK: store i32 %{{.*}}, i32* @the_count
3158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK-NOT: store i32 %{{.*}}, i32* @the_count
32