llvm-project/clang/test/Modules/Inputs/cxx-templates-unimported.h
Richard Smith 6739a10cec [modules] Enforce the rules that an explicit or partial specialization must be
declared before it is used. Because we don't use normal name lookup to find
these, the normal code to filter out non-visible names from name lookup results
does not apply.

llvm-svn: 268585
2016-05-05 00:56:12 +00:00

44 lines
1.2 KiB
C++

#include "cxx-templates-common.h"
namespace hidden_specializations {
// explicit specializations
template<> void fn<int>() {}
template<> struct cls<int> {
void nested_fn();
struct nested_cls;
static int nested_var;
enum nested_enum : int;
};
template<> int var<int>;
// partial specializations
template<typename T> struct cls<T*> {
void nested_fn();
struct nested_cls;
static int nested_var;
enum nested_enum : int;
};
template<typename T> int var<T*>;
// member specializations
template<> void cls<void>::nested_fn() {}
template<> struct cls<void>::nested_cls {};
template<> int cls<void>::nested_var;
template<> enum class cls<void>::nested_enum { e };
template<> template<typename U> void cls<void>::nested_fn_t() {}
template<> template<typename U> struct cls<void>::nested_cls_t {};
template<> template<typename U> int cls<void>::nested_var_t;
// specializations instantiated here are ok if their pattern is
inline void use_stuff() {
fn<char>();
cls<char>();
(void)var<char>;
cls<char*>();
(void)var<char*>;
cls<void>::nested_fn_t<char>();
cls<void>::nested_cls_t<char>();
(void)cls<void>::nested_var_t<char>;
}
}