diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index beee3bf8029..4f6faf5b806 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-01-03 Paolo Carlini + + PR c++/15867 + * decl.c (duplicate_decls): With -Wredundant-decls don't warn for + declaration followed by specialization. + 2012-01-03 Jakub Jelinek PR c++/51669 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 48f3085a92f..7daac5feff4 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -1698,7 +1698,10 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) /* Don't warn about extern decl followed by definition. */ && !(DECL_EXTERNAL (olddecl) && ! DECL_EXTERNAL (newdecl)) /* Don't warn about friends, let add_friend take care of it. */ - && ! (newdecl_is_friend || DECL_FRIEND_P (olddecl))) + && ! (newdecl_is_friend || DECL_FRIEND_P (olddecl)) + /* Don't warn about declaration followed by specialization. */ + && (! DECL_TEMPLATE_SPECIALIZATION (newdecl) + || DECL_TEMPLATE_SPECIALIZATION (olddecl))) { warning (OPT_Wredundant_decls, "redundant redeclaration of %qD in same scope", newdecl); warning (OPT_Wredundant_decls, "previous declaration of %q+D", olddecl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a75ef954a56..6ac425a63d7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-01-03 Paolo Carlini + + PR c++/15867 + * g++.dg/warn/Wredundant-decls-spec.C: New. + 2012-01-03 Jakub Jelinek PR tree-optimization/51719 diff --git a/gcc/testsuite/g++.dg/warn/Wredundant-decls-spec.C b/gcc/testsuite/g++.dg/warn/Wredundant-decls-spec.C new file mode 100644 index 00000000000..b5c790f474b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wredundant-decls-spec.C @@ -0,0 +1,12 @@ +// PR c++/15867 +// { dg-options -Wredundant-decls } + +template struct S +{ + void foo() {} +}; + +template<> void S::foo(); + +template<> void S::foo(); // { dg-warning "previous declaration" } +template<> void S::foo(); // { dg-warning "redundant redeclaration" }