// RUN: %clang_cc1 -fsyntax-only -verify %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 %s // RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s // Tests that dependent expressions are always allowed, whereas non-dependent // are checked as usual. #include // Fake typeid, lacking a typeinfo header. namespace std { class type_info {}; } struct dummy {}; // expected-note 3 {{candidate constructor (the implicit copy constructor)}} #if __cplusplus >= 201103L // C++11 or later // expected-note@-2 3 {{candidate constructor (the implicit move constructor) not viable}} #endif template int f0(T x) { return (sizeof(x) == sizeof(int))? 0 : (sizeof(x) == sizeof(double))? 1 : 2; } template T f1(T t1, U u1, int i1, T** tpp) { T t2 = i1; t2 = i1 + u1; ++u1; u1++; int i2 = u1; i1 = t1[u1]; i1 *= t1; i1(u1, t1); u1(i1, t1); U u2 = (T)i1; static_cast(static_cast(reinterpret_cast( dynamic_cast(const_cast(i1))))); new U(i1, t1); new int(t1, u1); new (t1, u1) int; delete t1; dummy d1 = sizeof(t1); // expected-error {{no viable conversion}} dummy d2 = offsetof(T, foo); // expected-error {{no viable conversion}} dummy d3 = __alignof(u1); // expected-error {{no viable conversion}} i1 = typeid(t1); // expected-error {{assigning to 'int' from incompatible type 'const std::type_info'}} i1 = tpp[0].size(); // expected-error {{'T *' is not a structure or union}} return u1; } template void f2(__restrict T x) {} // expected-note {{substitution failure [with T = int]: restrict requires a pointer or reference ('int' is invalid}} void f3() { f2(0); f2(0); // expected-error {{no matching function for call to 'f2'}} } #if __cplusplus >= 202002L namespace GH138657 { template // #gh138657-template-head class meta {}; template class meta {}; // expected-error {{called object type 'int' is not a function or function point}} template class meta {}; // expected-error {{called object type 'int *' is not a function or function point}} template class meta {}; // expected-error {{called object type 'char *' is not a function or function point}} struct S {}; template class meta {}; // expected-error {{template argument for non-type template parameter is treated as function type 'S ()'}} // expected-note@#gh138657-template-head {{template parameter is declared here}} } namespace GH115725 { template struct X {}; template struct A { template A(X<0(Ps)...>, Ts (*...qs)[Ns]); // expected-error@-1{{called object type 'int' is not a function or function pointer}} }; } namespace GH68852 { template struct constexpr_value { template constexpr constexpr_value call(Ts...) { //expected-error@-1 {{called object type 'int' is not a function or function pointer}} return {}; } }; template constexpr static inline auto c_ = constexpr_value{}; // expected-note@-1 {{in instantiation of template}} auto k = c_<1>; // expected-note {{in instantiation of variable}} } #endif #if __cplusplus >= 201702L namespace GH138731 { template using void_t = void; template T&& declval(); struct S { S(); static int f(); static int var; }; namespace invoke_detail { template struct traits { template using result = decltype(declval()(declval()...)); }; template using invoke_result_t = typename traits::template result; template inline constexpr bool is_invocable_v = false; template inline constexpr bool is_invocable_v>, F, A...> = true; } template inline constexpr bool is_invocable_v = invoke_detail::is_invocable_v; static_assert(!is_invocable_v); static_assert(!is_invocable_v); static_assert(!is_invocable_v); static_assert(is_invocable_v); static_assert(!is_invocable_v); } #endif