// RUN: clang-cc -fsyntax-only -verify %s // --------------------------------------------------------------------- // C++ Functional Casts // --------------------------------------------------------------------- template struct ValueInit0 { int f() { return int(); } }; template struct ValueInit0<5>; template struct FunctionalCast0 { int f() { return int(N); } }; template struct FunctionalCast0<5>; struct X { // expected-note 2 {{candidate function}} X(int, int); // expected-note 2 {{candidate function}} }; template struct BuildTemporary0 { X f() { return X(N, M); } }; template struct BuildTemporary0<5, 7>; template struct Temporaries0 { void f() { (void)X(N, M); } }; template struct Temporaries0<5, 7>; // --------------------------------------------------------------------- // new/delete expressions // --------------------------------------------------------------------- struct Y { }; template struct New0 { T* f(bool x) { if (x) return new T; // expected-error{{no matching}} else return new T(); } }; template struct New0; template struct New0; template struct New0; // expected-note{{instantiation}} template struct New1 { T* f(bool x, Arg1 a1) { return new T(a1); // expected-error{{no matching}} } }; template struct New1; template struct New1; template struct New1; // expected-note{{instantiation}} template struct New2 { T* f(bool x, Arg1 a1, Arg2 a2) { return new T(a1, a2); // expected-error{{no matching}} } }; template struct New2; template struct New2; // expected-note{{instantiation}} // FIXME: template struct New2; template struct Delete0 { void f(T t) { delete t; // expected-error{{cannot delete}} ::delete [] t; } }; template struct Delete0; template struct Delete0; template struct Delete0; // expected-note{{instantiation}} // --------------------------------------------------------------------- // throw expressions // --------------------------------------------------------------------- template struct Throw1 { void f(T t) { throw; throw t; // expected-error{{incomplete type}} } }; struct Incomplete; // expected-note{{forward}} template struct Throw1; template struct Throw1; template struct Throw1; // expected-note{{instantiation}} // --------------------------------------------------------------------- // typeid expressions // --------------------------------------------------------------------- // FIXME: This should really include , but we don't have that yet. namespace std { class type_info; } template struct TypeId0 { const std::type_info &f(T* ptr) { if (ptr) return typeid(ptr); else return typeid(T); } }; struct Abstract { virtual void f() = 0; }; template struct TypeId0; template struct TypeId0; template struct TypeId0; // --------------------------------------------------------------------- // type traits // --------------------------------------------------------------------- template struct is_pod { static const bool value = __is_pod(T); }; static const int is_pod0[is_pod::value? -1 : 1]; static const int is_pod1[is_pod::value? 1 : -1]; // --------------------------------------------------------------------- // initializer lists // --------------------------------------------------------------------- template struct InitList1 { void f(Val1 val1) { T x = { val1 }; } }; struct APair { int *x; const float *y; }; template struct InitList1; template struct InitList1; template struct InitList2 { void f(Val1 val1, Val2 val2) { T x = { val1, val2 }; // expected-error{{incompatible}} } }; template struct InitList2; template struct InitList2; // expected-note{{instantiation}} // --------------------------------------------------------------------- // member references // --------------------------------------------------------------------- template struct DotMemRef0 { void f(T t) { Result result = t.m; // expected-error{{cannot be initialized}} } }; struct MemInt { int m; }; struct InheritsMemInt : MemInt { }; struct MemIntFunc { static int m(int); }; template struct DotMemRef0; template struct DotMemRef0; template struct DotMemRef0; template struct DotMemRef0; // expected-note{{instantiation}} template struct ArrowMemRef0 { void f(T t) { Result result = t->m; // expected-error 2{{cannot be initialized}} } }; template struct ArrowWrapper { T operator->(); }; template struct ArrowMemRef0; template struct ArrowMemRef0; template struct ArrowMemRef0; template struct ArrowMemRef0; // expected-note{{instantiation}} template struct ArrowMemRef0, int&>; template struct ArrowMemRef0, int&>; template struct ArrowMemRef0, int (*)(int)>; template struct ArrowMemRef0, float&>; // expected-note{{instantiation}} template struct ArrowMemRef0 >, int&>; // FIXME: we should be able to return a MemInt without the reference! MemInt &createMemInt(int); template struct NonDepMemberExpr0 { void f() { createMemInt(N).m = N; } }; template struct NonDepMemberExpr0<0>; template struct MemberFuncCall0 { void f(T t) { Result result = t.f(); } }; template struct HasMemFunc0 { T f(); }; template struct MemberFuncCall0, const int&>; template struct ThisMemberFuncCall0 { Result g(); void f() { Result r1 = g(); Result r2 = this->g(); } }; template struct ThisMemberFuncCall0; template struct NonDepMemberCall0 { void foo(HasMemFunc0 x) { T result = x.f(); // expected-error{{initialized}} } }; template struct NonDepMemberCall0; template struct NonDepMemberCall0; template struct NonDepMemberCall0; // expected-note{{instantiation}} template struct QualifiedDeclRef0 { T f() { return is_pod::value; // expected-error{{initialized}} } }; template struct QualifiedDeclRef0; template struct QualifiedDeclRef0; // expected-note{{instantiation}}