]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2007-11-12 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
authormanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Nov 2007 00:28:41 +0000 (00:28 +0000)
committermanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Nov 2007 00:28:41 +0000 (00:28 +0000)
PR c++/8570
cp/
* pt.c (redeclare_class_template): Update error message. Use a
note to show the previous declaration.
(tsubst_friend_class): Use the location of the friend template as
the input location before calling redeclare_class_template.
testsuite/
* g++.old-deja/g++.ns/template13.C: Update expected output.
* g++.old-deja/g++.pt/friend23.C: Likewise.
* g++.dg/warn/pr8570.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130092 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/pr8570.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.ns/template13.C
gcc/testsuite/g++.old-deja/g++.pt/friend23.C

index e41c99028fca9a9911120b3f9cdda3aa1933773b..cfeea801148f97c17089e5fe06582d1454d71558 100644 (file)
@@ -1,3 +1,11 @@
+2007-11-12  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
+
+       PR c++/8570
+       * pt.c (redeclare_class_template): Update error message. Use a
+       note to show the previous declaration.
+       (tsubst_friend_class): Use the location of the friend template as
+       the input location before calling redeclare_class_template.
+
 2007-11-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/34068
index 4d9f12203444bce8822a77fb2a353c0e088bb8dd..0339a8c02d3ba75145e00a5018e3cc4101a8c6e1 100644 (file)
@@ -4151,10 +4151,10 @@ redeclare_class_template (tree type, tree parms)
 
   if (TREE_VEC_LENGTH (parms) != TREE_VEC_LENGTH (tmpl_parms))
     {
-      error ("previous declaration %q+D", tmpl);
-      error ("used %d template parameter(s) instead of %d",
-            TREE_VEC_LENGTH (tmpl_parms),
-            TREE_VEC_LENGTH (parms));
+      error ("redeclared with %d template parameter(s)", 
+             TREE_VEC_LENGTH (parms));
+      inform ("previous declaration %q+D used %d template parameter(s)", 
+             tmpl, TREE_VEC_LENGTH (tmpl_parms));
       return false;
     }
 
@@ -4193,7 +4193,7 @@ redeclare_class_template (tree type, tree parms)
             A template-parameter may not be given default arguments
             by two different declarations in the same scope.  */
          error ("redefinition of default argument for %q#D", parm);
-         error ("%J  original definition appeared here", tmpl_parm);
+         inform ("%Joriginal definition appeared here", tmpl_parm);
          return false;
        }
 
@@ -6521,9 +6521,15 @@ tsubst_friend_class (tree friend_tmpl, tree args)
          > TMPL_ARGS_DEPTH (args))
        {
          tree parms;
+          location_t saved_input_location;
          parms = tsubst_template_parms (DECL_TEMPLATE_PARMS (friend_tmpl),
                                         args, tf_warning_or_error);
+
+          saved_input_location = input_location;
+          input_location = DECL_SOURCE_LOCATION (friend_tmpl);
          redeclare_class_template (TREE_TYPE (tmpl), parms);
+          input_location = saved_input_location;
+          
        }
 
       friend_type = TREE_TYPE (tmpl);
index 78069d25e0b40ee6d27f5ea7136118eee2b58f95..3c9a1a09891159c1e8587f904bb08235d1d3c997 100644 (file)
@@ -1,3 +1,10 @@
+2007-11-12  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
+
+       PR c++/8570
+       * g++.old-deja/g++.ns/template13.C: Update expected output.
+       * g++.old-deja/g++.pt/friend23.C: Likewise.
+       * g++.dg/warn/pr8570.C: New.
+
 2007-11-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/34068
diff --git a/gcc/testsuite/g++.dg/warn/pr8570.C b/gcc/testsuite/g++.dg/warn/pr8570.C
new file mode 100644 (file)
index 0000000..0136bb1
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/8570
+// { dg-do compile }
+// { dg-options "" }
+template <typename T, typename P>
+class X { // { dg-warning "note: previous declaration .* used 2" }
+public:
+  X() { }
+
+private:
+  template <typename U> friend class X; // { dg-error "error: .*redeclared with 1 template parameter" }
+};
+
+X<int, int> i;
index 46555387af3ea05c41bd40ad81ec5409c637b31f..7059b1949f85327f7c0d499b078a8376e4fb4cbb 100644 (file)
@@ -5,7 +5,7 @@ namespace bar
   // trick it to provide some prior declaration
   template<class T>
   void foo(); // { dg-error "definition" }
-  template<class T>class X; // { dg-error "previous declaration" }
+  template<class T>class X; // { dg-error "note: previous declaration" }
 }
 
 template <typename T>
@@ -20,4 +20,4 @@ template<> void bar::foo<int>()     // { dg-error "different namespace" }
 }
 
 template<class T,class U>
-class bar::X{};         // { dg-error "1 template parameter" }
+class bar::X{};         // { dg-error "error: redeclared with 2 template parameter" }
index abf6c709aba972d44bb0c57691b730d76bcd2883..baf1a931cbaa7436c1dcbb55987f75a3d90c2c85 100644 (file)
@@ -1,10 +1,10 @@
 // { dg-do assemble  }
 
-template <class T = int> // { dg-error "" } original definition
+template <class T = int> // { dg-error "note: original definition" }
 struct S
-{ // { dg-error "" } redefinition of default arg
+{ 
   template <class U = int>
-  friend class S;
+  friend class S; // { dg-error "redefinition of default argument" }
 };
 
 template struct S<int>;