Files
clang-p2996/clang/test/SemaCXX/overload-template.cpp
David Blaikie 5e32805050 SemaOverload: Complete candidates before emitting the error, to ensure diagnostics emitted (or suppressed) during completion don't interfere with the overload notes
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
2019-05-03 00:44:50 +00:00

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'}}
}