From 02a689aec8358a17be8d212047b4e0fb5af334ee Mon Sep 17 00:00:00 2001 From: simonb Date: Mon, 23 Apr 2007 21:48:37 +0000 Subject: [PATCH] * cp/decl.c (grokparms): Added new error for duplicate function parameters names in function prototypes, to match gcc behavior. * testsuite/g++.dg/other/error15.C: New. * testsuite/g++.dg/cpp0x/variadic-ex9.C: Renamed function parameter to avoid triggering a "multiple parameters named" error. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124083 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 5 +++ gcc/cp/decl.c | 11 ++++++ gcc/testsuite/ChangeLog | 6 ++++ gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C | 2 +- gcc/testsuite/g++.dg/other/error15.C | 60 +++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/other/error15.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1b19ffc..f3eb5de 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2007-04-23 Simon Baldwin + + * decl.c (grokparms): Added new error for duplicate function + parameters names in function prototypes, to match gcc behavior. + 2007-04-23 Jan Hubicka * cp/decl2.c (finish_objects): Do not call target constructor/destructor diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 76be055..de5338b 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -52,6 +52,7 @@ Boston, MA 02110-1301, USA. */ #include "debug.h" #include "timevar.h" #include "tree-flow.h" +#include "pointer-set.h" static tree grokparms (cp_parameter_declarator *, tree *); static const char *redeclaration_error_message (tree, tree); @@ -8898,6 +8899,7 @@ grokparms (cp_parameter_declarator *first_parm, tree *parms) int ellipsis = !first_parm || first_parm->ellipsis_p; cp_parameter_declarator *parm; int any_error = 0; + struct pointer_set_t *unique_decls = pointer_set_create (); for (parm = first_parm; parm != NULL; parm = parm->next) { @@ -8982,6 +8984,14 @@ grokparms (cp_parameter_declarator *first_parm, tree *parms) && parm->next) error ("parameter packs must be at the end of the parameter list"); + if (DECL_NAME (decl)) + { + if (pointer_set_contains (unique_decls, DECL_NAME (decl))) + error ("multiple parameters named %qD", DECL_NAME (decl)); + else + pointer_set_insert (unique_decls, DECL_NAME (decl)); + } + TREE_CHAIN (decl) = decls; decls = decl; result = tree_cons (init, type, result); @@ -8992,6 +9002,7 @@ grokparms (cp_parameter_declarator *first_parm, tree *parms) result = chainon (result, void_list_node); *parms = decls; + pointer_set_destroy (unique_decls); return result; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1358818..5c92239 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-04-23 Simon Baldwin + + * g++.dg/other/error15.C: New. + * g++.dg/cpp0x/variadic-ex9.C: Renamed function parameter to avoid + triggering a "multiple parameters named" error. + 2007-04-23 Thomas Koenig PR fortran/31618 diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C b/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C index ec78a7a..74215c9 100644 --- a/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-ex9.C @@ -1,7 +1,7 @@ // { dg-options "-std=gnu++0x" } template char& f(Args... args); // #1 template short& f(T1 a1, Args... args); // #2 -template int& f(T1 a2, T2 a2); // #3 +template int& f(T1 a2, T2 a3); // #3 void g() { char& x = f(); // calls #1 diff --git a/gcc/testsuite/g++.dg/other/error15.C b/gcc/testsuite/g++.dg/other/error15.C new file mode 100644 index 0000000..0a5bae1 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/error15.C @@ -0,0 +1,60 @@ +// Test that duplicate function parameters are found in declarations. + +extern void g0 (int a, int b); +extern void g1 (int a, float b); + +extern void f0 (int a, + int a); // { dg-error "multiple parameters named 'a'" } +extern void f1 (int a, + float a); // { dg-error "multiple parameters named 'a'" } +extern void f3 (int a, int b, int c, + int a); // { dg-error "multiple parameters named 'a'" } +extern void f4 (int a, int b, int c, + int a, + int a); // { dg-error "multiple parameters named 'a'" } +extern void f5 (int a, int b, int c, int d, int e, int f, int g, int h, + int a, + int i, int j, int k, int l, int m, int n, int o, int p, + int q, int r, int s, int t, int u, int v, int w, int x, int y, + int z); // { dg-error "multiple parameters named 'a'" } + +extern void f6 (int a, int, int, int, int, int, int, int, int, int, int, + int a, + int, int, int, int, int, int, int, int, int, int, int, + float, float, float, float, float, float, float, float, + int); // { dg-error "multiple parameters named 'a'" } + +extern void f7 (void (*a)(int), + void (*a)(int)); // { dg-error "multiple parameters named 'a'" } +extern void f8 (float (*a)(int), + int (*a)(float)); // { dg-error "multiple parameters named 'a'" } + +extern void f9 (int a, + int a, + int a); +// { dg-error "multiple parameters named 'a'" "" { target *-*-* } 34 } + +extern void f10 (int a, + int b, + int c, + int c, + int b, + int a); +// { dg-error "multiple parameters named 'a'" "" { target *-*-* } 42 } +// { dg-error "multiple parameters named 'b'" "" { target *-*-* } 42 } +// { dg-error "multiple parameters named 'c'" "" { target *-*-* } 42 } + +class C1 { + public: + void C1_g0 (int a, int b); + void C1_f0 (int a, + int a); // { dg-error "multiple parameters named 'a'" } +}; + +template +class C2 { + public: + void C2_g0 (T a, T b); + void C2_f0 (T a, + T a); // { dg-error "multiple parameters named 'a'" } +}; -- 2.7.4