mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 20:16:05 +00:00

internal linkage entities. Such constructs are ill-formed by [temp.explicit]p13. We make a special exception to permit an invalid construct used by libc++ in some build modes: its <valarray> header declares some functions with the internal_linkage attribute and then (meaninglessly) provides explicit instantiation declarations for them. Luckily, Clang happens to effectively ignore the explicit instantiation declaration when generating code in this case, and this change codifies that behavior. This reinstates part of r359048, reverted in r359076. (The libc++ issue triggering the rollback has been addressed.) llvm-svn: 359259
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
|