aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2007-11-12 00:28:41 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2007-11-12 00:28:41 +0000
commitb131ad7c3db37bb79f21f5f6532447d0e030acaa (patch)
tree85e9b9c7db2da544bf03730011a29b03a6bada07 /gcc
parentacd7ad0afc0e2be08fe6582e2b46299601d6db7e (diff)
downloadgcc-b131ad7c3db37bb79f21f5f6532447d0e030acaa.zip
gcc-b131ad7c3db37bb79f21f5f6532447d0e030acaa.tar.gz
gcc-b131ad7c3db37bb79f21f5f6532447d0e030acaa.tar.bz2
re PR c++/8570 (line number in error message is badly placed with illegal template friend declaration)
2007-11-12 Manuel Lopez-Ibanez <manu@gcc.gnu.org> 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. From-SVN: r130092
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/pt.c16
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/warn/pr8570.C13
-rw-r--r--gcc/testsuite/g++.old-deja/g++.ns/template13.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/friend23.C6
6 files changed, 44 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e41c990..cfeea80 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 4d9f122..0339a8c 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 78069d2..3c9a1a0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..0136bb1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/pr8570.C
@@ -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;
diff --git a/gcc/testsuite/g++.old-deja/g++.ns/template13.C b/gcc/testsuite/g++.old-deja/g++.ns/template13.C
index 4655538..7059b19 100644
--- a/gcc/testsuite/g++.old-deja/g++.ns/template13.C
+++ b/gcc/testsuite/g++.old-deja/g++.ns/template13.C
@@ -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" }
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/friend23.C b/gcc/testsuite/g++.old-deja/g++.pt/friend23.C
index abf6c70..baf1a93 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/friend23.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/friend23.C
@@ -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>;