diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/template')
90 files changed, 636 insertions, 159 deletions
diff --git a/gcc/testsuite/g++.dg/template/anonunion1.C b/gcc/testsuite/g++.dg/template/anonunion1.C index 89a8c5bec9..ea17e5d5f9 100644 --- a/gcc/testsuite/g++.dg/template/anonunion1.C +++ b/gcc/testsuite/g++.dg/template/anonunion1.C @@ -1,6 +1,6 @@ // PR c++/47303 // { dg-do compile } -// { dg-options "-fabi-version=1" } + struct Z { diff --git a/gcc/testsuite/g++.dg/template/array1-1.C b/gcc/testsuite/g++.dg/template/array1-1.C deleted file mode 100644 index 97fe7cde25..0000000000 --- a/gcc/testsuite/g++.dg/template/array1-1.C +++ /dev/null @@ -1,32 +0,0 @@ -// { dg-do compile } -// { dg-options "-fabi-version=1" } - -// Contributed by Nathan Sidwell 22 Dec 2003 <nathan@codesourcery.com> -// Origin: Roger Sayle <roger@eyesopen.com> - -// PR c++/12774 Array domains compared unequal - -void Foo(double r[3][3]) -{ -} - -void Baz() -{ - double m[3][3]; - Foo(m); -} - -template <class T> -void Bar() -{ - double m[3][3]; - Foo(m); -} - -int main() -{ - Baz(); - Bar<int>(); - return 0; -} - diff --git a/gcc/testsuite/g++.dg/template/array2-1.C b/gcc/testsuite/g++.dg/template/array2-1.C deleted file mode 100644 index 2980a1fd18..0000000000 --- a/gcc/testsuite/g++.dg/template/array2-1.C +++ /dev/null @@ -1,14 +0,0 @@ -// { dg-do compile } -// { dg-options "-fabi-version=1" } - -// Copyright (C) 2003 Free Software Foundation, Inc. -// Contributed by Nathan Sidwell 29 Dec 2003 <nathan@codesourcery.com> - -// PR c++/13494. ICE - -template<typename T> -int foo(int d[][4]) -{ - return d[0][0]; -} - diff --git a/gcc/testsuite/g++.dg/template/array28.C b/gcc/testsuite/g++.dg/template/array28.C new file mode 100644 index 0000000000..18b629d447 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array28.C @@ -0,0 +1,7 @@ +typedef int (A)[]; + +template<class T> void f(T (*)[1]); // { dg-error "array" } + +int main() { + f<int[]>(0); // { dg-error "no match" } +} diff --git a/gcc/testsuite/g++.dg/template/array29.C b/gcc/testsuite/g++.dg/template/array29.C new file mode 100644 index 0000000000..e43cb9d965 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array29.C @@ -0,0 +1,56 @@ +// PR c++/63485 + +template <typename C> struct A +{ + typedef C type; +}; +template <class> class B +{ +}; +template <class Range> void as_literal (Range &); +template <typename> struct C +{ + typedef wchar_t char_type; + const char_type on_full_year_placeholder[3]; + void + on_extended_iso_date () + { + B<A<wchar_t const[3]>::type> a; + as_literal (on_full_year_placeholder); + } +}; +template <typename> struct date_time_format_parser_callback : C<wchar_t> +{ +}; +template <typename BaseT> struct D +{ + typedef typename BaseT::char_type char_type; + char_type + parse (const char_type *, const char_type *, + typename BaseT::callback_type p3) + { + p3.on_extended_iso_date (); + } +}; +struct F +{ + typedef date_time_format_parser_callback<wchar_t> callback_type; + typedef wchar_t char_type; +}; +template <typename CharT, typename ParserT, typename CallbackT> +void +parse_format (CharT *p1, ParserT p2, CallbackT p3) +{ + CharT p = p2.parse (&p, p1, p3); +} +template <typename CharT> +void +parse_date_time_format (const CharT *, const CharT *p2, + date_time_format_parser_callback<CharT> &p3) +{ + D<F> b; + parse_format (p2, b, p3); +} +template void +parse_date_time_format (const wchar_t *, const wchar_t *, + date_time_format_parser_callback<wchar_t> &); diff --git a/gcc/testsuite/g++.dg/template/arrow1.C b/gcc/testsuite/g++.dg/template/arrow1.C index c96141063a..690df4c5fc 100644 --- a/gcc/testsuite/g++.dg/template/arrow1.C +++ b/gcc/testsuite/g++.dg/template/arrow1.C @@ -9,9 +9,7 @@ struct a { }; int main() { - a<0>()->x; // { dg-error "instantiation depth exceeds maximum" } + a<0>()->x; // { dg-error "depth" } } -// { dg-prune-output "incomplete type" } -// { dg-prune-output "declaration of" } -// { dg-prune-output "used but never defined" } +// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/template/conv8.C b/gcc/testsuite/g++.dg/template/conv8.C deleted file mode 100644 index 01d415b3ed..0000000000 --- a/gcc/testsuite/g++.dg/template/conv8.C +++ /dev/null @@ -1,12 +0,0 @@ -// { dg-options "-fabi-version=1 -Wno-abi" } - -template <typename T> struct S { - struct I{}; - operator I* (); -}; - -template <typename T> struct S2 : S<T> { - operator typename S<T>::I* (); -}; - -template struct S2<int>; diff --git a/gcc/testsuite/g++.dg/template/copy1.C b/gcc/testsuite/g++.dg/template/copy1.C index c6b3ff8066..bf5a37ce0a 100644 --- a/gcc/testsuite/g++.dg/template/copy1.C +++ b/gcc/testsuite/g++.dg/template/copy1.C @@ -6,10 +6,9 @@ struct A { - A(A&); // { dg-message "note" } - template <class T> A(T); // { dg-message "note" } + A(A&); // { dg-message "A::A" } + template <class T> A(T); // { dg-message "A::A" } }; -A a = 0; // { dg-error "no matching function" } -// { dg-message "candidate" "candidate note" { target *-*-* } 13 } +A a = 0; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/crash106.C b/gcc/testsuite/g++.dg/template/crash106.C index ebd47bcffd..5bef101e59 100644 --- a/gcc/testsuite/g++.dg/template/crash106.C +++ b/gcc/testsuite/g++.dg/template/crash106.C @@ -9,6 +9,6 @@ struct A template<T N = 0, void (A::*)() = &A::foo<N> > struct B {}; // { dg-error "type|declared" } -B<> b; // { dg-error "type|declaration" } +B<> b; // { dg-message "non-type" } // { dg-prune-output "could not convert" } diff --git a/gcc/testsuite/g++.dg/template/crash107.C b/gcc/testsuite/g++.dg/template/crash107.C index bb405ac7ee..d92ee3394e 100644 --- a/gcc/testsuite/g++.dg/template/crash107.C +++ b/gcc/testsuite/g++.dg/template/crash107.C @@ -14,7 +14,5 @@ template<typename FP_> struct Vec { // { dg-message "note" } } }; Vec<double> v(3,4,12); // { dg-error "no matching" } -// { dg-message "note" "note" { target *-*-* } 16 } Vec<double> V(12,4,3); // { dg-error "no matching" } -// { dg-message "note" "note" { target *-*-* } 18 } Vec<double> c = v^V; // { dg-message "required" } diff --git a/gcc/testsuite/g++.dg/template/crash120.C b/gcc/testsuite/g++.dg/template/crash120.C new file mode 100644 index 0000000000..9d15c2e660 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash120.C @@ -0,0 +1,18 @@ +// PR c++/60493 + +template <class T, class U> +struct foo +{ +}; +template <class T> +struct baz +{ + class bar; +}; + +template <class T, class D> +struct baz<T>::bar : foo<int, D> // { dg-error "parameters|required" } +{ +}; + +baz<int>::bar it; // { dg-error "incomplete" } diff --git a/gcc/testsuite/g++.dg/template/crash35.C b/gcc/testsuite/g++.dg/template/crash35.C index 348d91d0ca..c457798dd0 100644 --- a/gcc/testsuite/g++.dg/template/crash35.C +++ b/gcc/testsuite/g++.dg/template/crash35.C @@ -1,7 +1,7 @@ // PR c++/20463 // { dg-do compile } -template <typename T> struct C; // { dg-error "declaration" } +template <typename T> struct C; // { dg-message "declaration" } template <typename T> void C<T>::f() // { dg-error "invalid|template" } { diff --git a/gcc/testsuite/g++.dg/template/crash55.C b/gcc/testsuite/g++.dg/template/crash55.C index 7cf9f1eae8..9b80fd125d 100644 --- a/gcc/testsuite/g++.dg/template/crash55.C +++ b/gcc/testsuite/g++.dg/template/crash55.C @@ -3,4 +3,4 @@ template<typename class T, T = T()> // { dg-error "nested-name-specifier|two or more|valid type" } struct A {}; -template<int> void foo(A<int>); // { dg-error "mismatch|constant|template argument" } +template<int> void foo(A<int>); // { dg-error "cast|argument" "" { target c++98_only } } diff --git a/gcc/testsuite/g++.dg/template/crash57.C b/gcc/testsuite/g++.dg/template/crash57.C index cf1c3c2961..ad05e6aceb 100644 --- a/gcc/testsuite/g++.dg/template/crash57.C +++ b/gcc/testsuite/g++.dg/template/crash57.C @@ -7,4 +7,4 @@ template<typename> struct B template<int(> struct C; // { dg-error "token" } }; -A<char> a; // { dg-error "type/value mismatch|constant|declaration" } +A<char> a; diff --git a/gcc/testsuite/g++.dg/template/crash59.C b/gcc/testsuite/g++.dg/template/crash59.C index 61d2188fc9..ebc0e281c5 100644 --- a/gcc/testsuite/g++.dg/template/crash59.C +++ b/gcc/testsuite/g++.dg/template/crash59.C @@ -1,6 +1,6 @@ //PR c++/27329 -template<int> struct A // { dg-error "forward declaration" } +template<int> struct A // { dg-message "forward declaration" } ! // { dg-error "expected unqualified-id" } ; diff --git a/gcc/testsuite/g++.dg/template/crash71.C b/gcc/testsuite/g++.dg/template/crash71.C index 86aa1521d4..3ac862ed81 100644 --- a/gcc/testsuite/g++.dg/template/crash71.C +++ b/gcc/testsuite/g++.dg/template/crash71.C @@ -1,3 +1,3 @@ // PR c++/30659 -extern "C" template A<char> foo(); // { dg-error "forbids|static data|expected" } +extern "C" template A<char> foo(); // { dg-error "forbids|static data|expected|template" } diff --git a/gcc/testsuite/g++.dg/template/crash77.C b/gcc/testsuite/g++.dg/template/crash77.C index b4d6e8f4a6..21747792c2 100644 --- a/gcc/testsuite/g++.dg/template/crash77.C +++ b/gcc/testsuite/g++.dg/template/crash77.C @@ -1,5 +1,5 @@ // PR c++/34603 -template<typename> struct A; // { dg-error "declaration" } +template<typename> struct A; // { dg-message "declaration" } template<typename T> A<T>::A( struct A; // { dg-error "definition|expected|incomplete" } diff --git a/gcc/testsuite/g++.dg/template/crash89.C b/gcc/testsuite/g++.dg/template/crash89.C index f4cdaf9d9b..d5c3a92832 100644 --- a/gcc/testsuite/g++.dg/template/crash89.C +++ b/gcc/testsuite/g++.dg/template/crash89.C @@ -5,6 +5,4 @@ template<typename T, int = T()[0]> struct A // { dg-error "subscripted" } typedef A<T> B; }; -A<int> a; // { dg-error "declaration" } - -// { dg-prune-output "template argument 2 is invalid" } +A<int> a; // { dg-error "template argument 2 is invalid" } diff --git a/gcc/testsuite/g++.dg/template/defarg18.C b/gcc/testsuite/g++.dg/template/defarg18.C new file mode 100644 index 0000000000..ac08966061 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg18.C @@ -0,0 +1,15 @@ +// PR c++/60067 + +template <class> struct A; +template <class> struct B { enum { v = 1 }; }; + +template <class T = void (A<int>)> +struct C { + void f () { + void g (int [B<T>::v]); + } +}; + +void foo (void) { + C<int>().f (); +} diff --git a/gcc/testsuite/g++.dg/template/dependent-expr5.C b/gcc/testsuite/g++.dg/template/dependent-expr5.C index af0dfb912a..8d14553352 100644 --- a/gcc/testsuite/g++.dg/template/dependent-expr5.C +++ b/gcc/testsuite/g++.dg/template/dependent-expr5.C @@ -18,7 +18,7 @@ template<class F, class T> void bindb(F (T::*f)(void)) {} // { dg-message "note" struct foo { static int baist; - int bait; // { dg-error "non-static data member" } + int bait; // { dg-message "" } void barf (); static void barf (int); @@ -31,7 +31,7 @@ struct foo { bar() { bind (&baist); bind (&foo::baist); - bind (&bait); // { dg-error "from this location" } + bind (&bait); // { dg-error "non-static data member" } bind (&foo::bait); bind (&baikst); @@ -53,7 +53,7 @@ struct foo { bindb (&barf); bindb (&foo::barf); // { dg-error "ambiguous" } - // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 55 } + bind (&bark); // { dg-error "no matching function" } // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 58 } @@ -69,7 +69,7 @@ struct foo { bindb (&bark); bindb (&bar::bark); // { dg-error "ambiguous" } - // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 71 } + } }; @@ -83,7 +83,7 @@ struct foo { barT() { bind (&baist); bind (&foo::baist); - bind (&bait); // { dg-error "from this location" } + bind (&bait); // { dg-error "non-static data member" } bind (&foo::bait); bind (&baikst); @@ -105,7 +105,7 @@ struct foo { bindb (&barf); bindb (&foo::barf); // { dg-error "ambiguous" } - // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 107 } + bind (&bark); // { dg-error "no matching function" } // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 110 } @@ -121,7 +121,7 @@ struct foo { bindb (&bark); bindb (&barT::bark); // { dg-error "ambiguous" } - // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 123 } + } }; diff --git a/gcc/testsuite/g++.dg/template/dtor3.C b/gcc/testsuite/g++.dg/template/dtor3.C index 98c2ef6c18..38ddaf6d4e 100644 --- a/gcc/testsuite/g++.dg/template/dtor3.C +++ b/gcc/testsuite/g++.dg/template/dtor3.C @@ -1,4 +1,4 @@ // PR c++/19762 -template<int> struct A { ~A(){} }; // { dg-error "" } +template<int> struct A { ~A(){} }; // { dg-message "provided for" } template A<>::~A(); // { dg-error "template|declaration" } diff --git a/gcc/testsuite/g++.dg/template/error15.C b/gcc/testsuite/g++.dg/template/error15.C index b7c7bc8ca4..86936581cf 100644 --- a/gcc/testsuite/g++.dg/template/error15.C +++ b/gcc/testsuite/g++.dg/template/error15.C @@ -9,9 +9,9 @@ template <class T> class B { protected: - A<T> a; // { dg-error "" } + A<T> a; // { dg-message "" } - void f(const A<T> * a1 = &a); // { dg-error "this location" } + void f(const A<T> * a1 = &a); // { dg-error "non-static" } void g(void); }; diff --git a/gcc/testsuite/g++.dg/template/error2.C b/gcc/testsuite/g++.dg/template/error2.C index be5ab1d450..a7f199e51e 100644 --- a/gcc/testsuite/g++.dg/template/error2.C +++ b/gcc/testsuite/g++.dg/template/error2.C @@ -7,8 +7,7 @@ template<class T> struct X { - T m; // { dg-error "void" "void" } - // { dg-error "incomplete type" "incomplete" { target *-*-* } 10 } + T m; // { dg-error "incomplete type|invalid use" } }; template<class T > diff --git a/gcc/testsuite/g++.dg/template/error38.C b/gcc/testsuite/g++.dg/template/error38.C index 14a2132998..6c25b9f9c0 100644 --- a/gcc/testsuite/g++.dg/template/error38.C +++ b/gcc/testsuite/g++.dg/template/error38.C @@ -32,12 +32,8 @@ int main() { A<B> a; a.f(); // { dg-error "" } - // { dg-message "candidate" "candidate note" { target *-*-* } 34 } a.g(); // { dg-error "" } - // { dg-message "candidate" "candidate note" { target *-*-* } 36 } f(i); // { dg-error "" } - // { dg-message "candidate" "candidate note" { target *-*-* } 39 } f(p); // { dg-error "" } - // { dg-message "candidate" "candidate note" { target *-*-* } 41 } } diff --git a/gcc/testsuite/g++.dg/template/error40.C b/gcc/testsuite/g++.dg/template/error40.C index 7746ed2cee..c5df56fc1b 100644 --- a/gcc/testsuite/g++.dg/template/error40.C +++ b/gcc/testsuite/g++.dg/template/error40.C @@ -26,7 +26,5 @@ struct B int main() { f(1); // { dg-error "" } - // { dg-message "candidate" "candidate note" { target *-*-* } 28 } B<A<int> >().f(); // { dg-error "" } - // { dg-message "candidate" "candidate note" { target *-*-* } 30 } } diff --git a/gcc/testsuite/g++.dg/template/error42.C b/gcc/testsuite/g++.dg/template/error42.C index 0d651e3162..3c66ed0289 100644 --- a/gcc/testsuite/g++.dg/template/error42.C +++ b/gcc/testsuite/g++.dg/template/error42.C @@ -3,18 +3,18 @@ template <int> struct A { - int i; // { dg-error "invalid use of non-static data member" } + int i; // { dg-message "" } friend void foo () { - int x[i]; // { dg-error "from this location" } + int x[i]; // { dg-error "non-static data member" } } }; struct B { - int j; // { dg-error "invalid use of non-static data member" } + int j; // { dg-message "" } friend int bar () { - return j; // { dg-error "from this location" } + return j; // { dg-error "non-static data member" } } }; diff --git a/gcc/testsuite/g++.dg/template/error46.C b/gcc/testsuite/g++.dg/template/error46.C index 6cb085a182..be0b813324 100644 --- a/gcc/testsuite/g++.dg/template/error46.C +++ b/gcc/testsuite/g++.dg/template/error46.C @@ -8,4 +8,4 @@ void bar() { foo(A<0>(), A<1>()); // { dg-error "no matching" } } -// { dg-message "candidate|parameter 'N' ('0' and '1')" "" { target *-*-* } 9 } +// { dg-message "deduced conflicting values" "" { target *-*-* } 9 } diff --git a/gcc/testsuite/g++.dg/template/error47.C b/gcc/testsuite/g++.dg/template/error47.C index 74a5989229..e598d141c2 100644 --- a/gcc/testsuite/g++.dg/template/error47.C +++ b/gcc/testsuite/g++.dg/template/error47.C @@ -6,4 +6,4 @@ void bar(void* p) { foo(0, p); // { dg-error "no matching" } } -// { dg-message "candidate|parameter 'T' ('int' and 'void*')" "" { target *-*-* } 7 } +// { dg-message "parameter 'T' .'int' and 'void.'" "" { target *-*-* } 7 } diff --git a/gcc/testsuite/g++.dg/template/error51.C b/gcc/testsuite/g++.dg/template/error51.C index b3a6cfb3d2..304a13a70f 100644 --- a/gcc/testsuite/g++.dg/template/error51.C +++ b/gcc/testsuite/g++.dg/template/error51.C @@ -2,7 +2,7 @@ template<int> void foo() { - struct A; // { dg-error "declaration" } + struct A; // { dg-message "declaration" } struct B : A {}; // { dg-error "invalid use of incomplete" } } diff --git a/gcc/testsuite/g++.dg/template/friend57.C b/gcc/testsuite/g++.dg/template/friend57.C new file mode 100644 index 0000000000..7077d5e53c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend57.C @@ -0,0 +1,21 @@ +// PR c++/59366 +// { dg-do compile } +template<typename T> void f(T); + +struct S +{ + template<typename T> friend void f(T) {} + template<typename T> friend void g(T) {} + template<typename T> friend void h(T) {} +}; + +template<typename T> void h(T); + +int +main () +{ + f(1); + g(1); // { dg-error "'g' was not declared in this scope" } + g(S()); + h(1); +} diff --git a/gcc/testsuite/g++.dg/template/friend58.C b/gcc/testsuite/g++.dg/template/friend58.C new file mode 100644 index 0000000000..cadfb3e1f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend58.C @@ -0,0 +1,19 @@ +// PR c++/42328 + +template<typename T, typename U> +class freeList +{ +public: + void foo() {}; +}; + +class bar {}; + +class baz : protected freeList<bar, baz> +{ + template<typename T> + friend + void freeList<T, baz>::foo(); // { dg-error "friend" } +}; + +baz b; diff --git a/gcc/testsuite/g++.dg/template/friend59.C b/gcc/testsuite/g++.dg/template/friend59.C new file mode 100644 index 0000000000..e7c6d58ab1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend59.C @@ -0,0 +1,22 @@ +// PR c++/42328 + +template<typename T, typename U> +class freeList +{ +public: + void foo() {}; +}; + +class bar {}; + +class baz; +template<typename T> class freeList<T, baz> { void foo(); }; + +class baz : protected freeList<bar, baz> +{ + template<typename T> + friend + void freeList<T, baz>::foo(); +}; + +baz b; diff --git a/gcc/testsuite/g++.dg/template/incomplete1.C b/gcc/testsuite/g++.dg/template/incomplete1.C index e4997ef014..53bd8170e6 100644 --- a/gcc/testsuite/g++.dg/template/incomplete1.C +++ b/gcc/testsuite/g++.dg/template/incomplete1.C @@ -2,7 +2,7 @@ // Origin: Ivan Godard <igodard at pacbell dot net> // PR c++/17447: Detect parameters of dependent types even in templates -struct B; // { dg-error "forward declaration" } +struct B; // { dg-message "forward declaration" } template<typename T> struct A { friend A& operator <<(A& a, B b) { return a; } // { dg-error "incomplete" } diff --git a/gcc/testsuite/g++.dg/template/incomplete2.C b/gcc/testsuite/g++.dg/template/incomplete2.C index b855569088..bad16020ba 100644 --- a/gcc/testsuite/g++.dg/template/incomplete2.C +++ b/gcc/testsuite/g++.dg/template/incomplete2.C @@ -10,5 +10,4 @@ A a; // { dg-error "incomplete type" } void bar() { foo<a>(); // { dg-error "(no matching function|could not convert)" } - // { dg-message "candidate" "candidate note" { target *-*-* } 12 } } diff --git a/gcc/testsuite/g++.dg/template/incomplete3.C b/gcc/testsuite/g++.dg/template/incomplete3.C index 8a20bba74d..9b2efb77b7 100644 --- a/gcc/testsuite/g++.dg/template/incomplete3.C +++ b/gcc/testsuite/g++.dg/template/incomplete3.C @@ -1,5 +1,5 @@ // PR c++/27315 // { dg-do compile } -struct A; // { dg-error "forward declaration" } +struct A; // { dg-message "forward declaration" } template void A::foo<0>(); // { dg-error "before|incomplete" } diff --git a/gcc/testsuite/g++.dg/template/incomplete4.C b/gcc/testsuite/g++.dg/template/incomplete4.C index f2832a73c4..7cff66bdc0 100644 --- a/gcc/testsuite/g++.dg/template/incomplete4.C +++ b/gcc/testsuite/g++.dg/template/incomplete4.C @@ -1,11 +1,11 @@ // PR c++/33501 // { dg-do compile } -class A; // { dg-error "forward declaration" } +class A; // { dg-message "forward declaration" } template <typename T> struct X { - static int f (T); // { dg-error "initializing" } + static int f (T); // { dg-message "initializing" } static const T &make (); }; diff --git a/gcc/testsuite/g++.dg/template/incomplete5.C b/gcc/testsuite/g++.dg/template/incomplete5.C index f7802825fd..1bd21b95e8 100644 --- a/gcc/testsuite/g++.dg/template/incomplete5.C +++ b/gcc/testsuite/g++.dg/template/incomplete5.C @@ -1,11 +1,11 @@ // PR c++/33501 // { dg-do compile } -class A; // { dg-error "forward declaration" } +class A; // { dg-message "forward declaration" } template <typename T> struct X { - static int f (T); // { dg-error "initializing" } + static int f (T); // { dg-message "initializing" } static const T &make (); static const bool value = sizeof (f (make ())) == sizeof (int); // { dg-error "invalid use of incomplete type" } }; diff --git a/gcc/testsuite/g++.dg/template/inherit8.C b/gcc/testsuite/g++.dg/template/inherit8.C index 3176dc06d0..62a0f1da1a 100644 --- a/gcc/testsuite/g++.dg/template/inherit8.C +++ b/gcc/testsuite/g++.dg/template/inherit8.C @@ -4,7 +4,7 @@ template <typename T> struct A { template <typename U> - struct B : public A <B<U> > // { dg-error "declaration" } + struct B : public A <B<U> > // { dg-message "not complete" } { struct C : public B<U> // { dg-error "incomplete" } { diff --git a/gcc/testsuite/g++.dg/template/instantiate1.C b/gcc/testsuite/g++.dg/template/instantiate1.C index dd501684e6..a9c8cf8696 100644 --- a/gcc/testsuite/g++.dg/template/instantiate1.C +++ b/gcc/testsuite/g++.dg/template/instantiate1.C @@ -12,7 +12,7 @@ template <class T> struct Y { X<T> x; // { dg-message "required" } }; -template <class T> struct Z { // { dg-error "declaration" } +template <class T> struct Z { // { dg-message "declaration" } Y<Z<T> > y; // { dg-message "required" } }; diff --git a/gcc/testsuite/g++.dg/template/instantiate3.C b/gcc/testsuite/g++.dg/template/instantiate3.C index c0754da922..e99ec84c2a 100644 --- a/gcc/testsuite/g++.dg/template/instantiate3.C +++ b/gcc/testsuite/g++.dg/template/instantiate3.C @@ -4,7 +4,7 @@ // PR c++/7639 // ICE when accessing member with incomplete type. -class ACE_Null_Mutex; // { dg-error "forward declaration" } +class ACE_Null_Mutex; // { dg-message "forward declaration" } template <class TYPE> struct ACE_Cleanup_Adapter diff --git a/gcc/testsuite/g++.dg/template/instantiate5.C b/gcc/testsuite/g++.dg/template/instantiate5.C index 2198087abf..896313d14d 100644 --- a/gcc/testsuite/g++.dg/template/instantiate5.C +++ b/gcc/testsuite/g++.dg/template/instantiate5.C @@ -19,7 +19,6 @@ struct B template <typename T> struct C { virtual void bar() const { T::foo(); } // { dg-error "no matching function" } - // { dg-message "candidate" "candidate note" { target *-*-* } 21 } }; C<B> c; // { dg-message "required" } diff --git a/gcc/testsuite/g++.dg/template/linkage1.C b/gcc/testsuite/g++.dg/template/linkage1.C index 02aa967296..ac4d30b131 100644 --- a/gcc/testsuite/g++.dg/template/linkage1.C +++ b/gcc/testsuite/g++.dg/template/linkage1.C @@ -1,7 +1,7 @@ // PR c++/50372 // Test that a template instantiation has the same linkage as its argument. // { dg-final { scan-assembler "(weak|glob)\[^\n\]*_Z3fooIXadL_Z13external_funcvEEEvv" } } -// { dg-final { scan-assembler-not "(weak|glob)\[^\n\]*_Z3fooIXadL_ZL11static_funcvEEEvv" } } +// { dg-final { scan-assembler-not "(weak|glob)\[^\n\]*_Z3fooIXadL_ZL11static_funcvEEEvv" { xfail powerpc-*-aix* } } } template<void (*fptr)(void)> void foo() { } diff --git a/gcc/testsuite/g++.dg/template/local4.C b/gcc/testsuite/g++.dg/template/local4.C index d842076bd8..95d2990ec8 100644 --- a/gcc/testsuite/g++.dg/template/local4.C +++ b/gcc/testsuite/g++.dg/template/local4.C @@ -6,5 +6,4 @@ template <typename T> void foo() {} // { dg-message "note" } int main () { struct S {}; foo<S> (); // { dg-error "(match|template argument for|trying to instantiate)" } - // { dg-message "candidate" "candidate note" { target *-*-* } 8 } } diff --git a/gcc/testsuite/g++.dg/template/local8.C b/gcc/testsuite/g++.dg/template/local8.C new file mode 100644 index 0000000000..006bd8c40e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/local8.C @@ -0,0 +1,18 @@ +// PR c++/56947 + +struct A +{ + A (int); +}; + +template < typename > +void Fn () +{ + const int kCapacity = 0; + struct Q:A + { + Q ():A (kCapacity) { } + }; + Q q; +} +template void Fn < int >(); diff --git a/gcc/testsuite/g++.dg/template/local9.C b/gcc/testsuite/g++.dg/template/local9.C new file mode 100644 index 0000000000..90f14bb796 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/local9.C @@ -0,0 +1,15 @@ +// PR c++/61445 + +template <typename T> void f (T) +{ + struct A + { + struct B { B(); }; + void g () { B b; } + }; +} + +int main() +{ + f(0); +} diff --git a/gcc/testsuite/g++.dg/template/nested6.C b/gcc/testsuite/g++.dg/template/nested6.C new file mode 100644 index 0000000000..f5b8054a59 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/nested6.C @@ -0,0 +1,19 @@ +// PR c++/63309 + +template <class T> +class A +{ +public: + class B; +}; + +template <class T, class I> +class A<T>::B // { dg-error "template parameters|required" } +{ +}; + +int main() +{ + A<int>::B myB; // { dg-prune-output "incomplete type" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/new3.C b/gcc/testsuite/g++.dg/template/new3.C index 230330ec66..461b47b5e9 100644 --- a/gcc/testsuite/g++.dg/template/new3.C +++ b/gcc/testsuite/g++.dg/template/new3.C @@ -6,7 +6,6 @@ struct C void f() { int* node; new (&node) int(0); // { dg-error "new" } - // { dg-message "candidate" "candidate note" { target *-*-* } 8 } } }; diff --git a/gcc/testsuite/g++.dg/template/non-dependent14.C b/gcc/testsuite/g++.dg/template/non-dependent14.C new file mode 100644 index 0000000000..b257d9baf1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/non-dependent14.C @@ -0,0 +1,7 @@ +// PR c++/64251 + +class DictionaryValue {}; +template <typename T> void CreateValue(T) { + DictionaryValue(0); + CreateValue(0); +} diff --git a/gcc/testsuite/g++.dg/template/nontype7.C b/gcc/testsuite/g++.dg/template/nontype7.C index 5eac558e45..ba33b19db3 100644 --- a/gcc/testsuite/g++.dg/template/nontype7.C +++ b/gcc/testsuite/g++.dg/template/nontype7.C @@ -10,6 +10,3 @@ char p[] = "Vivisectionist"; X<int,"Studebaker"> x1; // { dg-error "string literal" } X<int, p> x2; - -// { dg-bogus "" "additional errors" { xfail *-*-* } 11 } - diff --git a/gcc/testsuite/g++.dg/template/offsetof2.C b/gcc/testsuite/g++.dg/template/offsetof2.C index da888f7a59..3f08f9b0b8 100644 --- a/gcc/testsuite/g++.dg/template/offsetof2.C +++ b/gcc/testsuite/g++.dg/template/offsetof2.C @@ -1,7 +1,7 @@ // PR c++/49085 template <class T> -struct A // { dg-error "declaration" } +struct A // { dg-message "not complete" } { int i, j; int ar[__builtin_offsetof(A,j)]; // { dg-error "incomplete type" } diff --git a/gcc/testsuite/g++.dg/template/offsetof3.C b/gcc/testsuite/g++.dg/template/offsetof3.C new file mode 100644 index 0000000000..b17374645b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/offsetof3.C @@ -0,0 +1,18 @@ +// PR c++/64487 + +struct foo { + int member; +}; + +template < int N> +struct bar {}; + +template <int N> +struct qux { + static bar<N+__builtin_offsetof(foo,member)> static_member; +}; + +template <int N> +bar<N+__builtin_offsetof(foo,member)> qux<N>::static_member; + +int main() { } diff --git a/gcc/testsuite/g++.dg/template/operator13.C b/gcc/testsuite/g++.dg/template/operator13.C new file mode 100644 index 0000000000..1967c910e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator13.C @@ -0,0 +1,12 @@ +// PR c++/50961 + +template < class > void foo (); + +bool b1 = !foo<void>; +bool b2 = foo<void> ? true : false; + +void bar() +{ + if (foo<void>) + ; +} diff --git a/gcc/testsuite/g++.dg/template/operator14.C b/gcc/testsuite/g++.dg/template/operator14.C new file mode 100644 index 0000000000..6267dbb140 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/operator14.C @@ -0,0 +1,7 @@ +// DR 2007 +// We shouldn't instantiate A<void> to lookup operator=, since operator= +// must be a non-static member function. + +template<typename T> struct A { typename T::error e; }; +template<typename T> struct B { }; +B<A<void> > b1, &b2 = (b1 = b1); diff --git a/gcc/testsuite/g++.dg/template/operator8.C b/gcc/testsuite/g++.dg/template/operator8.C index 29d17b84b8..52f22188dd 100644 --- a/gcc/testsuite/g++.dg/template/operator8.C +++ b/gcc/testsuite/g++.dg/template/operator8.C @@ -2,5 +2,5 @@ struct A { - template<operator+> void foo() {} // { dg-error "identifier|non-function|template arguments" } + template<operator+> void foo() {} // { dg-error "identifier|parameter|template arguments" } }; diff --git a/gcc/testsuite/g++.dg/template/operator9.C b/gcc/testsuite/g++.dg/template/operator9.C index 46eef0a9ac..d4ebad3aa1 100644 --- a/gcc/testsuite/g++.dg/template/operator9.C +++ b/gcc/testsuite/g++.dg/template/operator9.C @@ -1,10 +1,9 @@ //PR c++/27670 -template<operator+> void foo(); // { dg-error "before|non-function|template" } +template<operator+> void foo(); // { dg-error "before|parameter|template" } void bar() { foo(); // { dg-error "no matching function" } - // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } 7 } } diff --git a/gcc/testsuite/g++.dg/template/overload14.C b/gcc/testsuite/g++.dg/template/overload14.C new file mode 100644 index 0000000000..ec2c381510 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload14.C @@ -0,0 +1,18 @@ +// PR c++/65051 + +template<typename T> struct wrap { typedef T type; }; +template <class T> class rv: public wrap <T>::type {}; + +template <class value_type> +struct circular_buffer +{ + typedef const value_type& param_value_type; + typedef rv< value_type >& rvalue_type; + + void push_back(param_value_type item) {} + void push_back(rvalue_type item) {} +}; + +union U { int i; char c; }; + +void f(circular_buffer<U> b, const U& u) { b.push_back(u); } diff --git a/gcc/testsuite/g++.dg/template/pr16564.C b/gcc/testsuite/g++.dg/template/pr16564.C new file mode 100644 index 0000000000..7a34313e90 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr16564.C @@ -0,0 +1,10 @@ +// { dg-do compile } +template<typename> struct A +{ + A<A> a; /* { dg-error "depth" } */ + A() {} +}; + +A<int> a; + +// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/template/pr23510.C b/gcc/testsuite/g++.dg/template/pr23510.C index 7163e30ba2..c1ffc176c5 100644 --- a/gcc/testsuite/g++.dg/template/pr23510.C +++ b/gcc/testsuite/g++.dg/template/pr23510.C @@ -3,21 +3,21 @@ template<unsigned int nFactor> struct Factorial { - enum { nValue = nFactor * Factorial<nFactor - 1>::nValue }; // { dg-error "depth exceeds maximum" "exceeds" } - // { dg-message "recursively required" "recurse" { target *-*-* } 6 } - // { dg-error "incomplete type" "incomplete" { target *-*-* } 6 } -} // { dg-error "expected ';' after" } + enum { nValue = nFactor * Factorial<nFactor - 1>::nValue }; // { dg-error "depth" } +}; - template<> - struct Factorial<0> - { - enum { nValue = 1 }; - }; +template<> +struct Factorial<0> +{ + enum { nValue = 1 }; +}; - static const unsigned int FACTOR = 20; +static const unsigned int FACTOR = 20; int main() { - Factorial<FACTOR>::nValue; + Factorial<FACTOR>::nValue; // { dg-message "from here" } return 0; } + +// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/template/pr34938-1.C b/gcc/testsuite/g++.dg/template/pr34938-1.C new file mode 100644 index 0000000000..f23a5a3e20 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr34938-1.C @@ -0,0 +1,7 @@ +// PR c++/34938 + +typedef void (*fptr)() __attribute((noreturn)); +template<int> void foo(); +template<fptr> void bar(); + +fptr f = bar< foo<0> >; // { dg-error "noreturn" } diff --git a/gcc/testsuite/g++.dg/template/pr34938-2.C b/gcc/testsuite/g++.dg/template/pr34938-2.C new file mode 100644 index 0000000000..fe7650fd62 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr34938-2.C @@ -0,0 +1,10 @@ +// PR c++/34938 + +template <class T> struct A { }; +struct B { }; + +A<void()const>* p1 = 42; // { dg-error "void\\(\\) const" } +A<void(B::*)()const>* p2 = 42; // { dg-error "void \\(B::\\*\\)\\(\\) const" } + +A<void()volatile>* p3 = 42; // { dg-error "void\\(\\) volatile" } +A<void(B::*)()volatile>* p4 = 42; // { dg-error "void \\(B::\\*\\)\\(\\) volatile" } diff --git a/gcc/testsuite/g++.dg/template/pr51199.C b/gcc/testsuite/g++.dg/template/pr51199.C new file mode 100644 index 0000000000..e56b2549ef --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr51199.C @@ -0,0 +1,17 @@ +// PR c++/51199 + +typedef void FC() const; + +template<class T> +struct add_ref { + typedef T& type; // { dg-error "forming reference" } +}; + +typedef add_ref<FC>::type ref_type; + +template<class T> +struct add_ptr { + typedef T* type; // { dg-error "forming pointer" } +}; + +typedef add_ptr<FC>::type ptr_type; diff --git a/gcc/testsuite/g++.dg/template/pr51385.C b/gcc/testsuite/g++.dg/template/pr51385.C new file mode 100644 index 0000000000..e76995467c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr51385.C @@ -0,0 +1,24 @@ +// PR c++/51385 + +template <__SIZE_TYPE__ N> struct NTmpl; +template <typename T, typename U, typename V = NTmpl<sizeof(T *)> > +struct PtrConvs { + enum { bad = 1 }; +}; + +template <typename Target, typename Source> +struct PtrConvs<Target, Source, NTmpl<sizeof (*(Target **)0 = (Source *)0)> >; + +template<typename T> struct test { static const bool value = true; }; +template<> struct test<short> { static const bool value = false; }; + +template <typename T> +struct FussyTemplate +{ + int sa[test<T>::value ? 1 : -1]; +}; + +struct B { }; + +typedef char chk[1]; +typedef char chk[PtrConvs<FussyTemplate<short>, B>::bad]; diff --git a/gcc/testsuite/g++.dg/template/pr52819.C b/gcc/testsuite/g++.dg/template/pr52819.C new file mode 100644 index 0000000000..66175bc21e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr52819.C @@ -0,0 +1,14 @@ +// PR c++/52819 + +typedef void (*cfi)(void*); + +void function(int *a) {} + +template<cfi Func> +void get() { Func(0); } + +int main() +{ + get<(cfi)function>(); // { dg-error "" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/pr54310.C b/gcc/testsuite/g++.dg/template/pr54310.C new file mode 100644 index 0000000000..94e5f2494c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr54310.C @@ -0,0 +1,19 @@ +// PR c++/54310 + +template <typename T> +struct meta +{ + typedef typename T::type type; +}; + +struct S{}; + +template <typename T> +typename meta<T>::type foo(T, S); + +int foo(int, int); + +int main() +{ + foo(0, 0); +} diff --git a/gcc/testsuite/g++.dg/template/pr54377.C b/gcc/testsuite/g++.dg/template/pr54377.C new file mode 100644 index 0000000000..b85181749c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr54377.C @@ -0,0 +1,6 @@ +// PR c++/54377 + +template <typename, typename, typename = void, typename = void> +struct foo {}; // { dg-message "provided for" } + +foo<int> f; // { dg-error "at least 2" } diff --git a/gcc/testsuite/g++.dg/template/pr54987.C b/gcc/testsuite/g++.dg/template/pr54987.C new file mode 100644 index 0000000000..773f023e0a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr54987.C @@ -0,0 +1,51 @@ +// PR c++/54987 + +struct Argument1 +{ +}; + +struct Argument2 +{ +}; + +template<typename T> +struct Template1 +{ + Template1() {} + + template<typename Y> + Template1( const Template1<Y>& ) {} +}; + +template<typename T> +struct Template2 +{ + Template2() {} + + template<typename Y> + Template2( const Template1<Y>& ) {} +}; + +template <typename T> +struct make_type +{ + typedef Argument1 type; +}; + +template<typename T> +void foo( T, Template1<typename make_type<T>::type> ) +{ +} + +template<typename T> +void foo( T, Template2<typename make_type<T>::type> ) +{ +} + +int main() +{ + Template1<Argument2> t; + Argument1 a; + foo( a, t ); // { dg-error "ambiguous" } + return 0; +} diff --git a/gcc/testsuite/g++.dg/template/pr57573.C b/gcc/testsuite/g++.dg/template/pr57573.C new file mode 100644 index 0000000000..1344511a69 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr57573.C @@ -0,0 +1,13 @@ +// PR c++/57573 + +struct A { }; +struct B { A a; }; + +void f(A*) { } + +template<class T> +void g() +{ + B b; + f(&(b.a)); +} diff --git a/gcc/testsuite/g++.dg/template/pr61670.C b/gcc/testsuite/g++.dg/template/pr61670.C new file mode 100644 index 0000000000..d244efae71 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr61670.C @@ -0,0 +1,9 @@ +// PR c++/61670 +// { dg-do compile } + +template <class> +class A { + A: 0 // { dg-error "" } +}; + +A<int> a; diff --git a/gcc/testsuite/g++.dg/template/pr61745.C b/gcc/testsuite/g++.dg/template/pr61745.C new file mode 100644 index 0000000000..0f7c280e52 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr61745.C @@ -0,0 +1,22 @@ +// PR c++/61745 + +template <typename INT,INT P> class Zp; + +template <typename INT,INT P> +Zp<INT,P> operator-(const Zp<INT,P>& a, const Zp<INT,P>& b); + +template <typename INT,INT P> +class Zp { +public: + static const INT p = P; +private: + INT val; +public: + Zp() : val(0) {} + Zp( INT x ) : val(x%p) { if (x < 0 ) x+= p; } + + // this compiles only if the following definition is moved + // AFTER the friend declaration + Zp operator-() const { return Zp(p-val); } + friend Zp<INT,P> operator- <>(const Zp<INT,P>& a, const Zp<INT,P>& b); // { dg-error "declaration|expected" } +}; diff --git a/gcc/testsuite/g++.dg/template/pr64100.C b/gcc/testsuite/g++.dg/template/pr64100.C new file mode 100644 index 0000000000..493849f24c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr64100.C @@ -0,0 +1,9 @@ +// { dg-do compile { target c++11 } } + +template<typename> struct foo // { dg-message "note" } +{ // { dg-error "incomplete type" } + static_assert(noexcept(((foo *)1)->~foo()), ""); +}; + +template class foo<int>; + diff --git a/gcc/testsuite/g++.dg/template/pr65390.C b/gcc/testsuite/g++.dg/template/pr65390.C new file mode 100644 index 0000000000..299d22a7ee --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr65390.C @@ -0,0 +1,12 @@ +// PR c++/65390 +// { dg-do compile } +// { dg-options "" } + +template<typename T> struct shared_ptr { }; + +template<typename T, typename Arg> +shared_ptr<T> make_shared(Arg) { return shared_ptr<T>(); } // { dg-error "variably modified type|trying to instantiate" } + +void f(int n){ + make_shared<int[n]>(1); // { dg-error "no matching function" } +} diff --git a/gcc/testsuite/g++.dg/template/ptrmem2.C b/gcc/testsuite/g++.dg/template/ptrmem2.C index 5f03580c1b..6aa251243a 100644 --- a/gcc/testsuite/g++.dg/template/ptrmem2.C +++ b/gcc/testsuite/g++.dg/template/ptrmem2.C @@ -12,5 +12,4 @@ template <typename T> T A::* Foo (); // { dg-error "reference" } void Baz () { Foo <int &> (); // { dg-error "no matching function" "" } - // { dg-message "candidate" "candidate note" { target *-*-* } 14 } } diff --git a/gcc/testsuite/g++.dg/template/ptrmem20.C b/gcc/testsuite/g++.dg/template/ptrmem20.C index dee3c629a7..2d2453d73d 100644 --- a/gcc/testsuite/g++.dg/template/ptrmem20.C +++ b/gcc/testsuite/g++.dg/template/ptrmem20.C @@ -13,5 +13,4 @@ template<void (A::*)()> void bar(); // { dg-message "note" } void baz() { bar<&B::foo>(); // { dg-error "not a valid template argument|no match" } - // { dg-message "candidate" "candidate note" { target *-*-* } 15 } } diff --git a/gcc/testsuite/g++.dg/template/qualttp17.C b/gcc/testsuite/g++.dg/template/qualttp17.C index f492ced8c8..fea8b3df95 100644 --- a/gcc/testsuite/g++.dg/template/qualttp17.C +++ b/gcc/testsuite/g++.dg/template/qualttp17.C @@ -1,7 +1,7 @@ // Copyright (C) 2001 Free Software Foundation // Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> // { dg-do compile } -// { dg-options "-fno-inline -fabi-version=1 -Wno-abi" } +// { dg-options "-fno-inline" } struct A { @@ -22,4 +22,4 @@ int main() f<A>(x); } -// { dg-final { scan-assembler "\n_?_Z1fI1AEv1XIN1T1BEE\[: \t\n\]" } } +// { dg-final { scan-assembler "\n_?_Z1fI1AEv1XINT_1BEE\[: \t\n\]" } } diff --git a/gcc/testsuite/g++.dg/template/qualttp4.C b/gcc/testsuite/g++.dg/template/qualttp4.C index 0f45c8c832..102fc35754 100644 --- a/gcc/testsuite/g++.dg/template/qualttp4.C +++ b/gcc/testsuite/g++.dg/template/qualttp4.C @@ -7,7 +7,7 @@ struct A template <class T> struct B {}; }; -template <template <class, class> class TT> // { dg-error "provided" } +template <template <class, class> class TT> // { dg-message "provided for" } struct X { TT<int> y; // { dg-error "number" } diff --git a/gcc/testsuite/g++.dg/template/qualttp5.C b/gcc/testsuite/g++.dg/template/qualttp5.C index 8ac1952f9a..7e74f6092e 100644 --- a/gcc/testsuite/g++.dg/template/qualttp5.C +++ b/gcc/testsuite/g++.dg/template/qualttp5.C @@ -11,7 +11,6 @@ template <template <class> class TT> void f() { TT<int> y; y = 0; // { dg-error "no match" } - // { dg-message "candidate" "candidate note" { target *-*-* } 13 } } template <class T> struct C diff --git a/gcc/testsuite/g++.dg/template/recurse.C b/gcc/testsuite/g++.dg/template/recurse.C index 94b56f67e9..fbd7def061 100644 --- a/gcc/testsuite/g++.dg/template/recurse.C +++ b/gcc/testsuite/g++.dg/template/recurse.C @@ -5,10 +5,8 @@ template <int I> struct F { int operator()() { - F<I+1> f; // { dg-error "incomplete type" "incomplete" } - // { dg-bogus "exceeds maximum.*exceeds maximum" "exceeds" { xfail *-*-* } 8 } - // { dg-error "exceeds maximum" "exceeds" { xfail *-*-* } 8 } - return f()*I; // { dg-message "recursively" "recurse" } + F<I+1> f; // { dg-error "depth" } + return f()*I; } }; @@ -20,8 +18,7 @@ template <> struct F<52> int main () { F<1> f; - return f(); // { dg-message "from here" "excessive recursion" } + return f(); // { dg-message "from here" } } -// Ignore excess messages from recursion. -// { dg-prune-output "from 'int" } +// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/template/recurse2.C b/gcc/testsuite/g++.dg/template/recurse2.C index eae411b5ea..0df8e5244f 100644 --- a/gcc/testsuite/g++.dg/template/recurse2.C +++ b/gcc/testsuite/g++.dg/template/recurse2.C @@ -2,7 +2,8 @@ // We should not see an error about non-constant initialization. template <int N> struct X { - static const int value = X<N-1>::value; // { dg-error "instantiation|incomplete" } - // { dg-message "recursively required" "" { target *-*-* } 5 } + static const int value = X<N-1>::value; // { dg-error "depth" } }; template struct X<1000>; + +// { dg-prune-output "compilation terminated" } diff --git a/gcc/testsuite/g++.dg/template/recurse4.C b/gcc/testsuite/g++.dg/template/recurse4.C new file mode 100644 index 0000000000..ee8d1b70df --- /dev/null +++ b/gcc/testsuite/g++.dg/template/recurse4.C @@ -0,0 +1,18 @@ +// PR c++/62255 + +// It's not clear whether this is well-formed; instantiating the +// initializer of 'value' causes the instantiation of Derived, which in +// turn requires the value of 'value', but the recursion ends there, so it +// seems reasonable to allow it. + +template <typename T> struct Test { + template<typename X> static int check(typename X::Type*); + template<typename> static char check(...); + static const bool value = (sizeof(check<T>(0)) == sizeof(int)); +}; +template <int> struct Sink { }; +template <typename T> struct Derived : Sink<Test<Derived<T> >::value> { + typedef int Type; +}; + +Sink<Test<Derived<int> >::value> s; diff --git a/gcc/testsuite/g++.dg/template/ref9.C b/gcc/testsuite/g++.dg/template/ref9.C new file mode 100644 index 0000000000..983f627887 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ref9.C @@ -0,0 +1,15 @@ +// PR c++/63658 + +struct Descriptor {}; + +template <Descriptor & D> +struct foo +{ + void size (); +}; + +Descriptor g_descriptor = {}; + +template<> void foo<g_descriptor>::size() +{ +} diff --git a/gcc/testsuite/g++.dg/template/repo11.C b/gcc/testsuite/g++.dg/template/repo11.C new file mode 100644 index 0000000000..5cabfd452e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo11.C @@ -0,0 +1,31 @@ +// PR c++/64521 +// { dg-options "-frepo -std=c++11" } +// { dg-require-host-local "" } +// { dg-skip-if "dkms are not final links" { vxworks_kernel } } +// { dg-final cleanup-repo-files } + +template <typename H> struct J { J(H) {} }; +template <unsigned long, typename...> struct K; +template <unsigned long I> struct K<I> {}; +template <unsigned long I, typename H, typename... T> +struct K<I, H, T...> : K<I + 1, T...>, J<H> { + K(const H &p1, const T &... p2) : K<I + 1, T...>(p2...), J<H>(p1) {} +}; +template <typename... E> struct C : K<0, E...> { + C(const E &... p1) : K<0, E...>(p1...) {} +}; +template <typename> struct A { + A() = default; +}; +struct M; +template <typename> struct L { + struct B { + template <typename> static M *__test(...); + typedef A<int> _Del; + typedef decltype(__test<_Del>()) type; + }; + C<typename B::type, A<M>> _M_t; + L(typename B::type) : _M_t(0, A<M>()) {} +}; +struct M {}; +int main() { L<int>(new M); } diff --git a/gcc/testsuite/g++.dg/template/sfinae2.C b/gcc/testsuite/g++.dg/template/sfinae2.C index c9e103114d..38eb325c61 100644 --- a/gcc/testsuite/g++.dg/template/sfinae2.C +++ b/gcc/testsuite/g++.dg/template/sfinae2.C @@ -13,6 +13,5 @@ template<int I> void fn (char (*) [cl<I>::value] = 0 ); // { dg-error "zero-size void foo (void) { fn<0> (); // { dg-error "no matching function" } - // { dg-message "candidate" "candidate note" { target *-*-* } 15 } } diff --git a/gcc/testsuite/g++.dg/template/spec22.C b/gcc/testsuite/g++.dg/template/spec22.C index f916ea4689..7e627f1676 100644 --- a/gcc/testsuite/g++.dg/template/spec22.C +++ b/gcc/testsuite/g++.dg/template/spec22.C @@ -16,6 +16,6 @@ template <typename T> struct srp }; ptr<int> parent_get() { - srp<int> parent; // { dg-message "candidate" } + srp<int> parent; return parent; // { dg-error "is ambiguous" } } diff --git a/gcc/testsuite/g++.dg/template/spec23.C b/gcc/testsuite/g++.dg/template/spec23.C index 3d401f00ef..1c027fa438 100644 --- a/gcc/testsuite/g++.dg/template/spec23.C +++ b/gcc/testsuite/g++.dg/template/spec23.C @@ -20,7 +20,6 @@ struct Bar Foo Quux (Bar const &b) { return b; // { dg-error "ambiguous" } - // { dg-message "candidate" "candidate note" { target *-*-* } 22 } } diff --git a/gcc/testsuite/g++.dg/template/spec28.C b/gcc/testsuite/g++.dg/template/spec28.C index f0bb22caeb..ef4b883bcb 100644 --- a/gcc/testsuite/g++.dg/template/spec28.C +++ b/gcc/testsuite/g++.dg/template/spec28.C @@ -2,5 +2,5 @@ // Bad diagnostic // { dg-do compile } -template<typename> struct A {}; // { dg-error "provided" } +template<typename> struct A {}; // { dg-message "provided for" } template<> struct A<> {}; // { dg-error "wrong number" } diff --git a/gcc/testsuite/g++.dg/template/static36.C b/gcc/testsuite/g++.dg/template/static36.C new file mode 100644 index 0000000000..36c48b021b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static36.C @@ -0,0 +1,4 @@ +// PR c++/65646 + +template <typename = int> class A {}; +template <> A<> &A<>::a; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/template/typedef4.C b/gcc/testsuite/g++.dg/template/typedef4.C index 60fad06885..2676d8fec1 100644 --- a/gcc/testsuite/g++.dg/template/typedef4.C +++ b/gcc/testsuite/g++.dg/template/typedef4.C @@ -6,5 +6,4 @@ template<typedef> void foo(); // { dg-error "no type|typedef declaration|templa void bar() { foo<int>(); // { dg-error "matching" } - // { dg-message "candidate" "candidate note" { target *-*-* } 8 } } diff --git a/gcc/testsuite/g++.dg/template/void3.C b/gcc/testsuite/g++.dg/template/void3.C index bb59934ffe..1124e44103 100644 --- a/gcc/testsuite/g++.dg/template/void3.C +++ b/gcc/testsuite/g++.dg/template/void3.C @@ -1,5 +1,5 @@ //PR c++/28637 template<void> struct A {}; // { dg-error "not a valid type" } -A<0> a; // { dg-error "type" } +A<0> a; // { dg-message "non-type" } diff --git a/gcc/testsuite/g++.dg/template/void7.C b/gcc/testsuite/g++.dg/template/void7.C index 95d87a2073..5edff9e856 100644 --- a/gcc/testsuite/g++.dg/template/void7.C +++ b/gcc/testsuite/g++.dg/template/void7.C @@ -5,4 +5,4 @@ template<void> struct A // { dg-error "not a valid type" } static int i; }; -A<0> a; // { dg-error "invalid type|not a valid type" } +A<0> a; // { dg-message "non-type" } diff --git a/gcc/testsuite/g++.dg/template/vtable2.C b/gcc/testsuite/g++.dg/template/vtable2.C index 3bcc1ac3f8..53b72f6f4e 100644 --- a/gcc/testsuite/g++.dg/template/vtable2.C +++ b/gcc/testsuite/g++.dg/template/vtable2.C @@ -11,8 +11,10 @@ template <class T> struct inner {}; template <class T> struct parent { - virtual void f() // { dg-error "instantiation depth" } + virtual void f() // { dg-error "depth" } { parent<inner<T> > p; }; }; template struct parent<int>; + +// { dg-prune-output "compilation terminated" } |