diff options
Diffstat (limited to 'test/SemaCXX/libcxx_valarray_hack.cpp')
-rw-r--r-- | test/SemaCXX/libcxx_valarray_hack.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/test/SemaCXX/libcxx_valarray_hack.cpp b/test/SemaCXX/libcxx_valarray_hack.cpp new file mode 100644 index 0000000000..03dc573129 --- /dev/null +++ b/test/SemaCXX/libcxx_valarray_hack.cpp @@ -0,0 +1,32 @@ +// 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 |