llvm-project/clang/test/SemaCXX/bool-increment-SFINAE.cpp
Matheus Izvekov 0948fc85aa
[clang] print correct context for diagnostics suppressed by deduction (#125453)
This patch makes it so the correct instantiation context is printed for
diagnostics suppessed by template argument deduction.

The context is saved along with the suppressed diagnostic, and when the
declaration they were attached to becomes used, we print the correct
context, instead of whatever context was at this point.
2025-02-20 08:50:03 -03:00

38 lines
1.4 KiB
C++

// RUN: %clang_cc1 %std_cxx98-14 -fsyntax-only -verify=precxx17 %s
// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify=expected %s
// RUN: %clang_cc1 -std=c++17 -DFAILED_CXX17 -fsyntax-only -verify=failcxx17 %s
// RUN: %clang_cc1 %std_cxx20- -fsyntax-only -verify=cxx20 %s
// expected-no-diagnostics
template<class T> auto f(T t) -> decltype(++t); // precxx17-warning {{incrementing expression of type bool is deprecated}}
auto f(...) -> void;
void g() { f(true); } // precxx17-note {{while substituting deduced template arguments}}
#ifdef FAILED_CXX17
template<class T> auto f1(T t) -> decltype(++t); // failcxx17-note {{candidate template ignored: substitution failure [with T = bool]: ISO C++17 does not allow incrementing expression of type bool}}
auto f1(void) -> void; // failcxx17-note {{candidate function not viable: requires 0 arguments, but 1 was provided}}
void g1() { f1(true); } // failcxx17-error {{no matching function for call to 'f1'}}
#endif
#if __cplusplus >= 202002L
template <class T>
concept can_increment = requires(T t) {
++t;
};
template <class T>
void f() {
static_assert(requires(T t) { ++t; }); // cxx20-error {{static assertion failed due to requirement 'requires (bool t) { <<error-expression>>; }'}}
}
int main() {
f<bool>(); // cxx20-note {{in instantiation of function template specialization 'f<bool>' requested here}}
static_assert(!can_increment<bool>);
return 0;
}
#endif