Files
clang-p2996/clang/test/CXX/dcl.decl/dcl.init/p14-0x.cpp
Richard Smith 2519554134 When diagnosing the lack of a viable conversion function, also list
explicit functions that are not candidates.

It's not always obvious that the reason a conversion was not possible is
because the function you wanted to call is 'explicit', so explicitly say
if that's the case.

It would be nice to rank the explicit candidates higher in the
diagnostic if an implicit conversion sequence exists for their
arguments, but unfortunately we can't determine that without potentially
triggering non-immediate-context errors that we're not permitted to
produce.
2020-01-09 15:15:02 -08:00

45 lines
1.2 KiB
C++

// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
struct NoDefault {
NoDefault() = delete; // expected-note {{here}}
NoDefault(int);
};
struct Explicit { // expected-note 2 {{candidate}} expected-note {{here}}
explicit Explicit(int); // expected-note {{not a candidate}}
};
struct NoCopy {
NoCopy();
NoCopy(const NoCopy &) = delete; // expected-note {{here}}
};
struct NoMove {
NoMove();
NoMove(NoMove &&) = delete; // expected-note {{here}}
};
class Private {
Private(int); // expected-note {{here}}
public:
Private();
};
class Friend {
friend class S;
Friend(int);
};
class S {
NoDefault nd1;
NoDefault nd2 = 42;
Explicit e1; // expected-note {{here}}
Explicit e2 = 42; // expected-error {{no viable conversion}}
NoCopy nc = NoCopy(); // expected-error {{call to deleted}}
NoMove nm = NoMove(); // expected-error {{call to deleted}}
Private p = 42; // expected-error {{private constructor}}
Friend f = 42;
S() {} // expected-error {{call to deleted constructor of 'NoDefault'}} \
expected-error {{must explicitly initialize the member 'e1' which does not have a default constructor}}
S(int) : nd1(42), e1(42) {}
};
// FIXME: test the other forms which use copy-initialization