
Given the following invalid code, ```cpp template <class T> struct S { T *a; }; S s = {1}; ``` we produce such diagnostics currently: ``` <source>:2:8: note: candidate template ignored: could not match 'S<T>' against 'int' 2 | struct S { | ^ <source>:2:8: note: candidate template ignored: could not match 'T *' against 'int' ``` Which I think is confusing because there's no `S<T>` nor `T *` at the location it points to. This is because we're deducing the initializer against implicitly generated deduction guides, and their source locations just point to the corresponding `RecordDecl`. Hence the misleading notes. This patch alleviates the issue by adding extra notes demonstrating which implicit deduction guide we're deducing against. In other words, in addition to the note of `could not match 'T *' against 'int'`, we would also say the implicit deduction guide we're trying to use: `template <class T> S(T *) -> S<T>`, which looks clearer IMO. --------- Co-authored-by: Sirraide <aeternalmail@gmail.com>
14 lines
902 B
C++
14 lines
902 B
C++
// RUN: %clang_cc1 -std=c++20 -Wc++17-compat -verify -Wno-unused %s
|
|
|
|
class X {};
|
|
|
|
template<typename T>
|
|
class B3 { // expected-note {{candidate template ignored: could not match 'B3<T>' against 'int'}} \
|
|
// expected-note {{implicit deduction guide declared as 'template <typename T> B3(B3<T>) -> B3<T>'}}
|
|
template<X x> B3(T); // expected-warning 2{{non-type template parameter of type 'X' is incompatible with C++ standards before C++20}} \
|
|
// expected-note {{candidate template ignored: couldn't infer template argument 'x'}} \
|
|
// expected-note {{implicit deduction guide declared as 'template <typename T, X x> B3(T) -> B3<T>'}}
|
|
};
|
|
B3 b3 = 0; // expected-error {{no viable constructor or deduction guide for deduction of template arguments of 'B3'}} \
|
|
// expected-note {{while building implicit deduction guide first needed here}}
|