diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:04:05 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:04:05 +0000 |
| commit | 676fbe8105eeb6ff4bb2ed261cb212fcfdbe7b63 (patch) | |
| tree | 02a1ac369cb734d0abfa5000dd86e5b7797e6a74 /test/SemaCXX/attr-exclude_from_explicit_instantiation.explicit_instantiation.cpp | |
| parent | c7e70c433efc6953dc3888b9fbf9f3512d7da2b0 (diff) | |
Notes
Diffstat (limited to 'test/SemaCXX/attr-exclude_from_explicit_instantiation.explicit_instantiation.cpp')
| -rw-r--r-- | test/SemaCXX/attr-exclude_from_explicit_instantiation.explicit_instantiation.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/test/SemaCXX/attr-exclude_from_explicit_instantiation.explicit_instantiation.cpp b/test/SemaCXX/attr-exclude_from_explicit_instantiation.explicit_instantiation.cpp new file mode 100644 index 000000000000..379ab0a3eb00 --- /dev/null +++ b/test/SemaCXX/attr-exclude_from_explicit_instantiation.explicit_instantiation.cpp @@ -0,0 +1,45 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// Test that explicit instantiations do not instantiate entities +// marked with the exclude_from_explicit_instantiation attribute. + +#define EXCLUDE_FROM_EXPLICIT_INSTANTIATION __attribute__((exclude_from_explicit_instantiation)) + +template <class T> +struct Foo { + EXCLUDE_FROM_EXPLICIT_INSTANTIATION inline void non_static_member_function1(); + + EXCLUDE_FROM_EXPLICIT_INSTANTIATION void non_static_member_function2(); + + EXCLUDE_FROM_EXPLICIT_INSTANTIATION static inline void static_member_function1(); + + EXCLUDE_FROM_EXPLICIT_INSTANTIATION static void static_member_function2(); + + EXCLUDE_FROM_EXPLICIT_INSTANTIATION static int static_data_member; + + struct EXCLUDE_FROM_EXPLICIT_INSTANTIATION member_class1 { + static void non_static_member_function() { using Fail = typename T::fail; } + }; + + struct member_class2 { + EXCLUDE_FROM_EXPLICIT_INSTANTIATION static void non_static_member_function() { using Fail = typename T::fail; } + }; +}; + +template <class T> +inline void Foo<T>::non_static_member_function1() { using Fail = typename T::fail; } + +template <class T> +void Foo<T>::non_static_member_function2() { using Fail = typename T::fail; } + +template <class T> +inline void Foo<T>::static_member_function1() { using Fail = typename T::fail; } + +template <class T> +void Foo<T>::static_member_function2() { using Fail = typename T::fail; } + +template <class T> +int Foo<T>::static_data_member = T::fail; + +// expected-no-diagnostics +template struct Foo<int>; |
