diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/template')
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash100.C | 24 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash101.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/dtor7.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/partial8.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/ptrmem17.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/ptrmem22.C | 29 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/sfinae19.C | 44 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/sfinae20.C | 45 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/sfinae21.C | 40 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/sfinae22.C | 39 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/sfinae23.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/sfinae24.C | 26 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/warn1.C | 4 |
13 files changed, 290 insertions, 4 deletions
diff --git a/gcc/testsuite/g++.dg/template/crash100.C b/gcc/testsuite/g++.dg/template/crash100.C new file mode 100644 index 00000000000..c67ae2eca38 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash100.C @@ -0,0 +1,24 @@ +// PR c++/44628 + +template <typename T> +class Temp +{ + int Val; + public: + operator T&(void) { return Val; } + + virtual T& operator=(T a ) // { dg-error "overriding" } + { + Val = a; + return Val; + } +}; + +class Int : public Temp<int> +{ + public: + Int& operator=(int a) // { dg-error "conflicting return type" } + { + return (*this); + } +}; diff --git a/gcc/testsuite/g++.dg/template/crash101.C b/gcc/testsuite/g++.dg/template/crash101.C new file mode 100644 index 00000000000..c59737a8938 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash101.C @@ -0,0 +1,12 @@ +// PR c++/44039 + +struct locale { }; + +template<class charT> + void + foo() + { locale::locale(); } // { dg-error "cannot call|function-style" } + +void +bar() +{ foo<char>(); } diff --git a/gcc/testsuite/g++.dg/template/dtor7.C b/gcc/testsuite/g++.dg/template/dtor7.C index e96f56397eb..186b561e9c3 100644 --- a/gcc/testsuite/g++.dg/template/dtor7.C +++ b/gcc/testsuite/g++.dg/template/dtor7.C @@ -1,5 +1,5 @@ // PR c++/40373 -// { dg-compile } +// { dg-do compile } struct A; namespace diff --git a/gcc/testsuite/g++.dg/template/partial8.C b/gcc/testsuite/g++.dg/template/partial8.C new file mode 100644 index 00000000000..4db7e18689e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/partial8.C @@ -0,0 +1,4 @@ +// PR c++/32505 +template <class T> struct A { }; +A<int*> a; +template <class T> struct A<T*> { }; // { dg-error "A<int\\*>" } diff --git a/gcc/testsuite/g++.dg/template/ptrmem17.C b/gcc/testsuite/g++.dg/template/ptrmem17.C index a79e3c882fa..5c5ee3fc30e 100644 --- a/gcc/testsuite/g++.dg/template/ptrmem17.C +++ b/gcc/testsuite/g++.dg/template/ptrmem17.C @@ -7,4 +7,4 @@ template<int> struct A ~A() { &A::i; } // { dg-error "reference" } }; -A<0> a; // { dg-message "instantiated" } +A<0> a; diff --git a/gcc/testsuite/g++.dg/template/ptrmem22.C b/gcc/testsuite/g++.dg/template/ptrmem22.C new file mode 100644 index 00000000000..762f377f5b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem22.C @@ -0,0 +1,29 @@ +// PR c++/44778 + +enum Healpix_Ordering_Scheme { RING, NEST }; + +class Healpix_Base + { + protected: + Healpix_Ordering_Scheme scheme_; + int nest2ring (int pix) const; + int ring2nest (int pix) const; + + typedef int (Healpix_Base::*swapfunc)(int pix) const; + }; + +template<typename T> class Healpix_Map: public Healpix_Base + { + public: + void Import_nograde (const Healpix_Map<T> &orig) + { + swapfunc swapper = (scheme_ == NEST) ? + &Healpix_Map::ring2nest : &Healpix_Map::nest2ring; + } + }; + +int main() + { + Healpix_Map<double> a,b; + a.Import_nograde(b); + } diff --git a/gcc/testsuite/g++.dg/template/sfinae19.C b/gcc/testsuite/g++.dg/template/sfinae19.C new file mode 100644 index 00000000000..59be183feb5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae19.C @@ -0,0 +1,44 @@ +// PR c++/44907 + +struct A { }; + +struct B +: public A { }; + +struct C +: public A { }; + +struct D +: public B, public C { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static typename + enable_if<(sizeof(test_aux<To1>(From1()), 1) > 0), one>::type + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +int Test1[mini_is_convertible<D*, A*>::value ? -1 : 1]; +int Test2[mini_is_convertible<A*, D*>::value ? -1 : 1]; +int Test3[mini_is_convertible<D, A>::value ? -1 : 1]; +int Test4[mini_is_convertible<A, D>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae20.C b/gcc/testsuite/g++.dg/template/sfinae20.C new file mode 100644 index 00000000000..9767bc02984 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae20.C @@ -0,0 +1,45 @@ +// PR c++/44907 +// { dg-options "-std=c++0x" } + +#include <utility> + +struct A { }; + +struct B +: public A { }; + +struct C +: public A { }; + +struct D +: public B, public C { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static decltype(test_aux<To1>(std::declval<From1>()), one()) + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +static_assert (!mini_is_convertible<D*, A*>::value, ""); +static_assert (!mini_is_convertible<A*, D*>::value, ""); +static_assert (!mini_is_convertible<D&, A&>::value, ""); +static_assert (!mini_is_convertible<A&, D&>::value, ""); +static_assert (!mini_is_convertible<D, A>::value, ""); +static_assert (!mini_is_convertible<A, D>::value, ""); diff --git a/gcc/testsuite/g++.dg/template/sfinae21.C b/gcc/testsuite/g++.dg/template/sfinae21.C new file mode 100644 index 00000000000..6086f2f9e7d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae21.C @@ -0,0 +1,40 @@ +// PR c++/44908 + +struct A { }; + +struct B +: public virtual A { }; + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static typename + enable_if<(sizeof(test_aux<To1>(From1()), 1) > 0), one>::type + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +int Test1[mini_is_convertible<int (B::*) (int), + int (A::*) (int)>::value ? -1 : 1]; +int Test2[mini_is_convertible<int (B::*), int (A::*)>::value ? -1 : 1]; +int Test3[mini_is_convertible<int (A::*) (int), + int (B::*) (int)>::value ? -1 : 1]; +int Test4[mini_is_convertible<int (A::*), int (B::*)>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae22.C b/gcc/testsuite/g++.dg/template/sfinae22.C new file mode 100644 index 00000000000..cdac99d91b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae22.C @@ -0,0 +1,39 @@ +// PR c++/44908 +// { dg-options "-std=c++0x" } + +#include <utility> + +struct A { }; + +struct B +: public virtual A { }; + +template<typename From, typename To> + class mini_is_convertible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename To1> + static void test_aux(To1); + + template<typename To1, typename From1> + static decltype(test_aux<To1>(std::declval<From1>()), one()) + test(int); + + template<typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<To, From>(0)) == 1; + }; + +template<typename From, typename To> + const bool mini_is_convertible<From, To>::value; + +static_assert (!mini_is_convertible<int (B::*) (int), + int (A::*) (int)>::value, ""); +static_assert (!mini_is_convertible<int (B::*), int (A::*)>::value, ""); +static_assert (!mini_is_convertible<int (A::*) (int), + int (B::*) (int)>::value, ""); +static_assert (!mini_is_convertible<int (A::*), int (B::*)>::value, ""); diff --git a/gcc/testsuite/g++.dg/template/sfinae23.C b/gcc/testsuite/g++.dg/template/sfinae23.C new file mode 100644 index 00000000000..9e0197a7050 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae23.C @@ -0,0 +1,23 @@ +// PR c++/44969 +// { dg-options "-std=c++0x" } + +template<typename Tp, typename... Args> + class mini_is_constructible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename Tp1, typename... Args1> + static decltype(Tp1(Args1()...), one()) + test(int); + + template<typename, typename...> + static two test(...); + + public: + static const bool value = sizeof(test<Tp, Args...>(0)) == 1; + }; + +class A { }; + +int Test[mini_is_constructible<int, A, A>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/sfinae24.C b/gcc/testsuite/g++.dg/template/sfinae24.C new file mode 100644 index 00000000000..7138c96e66f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/sfinae24.C @@ -0,0 +1,26 @@ +// PR c++/44969 + +template<bool, typename T = void> struct enable_if { typedef T type; }; +template<typename T> struct enable_if<false, T> { }; + +template<typename Tp, typename Arg1, typename Arg2> + class mini_is_constructible + { + typedef char one; + typedef struct { char arr[2]; } two; + + template<typename Tp1, typename Arg1_, typename Arg2_> + static typename + enable_if<(sizeof(Tp1(Arg1_(), Arg2_()), 1) > 0), one>::type + test(int); + + template<typename, typename, typename> + static two test(...); + + public: + static const bool value = sizeof(test<Tp, Arg1, Arg2>(0)) == 1; + }; + +class A { }; + +int Test[mini_is_constructible<int, A, A>::value ? -1 : 1]; diff --git a/gcc/testsuite/g++.dg/template/warn1.C b/gcc/testsuite/g++.dg/template/warn1.C index 0cdffcd3c51..2b804f7ca8f 100644 --- a/gcc/testsuite/g++.dg/template/warn1.C +++ b/gcc/testsuite/g++.dg/template/warn1.C @@ -9,8 +9,8 @@ template <class T> void Foo(T i) { i++, i++; - i, i++; // { dg-warning "left-hand operand" "" } - i++, i; // { dg-warning "right-hand operand" "" } + i, i++; // { dg-warning "left operand" "" } + i++, i; // { dg-warning "right operand" "" } for (;; --i, ++i) ; } |