diff options
Diffstat (limited to 'clang/test/SemaCXX')
-rw-r--r-- | clang/test/SemaCXX/PR10177.cpp | 3 | ||||
-rw-r--r-- | clang/test/SemaCXX/libcxx_valarray_hack.cpp | 32 |
2 files changed, 33 insertions, 2 deletions
diff --git a/clang/test/SemaCXX/PR10177.cpp b/clang/test/SemaCXX/PR10177.cpp index 59630be5088..0d2e792f522 100644 --- a/clang/test/SemaCXX/PR10177.cpp +++ b/clang/test/SemaCXX/PR10177.cpp @@ -57,11 +57,10 @@ namespace N { } #else -// expected-no-diagnostics namespace { template<typename> extern int n; } template<typename T> int g() { return n<int>; } -namespace { extern template int n<int>; } +namespace { extern template int n<int>; } // expected-error {{explicit instantiation declaration of 'n<int>' with internal linkage}} #endif diff --git a/clang/test/SemaCXX/libcxx_valarray_hack.cpp b/clang/test/SemaCXX/libcxx_valarray_hack.cpp new file mode 100644 index 00000000000..03dc5731299 --- /dev/null +++ b/clang/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 |