100 lines
1.5 KiB
C++
100 lines
1.5 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
struct X {
|
|
operator bool();
|
|
};
|
|
|
|
int& f(bool);
|
|
float& f(int);
|
|
|
|
void f_test(X x) {
|
|
int& i1 = f(x);
|
|
}
|
|
|
|
struct Y {
|
|
operator short();
|
|
operator float();
|
|
};
|
|
|
|
void g(int);
|
|
|
|
void g_test(Y y) {
|
|
g(y);
|
|
short s;
|
|
s = y;
|
|
}
|
|
|
|
struct A { };
|
|
struct B : A { };
|
|
|
|
struct C {
|
|
operator B&();
|
|
};
|
|
|
|
// Test reference binding via an lvalue conversion function.
|
|
void h(volatile A&);
|
|
void h_test(C c) {
|
|
h(c);
|
|
}
|
|
|
|
// Test conversion followed by copy-construction
|
|
struct FunkyDerived;
|
|
|
|
struct Base {
|
|
Base(const FunkyDerived&);
|
|
};
|
|
|
|
struct Derived : Base { };
|
|
|
|
struct FunkyDerived : Base { };
|
|
|
|
struct ConvertibleToBase {
|
|
operator Base();
|
|
};
|
|
|
|
struct ConvertibleToDerived {
|
|
operator Derived();
|
|
};
|
|
|
|
struct ConvertibleToFunkyDerived {
|
|
operator FunkyDerived();
|
|
};
|
|
|
|
void test_conversion(ConvertibleToBase ctb, ConvertibleToDerived ctd,
|
|
ConvertibleToFunkyDerived ctfd) {
|
|
Base b1 = ctb;
|
|
Base b2(ctb);
|
|
Base b3 = ctd;
|
|
Base b4(ctd);
|
|
Base b5 = ctfd;
|
|
}
|
|
|
|
struct X1 {
|
|
X1(X1&); // expected-note{{candidate constructor not viable: expects an l-value for 1st argument}}
|
|
};
|
|
|
|
struct X2 {
|
|
operator X1();
|
|
};
|
|
|
|
int &f(X1);
|
|
float &f(...);
|
|
|
|
void g(X2 b) {
|
|
int &ir = f(b); // expected-error{{no viable constructor copying parameter of type 'X1'}}
|
|
}
|
|
|
|
namespace rdar10202900 {
|
|
class A {
|
|
public:
|
|
A();
|
|
|
|
private:
|
|
A(int i); // expected-note{{declared private here}}
|
|
};
|
|
|
|
void testA(A a) {
|
|
int b = 10;
|
|
a = b; // expected-error{{calling a private constructor of class 'rdar10202900::A'}}
|
|
}
|
|
}
|