| // RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify |
| |
| // This is a test for a hack in Clang that works around an issue with libc++'s |
| // <valarray> implementation. The <valarray> header contains explicit |
| // instantiations of functions that it declared with the internal_linkage |
| // attribute, which are ill-formed by [temp.explicit]p13 (and meaningless). |
| |
| #ifdef BE_THE_HEADER |
| |
| #pragma GCC system_header |
| namespace std { |
| using size_t = __SIZE_TYPE__; |
| template<typename T> struct valarray { |
| __attribute__((internal_linkage)) valarray(size_t) {} |
| __attribute__((internal_linkage)) ~valarray() {} |
| }; |
| |
| extern template valarray<size_t>::valarray(size_t); |
| extern template valarray<size_t>::~valarray(); |
| } |
| |
| #else |
| |
| #define BE_THE_HEADER |
| #include "libcxx_valarray_hack.cpp" |
| |
| template<typename T> struct foo { |
| __attribute__((internal_linkage)) void x() {}; |
| }; |
| extern template void foo<int>::x(); // expected-error {{explicit instantiation declaration of 'x' with internal linkage}} |
| |
| #endif |