// 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 struct A { int x; }; // expected-note@-1 {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const A' for 1st argument}} #if __cplusplus >= 201103L // expected-note@-3 {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'A' for 1st argument}} #endif // expected-note@-5 {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}} class Base { public: virtual void f(); }; class Derived : public Base { }; struct ConvertibleToInt { operator int() const; }; struct Constructible { Constructible(int, float); }; // --------------------------------------------------------------------- // C-style casts // --------------------------------------------------------------------- template struct CStyleCast0 { void f(T t) { (void)((U)t); // expected-error{{cannot convert 'A' to 'int' without a conversion operator}} } }; template struct CStyleCast0; template struct CStyleCast0; // expected-note{{instantiation}} // --------------------------------------------------------------------- // static_cast // --------------------------------------------------------------------- template struct StaticCast0 { void f(T t) { (void)static_cast(t); // expected-error{{no matching conversion for static_cast from 'int' to 'A'}} } }; template struct StaticCast0; template struct StaticCast0; template struct StaticCast0; // expected-note{{instantiation}} // --------------------------------------------------------------------- // dynamic_cast // --------------------------------------------------------------------- template struct DynamicCast0 { void f(T t) { (void)dynamic_cast(t); // expected-error{{invalid target type 'A' for dynamic_cast; target type must be a reference or pointer type to a defined class}} } }; template struct DynamicCast0; template struct DynamicCast0; // expected-note{{instantiation}} // --------------------------------------------------------------------- // reinterpret_cast // --------------------------------------------------------------------- template struct ReinterpretCast0 { void f(T t) { (void)reinterpret_cast(t); // expected-error{{qualifiers}} } }; template struct ReinterpretCast0; template struct ReinterpretCast0; // expected-note{{instantiation}} // --------------------------------------------------------------------- // const_cast // --------------------------------------------------------------------- template struct ConstCast0 { void f(T t) { (void)const_cast(t); // expected-error{{not allowed}} } }; template struct ConstCast0; template struct ConstCast0; // expected-note{{instantiation}} // --------------------------------------------------------------------- // C++ functional cast // --------------------------------------------------------------------- template struct FunctionalCast1 { void f(T t) { (void)U(t); // expected-error{{cannot convert 'A' to 'int' without a conversion operator}} } }; template struct FunctionalCast1; template struct FunctionalCast1; // expected-note{{instantiation}} // Generates temporaries, which we cannot handle yet. template struct FunctionalCast2 { void f() { (void)Constructible(N, M); } }; template struct FunctionalCast2<1, 3>; // --------------------------------------------------------------------- // implicit casting // --------------------------------------------------------------------- template struct Derived2 : public Base { }; void test_derived_to_base(Base *&bp, Derived2 *dp) { bp = dp; }