From 222e2a7620e6520ffaf4fc4e69d79c18da31542e Mon Sep 17 00:00:00 2001 From: "Zancanaro; Carlo" Date: Mon, 24 Sep 2012 09:58:17 +1000 Subject: Add the clang library to the repo (with some of my changes, too). --- clang/test/SemaTemplate/default-expr-arguments.cpp | 305 +++++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 clang/test/SemaTemplate/default-expr-arguments.cpp (limited to 'clang/test/SemaTemplate/default-expr-arguments.cpp') diff --git a/clang/test/SemaTemplate/default-expr-arguments.cpp b/clang/test/SemaTemplate/default-expr-arguments.cpp new file mode 100644 index 0000000..1eefa9f --- /dev/null +++ b/clang/test/SemaTemplate/default-expr-arguments.cpp @@ -0,0 +1,305 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +template +class C { C(int a0 = 0); }; + +template<> +C::C(int a0); + +struct S { }; // expected-note 3 {{candidate constructor (the implicit copy constructor)}} + +template void f1(T a, T b = 10) { } // expected-error{{no viable conversion}} \ +// expected-note{{passing argument to parameter 'b' here}} + +template void f2(T a, T b = T()) { } + +template void f3(T a, T b = T() + T()); // expected-error{{invalid operands to binary expression ('S' and 'S')}} + +void g() { + f1(10); + f1(S()); // expected-note{{in instantiation of default function argument expression for 'f1' required here}} + + f2(10); + f2(S()); + + f3(10); + f3(S()); // expected-note{{in instantiation of default function argument expression for 'f3' required here}} +} + +template struct F { + F(T t = 10); // expected-error{{no viable conversion}} \ + // expected-note{{passing argument to parameter 't' here}} + void f(T t = 10); // expected-error{{no viable conversion}} \ + // expected-note{{passing argument to parameter 't' here}} +}; + +struct FD : F { }; + +void g2() { + F f; + FD fd; +} + +void g3(F f, F s) { + f.f(); + s.f(); // expected-note{{in instantiation of default function argument expression for 'f' required here}} + + F f2; + F s2; // expected-note{{in instantiation of default function argument expression for 'F' required here}} +} + +template struct G { + G(T) {} +}; + +void s(G flags = 10) { } + +// Test default arguments +template +struct X0 { + void f(T = T()); // expected-error{{no matching}} +}; + +template +void X0::f(U) { } + +void test_x0(X0 xi) { + xi.f(); + xi.f(17); +} + +struct NotDefaultConstructible { // expected-note 2{{candidate}} + NotDefaultConstructible(int); // expected-note 2{{candidate}} +}; + +void test_x0_not_default_constructible(X0 xn) { + xn.f(NotDefaultConstructible(17)); + xn.f(42); + xn.f(); // expected-note{{in instantiation of default function argument}} +} + +template +struct X1 { + typedef T value_type; + X1(const value_type& value = value_type()); +}; + +void test_X1() { + X1 x1; +} + +template +struct X2 { + void operator()(T = T()); // expected-error{{no matching}} +}; + +void test_x2(X2 x2i, X2 x2n) { + x2i(); + x2i(17); + x2n(NotDefaultConstructible(17)); + x2n(); // expected-note{{in instantiation of default function argument}} +} + +// PR5283 +namespace PR5283 { +template struct A { + A(T = 1); // expected-error 3 {{cannot initialize a parameter of type 'int *' with an rvalue of type 'int'}} \ + // expected-note 3{{passing argument to parameter here}} +}; + +struct B : A { + B(); +}; +B::B() { } // expected-note {{in instantiation of default function argument expression for 'A' required he}} + +struct C : virtual A { + C(); +}; +C::C() { } // expected-note {{in instantiation of default function argument expression for 'A' required he}} + +struct D { + D(); + + A a; +}; +D::D() { } // expected-note {{in instantiation of default function argument expression for 'A' required he}} +} + +// PR5301 +namespace pr5301 { + void f(int, int = 0); + + template + void g(T, T = 0); + + template + void i(int a = I); + + template + void h(T t) { + f(0); + g(1); + g(t); + i<2>(); + } + + void test() { + h(0); + } +} + +// PR5810 +namespace PR5810 { + template + struct allocator { + allocator() { int a[sizeof(T) ? -1 : -1]; } // expected-error2 {{array with a negative size}} + }; + + template + struct vector { + vector(const allocator& = allocator()) {} // expected-note2 {{instantiation of}} + }; + + struct A { }; + struct B { }; + + template + void FilterVTs() { + vector Result; + } + + void f() { + vector Result; + } + + template + struct X { + vector bs; + X() { } + }; + + void f2() { + X x; // expected-note{{member function}} + } +} + +template void f4(T, int = 17); +template<> void f4(int, int); + +void f4_test(int i) { + f4(i); +} + +// Instantiate for initialization +namespace InstForInit { + template + struct Ptr { + typedef T* type; + Ptr(type); + }; + + template + struct Holder { + Holder(int i, Ptr ptr = 0); + }; + + void test_holder(int i) { + Holder h(i); + } +}; + +namespace PR5810b { + template + T broken() { + T t; + double**** not_it = t; + } + + void f(int = broken()); + void g() { f(17); } +} + +namespace PR5810c { + template + struct X { + X() { + T t; + double *****p = t; // expected-error{{cannot initialize a variable of type 'double *****' with an lvalue of type 'int'}} + } + X(const X&) { } + }; + + struct Y : X { // expected-note{{instantiation of}} + }; + + void f(Y y = Y()); + + void g() { f(); } +} + +namespace PR8127 { + template< typename T > class PointerClass { + public: + PointerClass( T * object_p ) : p_( object_p ) { + p_->acquire(); + } + private: + T * p_; + }; + + class ExternallyImplementedClass; + + class MyClass { + void foo( PointerClass = 0 ); + }; +} + +namespace rdar8427926 { + template + struct Boom { + ~Boom() { + T t; + double *******ptr = t; // expected-error 2{{cannot initialize}} + } + }; + + Boom *bfp; + + struct X { + void f(Boom = Boom()) { } // expected-note{{requested here}} + void g(int x = (delete bfp, 0)); // expected-note{{requested here}} + }; + + void test(X *x) { + x->f(); + x->g(); + } +} + +namespace PR8401 { + template + struct A { + A() { T* x = 1; } // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}} + }; + + template + struct B { + B(const A& a = A()); // expected-note{{in instantiation of}} + }; + + void f(B b = B()); + + void g() { + f(); + } +} + +namespace PR12581 { + const int a = 0; + template < typename > struct A; + template < typename MatrixType, int = + A < MatrixType >::Flags ? : A < MatrixType >::Flags & a > class B; + void + fn1 () + { + } +} -- cgit v1.2.3