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.
45 lines
1.2 KiB
C++
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
|