summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/template
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/template')
-rw-r--r--gcc/testsuite/g++.dg/template/anonunion1.C2
-rw-r--r--gcc/testsuite/g++.dg/template/array1-1.C32
-rw-r--r--gcc/testsuite/g++.dg/template/array2-1.C14
-rw-r--r--gcc/testsuite/g++.dg/template/array28.C7
-rw-r--r--gcc/testsuite/g++.dg/template/array29.C56
-rw-r--r--gcc/testsuite/g++.dg/template/arrow1.C6
-rw-r--r--gcc/testsuite/g++.dg/template/conv8.C12
-rw-r--r--gcc/testsuite/g++.dg/template/copy1.C7
-rw-r--r--gcc/testsuite/g++.dg/template/crash106.C2
-rw-r--r--gcc/testsuite/g++.dg/template/crash107.C2
-rw-r--r--gcc/testsuite/g++.dg/template/crash120.C18
-rw-r--r--gcc/testsuite/g++.dg/template/crash35.C2
-rw-r--r--gcc/testsuite/g++.dg/template/crash55.C2
-rw-r--r--gcc/testsuite/g++.dg/template/crash57.C2
-rw-r--r--gcc/testsuite/g++.dg/template/crash59.C2
-rw-r--r--gcc/testsuite/g++.dg/template/crash71.C2
-rw-r--r--gcc/testsuite/g++.dg/template/crash77.C2
-rw-r--r--gcc/testsuite/g++.dg/template/crash89.C4
-rw-r--r--gcc/testsuite/g++.dg/template/defarg18.C15
-rw-r--r--gcc/testsuite/g++.dg/template/dependent-expr5.C14
-rw-r--r--gcc/testsuite/g++.dg/template/dtor3.C2
-rw-r--r--gcc/testsuite/g++.dg/template/error15.C4
-rw-r--r--gcc/testsuite/g++.dg/template/error2.C3
-rw-r--r--gcc/testsuite/g++.dg/template/error38.C4
-rw-r--r--gcc/testsuite/g++.dg/template/error40.C2
-rw-r--r--gcc/testsuite/g++.dg/template/error42.C8
-rw-r--r--gcc/testsuite/g++.dg/template/error46.C2
-rw-r--r--gcc/testsuite/g++.dg/template/error47.C2
-rw-r--r--gcc/testsuite/g++.dg/template/error51.C2
-rw-r--r--gcc/testsuite/g++.dg/template/friend57.C21
-rw-r--r--gcc/testsuite/g++.dg/template/friend58.C19
-rw-r--r--gcc/testsuite/g++.dg/template/friend59.C22
-rw-r--r--gcc/testsuite/g++.dg/template/incomplete1.C2
-rw-r--r--gcc/testsuite/g++.dg/template/incomplete2.C1
-rw-r--r--gcc/testsuite/g++.dg/template/incomplete3.C2
-rw-r--r--gcc/testsuite/g++.dg/template/incomplete4.C4
-rw-r--r--gcc/testsuite/g++.dg/template/incomplete5.C4
-rw-r--r--gcc/testsuite/g++.dg/template/inherit8.C2
-rw-r--r--gcc/testsuite/g++.dg/template/instantiate1.C2
-rw-r--r--gcc/testsuite/g++.dg/template/instantiate3.C2
-rw-r--r--gcc/testsuite/g++.dg/template/instantiate5.C1
-rw-r--r--gcc/testsuite/g++.dg/template/linkage1.C2
-rw-r--r--gcc/testsuite/g++.dg/template/local4.C1
-rw-r--r--gcc/testsuite/g++.dg/template/local8.C18
-rw-r--r--gcc/testsuite/g++.dg/template/local9.C15
-rw-r--r--gcc/testsuite/g++.dg/template/nested6.C19
-rw-r--r--gcc/testsuite/g++.dg/template/new3.C1
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent14.C7
-rw-r--r--gcc/testsuite/g++.dg/template/nontype7.C3
-rw-r--r--gcc/testsuite/g++.dg/template/offsetof2.C2
-rw-r--r--gcc/testsuite/g++.dg/template/offsetof3.C18
-rw-r--r--gcc/testsuite/g++.dg/template/operator13.C12
-rw-r--r--gcc/testsuite/g++.dg/template/operator14.C7
-rw-r--r--gcc/testsuite/g++.dg/template/operator8.C2
-rw-r--r--gcc/testsuite/g++.dg/template/operator9.C3
-rw-r--r--gcc/testsuite/g++.dg/template/overload14.C18
-rw-r--r--gcc/testsuite/g++.dg/template/pr16564.C10
-rw-r--r--gcc/testsuite/g++.dg/template/pr23510.C22
-rw-r--r--gcc/testsuite/g++.dg/template/pr34938-1.C7
-rw-r--r--gcc/testsuite/g++.dg/template/pr34938-2.C10
-rw-r--r--gcc/testsuite/g++.dg/template/pr51199.C17
-rw-r--r--gcc/testsuite/g++.dg/template/pr51385.C24
-rw-r--r--gcc/testsuite/g++.dg/template/pr52819.C14
-rw-r--r--gcc/testsuite/g++.dg/template/pr54310.C19
-rw-r--r--gcc/testsuite/g++.dg/template/pr54377.C6
-rw-r--r--gcc/testsuite/g++.dg/template/pr54987.C51
-rw-r--r--gcc/testsuite/g++.dg/template/pr57573.C13
-rw-r--r--gcc/testsuite/g++.dg/template/pr61670.C9
-rw-r--r--gcc/testsuite/g++.dg/template/pr61745.C22
-rw-r--r--gcc/testsuite/g++.dg/template/pr64100.C9
-rw-r--r--gcc/testsuite/g++.dg/template/pr65390.C12
-rw-r--r--gcc/testsuite/g++.dg/template/ptrmem2.C1
-rw-r--r--gcc/testsuite/g++.dg/template/ptrmem20.C1
-rw-r--r--gcc/testsuite/g++.dg/template/qualttp17.C4
-rw-r--r--gcc/testsuite/g++.dg/template/qualttp4.C2
-rw-r--r--gcc/testsuite/g++.dg/template/qualttp5.C1
-rw-r--r--gcc/testsuite/g++.dg/template/recurse.C11
-rw-r--r--gcc/testsuite/g++.dg/template/recurse2.C5
-rw-r--r--gcc/testsuite/g++.dg/template/recurse4.C18
-rw-r--r--gcc/testsuite/g++.dg/template/ref9.C15
-rw-r--r--gcc/testsuite/g++.dg/template/repo11.C31
-rw-r--r--gcc/testsuite/g++.dg/template/sfinae2.C1
-rw-r--r--gcc/testsuite/g++.dg/template/spec22.C2
-rw-r--r--gcc/testsuite/g++.dg/template/spec23.C1
-rw-r--r--gcc/testsuite/g++.dg/template/spec28.C2
-rw-r--r--gcc/testsuite/g++.dg/template/static36.C4
-rw-r--r--gcc/testsuite/g++.dg/template/typedef4.C1
-rw-r--r--gcc/testsuite/g++.dg/template/void3.C2
-rw-r--r--gcc/testsuite/g++.dg/template/void7.C2
-rw-r--r--gcc/testsuite/g++.dg/template/vtable2.C4
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" }