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