Because diagnostics and their notes are not connected at the API level, if the error message for an overload is emitted, then the overload candidates are completed - if a diagnostic is emitted during that work, the notes related to overload candidates would be attached to the latter diagnostic, not the original error. Sort of worse, if the latter diagnostic was disabled, the notes are disabled. Reviewers: rsmith Differential Revision: https://reviews.llvm.org/D61357 llvm-svn: 359854
36 lines
1.0 KiB
C++
36 lines
1.0 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
enum copy_traits { movable = 1 };
|
|
|
|
template <int>
|
|
struct optional_ctor_base {};
|
|
template <typename T>
|
|
struct ctor_copy_traits {
|
|
// this would produce a c++98-compat warning, which would erroneously get the
|
|
// no-matching-function-call error's notes attached to it (or suppress those
|
|
// notes if this diagnostic was suppressed, as it is in this case)
|
|
static constexpr int traits = copy_traits::movable;
|
|
};
|
|
template <typename T>
|
|
struct optional : optional_ctor_base<ctor_copy_traits<T>::traits> {
|
|
template <typename U>
|
|
constexpr optional(U&& v);
|
|
};
|
|
struct A {};
|
|
struct XA {
|
|
XA(const A&);
|
|
};
|
|
struct B {};
|
|
struct XB {
|
|
XB(const B&);
|
|
XB(const optional<B>&);
|
|
};
|
|
struct YB : XB {
|
|
using XB::XB;
|
|
};
|
|
void InsertRow(const XA&, const YB&); // expected-note {{candidate function not viable: no known conversion from 'int' to 'const XA' for 1st argument}}
|
|
void ReproducesBugSimply() {
|
|
InsertRow(3, B{}); // expected-error {{no matching function for call to 'InsertRow'}}
|
|
}
|
|
|