33 lines
998 B
C++
33 lines
998 B
C++
|
// 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
|