1 // RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify
2 
3 // This is a test for a hack in Clang that works around an issue with libc++'s
4 // <valarray> implementation. The <valarray> header contains explicit
5 // instantiations of functions that it declared with the internal_linkage
6 // attribute, which are ill-formed by [temp.explicit]p13 (and meaningless).
7 
8 #ifdef BE_THE_HEADER
9 
10 #pragma GCC system_header
11 namespace std {
12   using size_t = __SIZE_TYPE__;
13   template<typename T> struct valarray {
valarraystd::valarray14     __attribute__((internal_linkage)) valarray(size_t) {}
~valarraystd::valarray15     __attribute__((internal_linkage)) ~valarray() {}
16   };
17 
18   extern template valarray<size_t>::valarray(size_t);
19   extern template valarray<size_t>::~valarray();
20 }
21 
22 #else
23 
24 #define BE_THE_HEADER
25 #include "libcxx_valarray_hack.cpp"
26 
27 template<typename T> struct foo {
xfoo28   __attribute__((internal_linkage)) void x() {};
29 };
30 extern template void foo<int>::x(); // expected-error {{explicit instantiation declaration of 'x' with internal linkage}}
31 
32 #endif
33