llvm-project/clang/test/SemaCXX/copy-initialization.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

83 lines
1.9 KiB
C++

// RUN: %clang_cc1 -fsyntax-only -verify %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
class X {
public:
explicit X(const X&); // expected-note 2{{not a candidate}}
X(int*); // expected-note 3{{candidate constructor}}
explicit X(float*); // expected-note {{candidate constructor}} expected-note 2{{not a candidate}}
};
class Y : public X { };
void f(Y y, int *ip, float *fp) {
X x1 = y; // expected-error{{no matching constructor for initialization of 'X'}}
X x2 = 0;
X x3 = ip;
X x4 = fp; // expected-error{{no viable conversion}}
X x2a(0); // expected-error{{call to constructor of 'X' is ambiguous}}
X x3a(ip);
X x4a(fp);
}
struct foo {
void bar(); // expected-note{{declared here}}
};
// PR3600
void test(const foo *P) { P->bar(); } // expected-error{{'this' argument to member function 'bar' has type 'const foo', but function is not marked const}}
namespace PR6757 {
struct Foo {
Foo(); // expected-note{{not viable}}
Foo(Foo&); // expected-note{{candidate constructor not viable}}
};
struct Bar {
operator const Foo&() const;
};
void f(Foo);
void g(Foo foo) {
f(Bar()); // expected-error{{no viable constructor copying parameter of type 'const PR6757::Foo'}}
f(foo);
}
}
namespace DR5 {
// Core issue 5: if a temporary is created in copy-initialization, it is of
// the cv-unqualified version of the destination type.
namespace Ex1 {
struct C { };
C c;
struct A {
A(const A&);
A(const C&);
};
const volatile A a = c; // ok
}
namespace Ex2 {
struct S {
S(S&&);
#if __cplusplus <= 199711L // C++03 or earlier modes
// expected-warning@-2 {{rvalue references are a C++11 extension}}
#endif
S(int);
};
const S a(0);
const S b = 0;
}
}
struct A {};
struct B : A {
B();
B(B&);
B(A);
B(int);
};
B b = 0; // ok, calls B(int) then A(const A&) then B(A).