> Date: Sun, 16 Oct 2016 13:58:17 -0700 > From: Philip Guenther <guent...@gmail.com> > > Should have sent this to tech...
Yes please! But by terminating the loop early, I you'll miss the case where the symbol shadows both a function and a global variable. > ---------- Forwarded message ---------- > Date: Sun, 16 Oct 2016 13:57:42 -0700 > From: Philip Guenther <guent...@gmail.com> > To: Jeremie Courreges-Anglas <j...@openbsd.org> > Cc: source-chan...@openbsd.org > Subject: Re: CVS: cvs.openbsd.org: src > > On Sun, 16 Oct 2016, Jeremie Courreges-Anglas wrote: > > CVSROOT: /cvs > > Module name: src > > Changes by: j...@cvs.openbsd.org 2016/10/16 04:40:59 > > > > Modified files: > > usr.sbin/rpc.bootparamd: bootparamd.c > > > > Log message: > > Rename local variable 'err' to 'error', to avoid -Wshadow conflicts with > > err.h > > Ick. I know that newer gcc's have stopped generating shadow warning for > local variables vs global functions, such as this case. Making these > changes just because we have an old gcc is kinda annoying. > > So let's fix that and make our gcc a bit more like new ones. Written > without peeking at the new ones and tested against the .c file at bottom > to verify that it doesn't fail or crash on some weird combo of shadowing. > > oks? > > Philip Guenther > > > Index: c-decl.c > =================================================================== > RCS file: /data/src/openbsd/src/gnu/gcc/gcc/c-decl.c,v > retrieving revision 1.4 > diff -u -p -r1.4 c-decl.c > --- c-decl.c 10 Sep 2015 10:56:35 -0000 1.4 > +++ c-decl.c 16 Oct 2016 20:50:10 -0000 > @@ -1946,8 +1946,19 @@ warn_if_shadowing (tree new_decl) > warning (OPT_Wshadow, "declaration of %q+D shadows a parameter", > new_decl); > else if (DECL_FILE_SCOPE_P (old_decl)) > - warning (OPT_Wshadow, "declaration of %q+D shadows a global " > - "declaration", new_decl); > + { > + /* Don't warn about shadowing a global function unless the local > + variable is a pointer to a function */ > + if (TREE_CODE (old_decl) == FUNCTION_DECL > + && TREE_CODE (new_decl) != FUNCTION_DECL > + && (TREE_CODE (new_decl) != VAR_DECL > + || !POINTER_TYPE_P (TREE_TYPE (new_decl)) > + || TREE_CODE (TREE_TYPE (TREE_TYPE (new_decl))) > + != FUNCTION_TYPE)) > + break; > + warning (OPT_Wshadow, "declaration of %q+D shadows a global " > + "declaration", new_decl); > + } > else if (TREE_CODE (old_decl) == FUNCTION_DECL > && DECL_BUILT_IN (old_decl)) > { > > > > ------ test-shadow.c ------- > int var; > void func(void); > void (*func_ptr)(void) = func; > enum { ENUM }; > typedef int type; > > void > test_var(int var_arg, void (*func_ptr_arg)(void)) > { > int var; > int func; > int func_ptr; > int ENUM; > int type; > { > int var_arg; > int func_ptr_arg; > } > } > > void > test_func_ptr(int var_arg, void (*func_ptr_arg)(void)) > { > void (*var)(void); > void (*func)(void); > void (*func_ptr)(void); > void (*ENUM)(void); > void (*type)(void); > { > void (*var_arg)(void); > void (*func_ptr_arg)(void); > } > } > > void > test_int_ptr(int var_arg, void (*func_ptr_arg)(void)) > { > int *var; > int *func; > int *func_ptr; > int *ENUM; > int *type; > { > int *var_arg; > int *func_ptr_arg; > } > } > > void > test_enum(int var_arg, void (*func_ptr_arg)(void)) > { > enum { var }; > enum { func }; > enum { func_ptr }; > enum { ENUM }; > enum { type }; > { > enum { var_arg }; > enum { func_ptr_arg }; > } > } > > void > test_type(int var_arg, void (*func_ptr_arg)(void)) > { > typedef int var; > typedef int func; > typedef int func_ptr; > typedef int ENUM; > typedef int type; > { > typedef int var_arg; > typedef int func_ptr_arg; > } > } > > void > test_var_param( > int var, > int func, > int func_ptr, > int ENUM, > int type) > { > } > > void > test_func_ptr_param( > void (*var)(void), > void (*func)(void), > void (*func_ptr)(void), > void (*ENUM)(void), > void (*type)(void)) > { > } > >