brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 1fb57db Raw
63 lines · cpp
1// RUN: %clang_cc1 %s -verify2 3#if !__has_cpp_attribute(clang::no_specializations)4#  error5#endif6 7struct [[clang::no_specializations]] S {}; // expected-warning {{'clang::no_specializations' attribute only applies to class templates, function templates, and variable templates}}8 9template <class T, class U>10struct [[clang::no_specializations]] is_same { // expected-note 2 {{marked 'clang::no_specializations' here}}11  static constexpr bool value = __is_same(T, U);12};13 14template <class T>15using alias [[clang::no_specializations]] = T; // expected-warning {{'clang::no_specializations' attribute only applies to class templates, function templates, and variable templates}}16 17template <>18struct is_same<int, char> {}; // expected-error {{'is_same' cannot be specialized}}19 20template <class>21struct Template {};22 23template <class T>24struct is_same<Template<T>, Template <T>> {}; // expected-error {{'is_same' cannot be specialized}}25 26bool test_instantiation1 = is_same<int, int>::value;27 28template <class T, class U>29[[clang::no_specializations]] inline constexpr bool is_same_v = __is_same(T, U); // expected-note 2 {{marked 'clang::no_specializations' here}}30 31template <>32inline constexpr bool is_same_v<int, char> = false; // expected-error {{'is_same_v' cannot be specialized}}33 34template <class T>35inline constexpr bool is_same_v<Template <T>, Template <T>> = true; // expected-error {{'is_same_v' cannot be specialized}}36 37bool test_instantiation2 = is_same_v<int, int>;38 39template <class T>40struct [[clang::no_specializations("specializing type traits results in undefined behaviour")]] is_trivial { // expected-note {{marked 'clang::no_specializations' here}}41  static constexpr bool value = __is_trivial(T);42};43 44template <>45struct is_trivial<int> {}; // expected-error {{'is_trivial' cannot be specialized: specializing type traits results in undefined behaviour}}46 47template <class T>48[[clang::no_specializations("specializing type traits results in undefined behaviour")]] inline constexpr bool is_trivial_v = __is_trivial(T); // expected-note {{marked 'clang::no_specializations' here}}49 50template <>51inline constexpr bool is_trivial_v<int> = false; // expected-error {{'is_trivial_v' cannot be specialized: specializing type traits results in undefined behaviour}}52 53template <class T>54struct Partial {};55 56template <class T>57struct [[clang::no_specializations]] Partial<Template <T>> {}; // expected-warning {{'clang::no_specializations' attribute only applies to class templates, function templates, and variable templates}}58 59template <class T>60[[clang::no_specializations]] void func(); // expected-note {{marked 'clang::no_specializations' here}}61 62template <> void func<int>(); // expected-error {{'func' cannot be specialized}}63