[PATCH] Fix -Wdisallowed-function-list=* (PR c++/39554)
Richard Guenther
richard.guenther@gmail.com
Thu Mar 26 16:39:00 GMT 2009
On Thu, Mar 26, 2009 at 4:57 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Thu, Mar 26, 2009 at 01:08:43PM +0100, Richard Guenther wrote:
>> On Thu, Mar 26, 2009 at 10:50 AM, Jakub Jelinek <jakub@redhat.com> wrote:
>> > On Wed, Mar 25, 2009 at 07:38:39PM -0400, Diego Novillo wrote:
>> >> On Wed, Mar 25, 2009 at 17:31, Jakub Jelinek <jakub@redhat.com> wrote:
>> >>
>> >> > + fnname = IDENTIFIER_POINTER (DECL_NAME (fndecl));
>> >>
>> >> How about just using get_name (fndecl)?
>> >
>> > get_name sounds like overkill, when we know we have a FUNCTION_DECL. Also,
>> > it wouldn't simplify the function, as instead of testing DECL_NAME
>> > for non-NULL we'd now have to fnname = get_name (fndecl); and add
>> > if (fnname == NULL) return; after it. I count > 150 uses of
>> > IDENTIFIER_POINTER (DECL_NAME (...)) in gcc, so this wouldn't be the first
>> > or last use of it. The bigger problem is what Mark said, this kind of name
>> > comparison doesn't play well with C++.
>>
>> Can we just make this new warning C only then?
>
> Or just remove it altogether? Comparison of function names is problematic
> and we have e.g. the deprecated attribute which can be used very well for
> what was meant to be done.
>
> #include <alloca.h>
> #undef alloca
> extern __typeof (alloca) alloca __attribute__((deprecated));
>
> ...
>
> void foo (int i)
> {
> void *p = alloca (i);
> }
>
> works well for me, you can even include other system headers after this
> just fine. Alternative patch to remove it, bootstrapped/regtested on
> x86_64-linux and i686-linux.
Yeah. +1
I cannot approve the C parts, but all middle-end changes are ok.
Thanks,
Richard.
> 2009-03-26 Jakub Jelinek <jakub@redhat.com>
>
> PR c++/39554
> * opts.c (warning_disallowed_functions, warn_disallowed_functions,
> warn_if_disallowed_function_p): Removed.
> (common_handle_option): Don't handle OPT_Wdisallowed_function_list_.
> * c-parser.c (c_parser_postfix_expression_after_primary): Don't call
> warning_if_disallowed_function_p.
> * flags.h (warn_if_disallowed_function_p,
> warn_disallowed_functions): Removed.
> * common.opt (Wdisallowed-function-list=): Removed.
> * doc/invoke.texi (-Wdisallowed-function-list=): Removed.
>
> * parser.c (cp_parser_postfix_expression): Don't call
> warning_if_disallowed_function_p.
>
> * gcc.dg/wdisallowed-functions-1.c: Removed.
> * gcc.dg/wdisallowed-functions-2.c: Removed.
> * g++.dg/warn/Wdisallowed-functions-1.C: Removed.
> * g++.dg/warn/Wdisallowed-functions-2.C: Removed.
>
> --- gcc/opts.c.jj 2009-03-26 14:08:22.000000000 +0100
> +++ gcc/opts.c 2009-03-26 14:32:41.000000000 +0100
> @@ -368,12 +368,6 @@ DEF_VEC_ALLOC_P(const_char_p,heap);
>
> static VEC(const_char_p,heap) *ignored_options;
>
> -/* Function calls disallowed under -Wdisallowed-function-list=... */
> -static VEC(char_p,heap) *warning_disallowed_functions;
> -
> -/* If -Wdisallowed-function-list=... */
> -bool warn_disallowed_functions = false;
> -
> /* Input file names. */
> const char **in_fnames;
> unsigned num_in_fnames;
> @@ -740,31 +734,6 @@ flag_instrument_functions_exclude_p (tre
> return false;
> }
>
> -
> -/* Return whether this function call is disallowed. */
> -void
> -warn_if_disallowed_function_p (const_tree exp)
> -{
> - if (TREE_CODE(exp) == CALL_EXPR
> - && VEC_length (char_p, warning_disallowed_functions) > 0)
> - {
> - int i;
> - char *s;
> - const char *fnname =
> - IDENTIFIER_POINTER (DECL_NAME (get_callee_fndecl (exp)));
> - for (i = 0; VEC_iterate (char_p, warning_disallowed_functions, i, s);
> - ++i)
> - {
> - if (strcmp (fnname, s) == 0)
> - {
> - warning (OPT_Wdisallowed_function_list_,
> - "disallowed call to %qs", fnname);
> - break;
> - }
> - }
> - }
> -}
> -
> /* Decode and handle the vector of command line options. LANG_MASK
> contains has a single bit set representing the current
> language. */
> @@ -1627,12 +1596,6 @@ common_handle_option (size_t scode, cons
> set_Wextra (value);
> break;
>
> - case OPT_Wdisallowed_function_list_:
> - warn_disallowed_functions = true;
> - add_comma_separated_to_vector
> - (&warning_disallowed_functions, arg);
> - break;
> -
> case OPT_Werror_:
> enable_warning_as_error (arg, value, lang_mask);
> break;
> --- gcc/cp/parser.c.jj 2009-03-23 22:05:14.000000000 +0100
> +++ gcc/cp/parser.c 2009-03-26 14:34:24.000000000 +0100
> @@ -4823,9 +4823,6 @@ cp_parser_postfix_expression (cp_parser
> koenig_p,
> tf_warning_or_error);
>
> - if (warn_disallowed_functions)
> - warn_if_disallowed_function_p (postfix_expression);
> -
> /* The POSTFIX_EXPRESSION is certainly no longer an id. */
> idk = CP_ID_KIND_NONE;
> }
> --- gcc/c-parser.c.jj 2009-03-23 22:05:14.000000000 +0100
> +++ gcc/c-parser.c 2009-03-26 14:33:29.000000000 +0100
> @@ -5584,8 +5584,6 @@ c_parser_postfix_expression_after_primar
> "expected %<)%>");
> expr.value = build_function_call (expr.value, exprlist);
> expr.original_code = ERROR_MARK;
> - if (warn_disallowed_functions)
> - warn_if_disallowed_function_p (expr.value);
> break;
> case CPP_DOT:
> /* Structure element reference. */
> --- gcc/flags.h.jj 2009-03-02 16:22:16.000000000 +0100
> +++ gcc/flags.h 2009-03-26 14:32:05.000000000 +0100
> @@ -1,6 +1,6 @@
> /* Compilation switch flag definitions for GCC.
> Copyright (C) 1987, 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002,
> - 2003, 2004, 2005, 2006, 2007, 2008
> + 2003, 2004, 2005, 2006, 2007, 2008, 2009
> Free Software Foundation, Inc.
>
> This file is part of GCC.
> @@ -310,13 +310,6 @@ extern enum stack_check_type flag_stack_
> instrumentation. */
> extern bool flag_instrument_functions_exclude_p (tree fndecl);
>
> -/* Emit warning if the function call is disallowed under
> - -Wdisallowed-function-list=... */
> -extern void warn_if_disallowed_function_p (const_tree fncall);
> -
> -/* True, if the -Wdisallowed-function-list=... option has been specified. */
> -extern bool warn_disallowed_functions;
> -
> /* True if the given mode has a NaN representation and the treatment of
> NaN operands is important. Certain optimizations, such as folding
> x * 0 into 0, are not correct for NaN operands, and are normally
> --- gcc/common.opt.jj 2009-03-02 16:22:19.000000000 +0100
> +++ gcc/common.opt 2009-03-26 14:33:05.000000000 +0100
> @@ -94,10 +94,6 @@ Wdisabled-optimization
> Common Var(warn_disabled_optimization) Warning
> Warn when an optimization pass is disabled
>
> -Wdisallowed-function-list=
> -Common RejectNegative Joined Warning
> -Warn on calls to these functions
> -
> Werror
> Common Var(warnings_are_errors)
> Treat all warnings as errors
> --- gcc/doc/invoke.texi.jj 2009-03-25 21:17:55.000000000 +0100
> +++ gcc/doc/invoke.texi 2009-03-26 14:31:23.000000000 +0100
> @@ -233,7 +233,6 @@ Objective-C and Objective-C++ Dialects}.
> -Wchar-subscripts -Wclobbered -Wcomment @gol
> -Wconversion -Wcoverage-mismatch -Wno-deprecated @gol
> -Wno-deprecated-declarations -Wdisabled-optimization @gol
> --Wdisallowed-function-list=@var{sym},@var{sym},@dots{} @gol
> -Wno-div-by-zero -Wempty-body -Wenum-compare -Wno-endif-labels @gol
> -Werror -Werror=* @gol
> -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 @gol
> @@ -4189,13 +4188,6 @@ minimum maximum, so we do not diagnose o
>
> This option is implied by @option{-pedantic}, and can be disabled with
> @option{-Wno-overlength-strings}.
> -
> -@item -Wdisallowed-function-list=@var{sym},@var{sym},@dots{}
> -@opindex Wdisallowed-function-list
> -
> -If any of @var{sym} is called, GCC will issue a warning. This can be useful
> -in enforcing coding conventions that ban calls to certain functions, for
> -example, @code{alloca}, @code{malloc}, etc.
> @end table
>
> @node Debugging Options
> --- gcc/testsuite/gcc.dg/wdisallowed-functions-1.c.jj 2008-09-30 16:54:49.000000000 +0200
> +++ gcc/testsuite/gcc.dg/wdisallowed-functions-1.c 2009-03-26 14:35:24.000000000 +0100
> @@ -1,7 +0,0 @@
> -/* { dg-do compile } */
> -/* { dg-options "-Wdisallowed-function-list=foobar" } */
> -
> -int foobar (int i)
> -{
> - return (i * 5);
> -}
> --- gcc/testsuite/gcc.dg/wdisallowed-functions-2.c.jj 2008-09-30 16:54:48.000000000 +0200
> +++ gcc/testsuite/gcc.dg/wdisallowed-functions-2.c 2009-03-26 14:35:24.000000000 +0100
> @@ -1,12 +0,0 @@
> -/* { dg-do compile } */
> -/* { dg-options "-Wdisallowed-function-list=foo,foobar,bar,foobar" } */
> -
> -int foobar (int i)
> -{
> - return (i * 5);
> -}
> -
> -int foobar1 (int i)
> -{
> - return foobar (i); /* { dg-warning "disallowed call to 'foobar'" } */
> -}
> --- gcc/testsuite/g++.dg/warn/Wdisallowed-functions-1.C.jj 2008-09-30 16:55:11.000000000 +0200
> +++ gcc/testsuite/g++.dg/warn/Wdisallowed-functions-1.C 2009-03-26 14:35:01.000000000 +0100
> @@ -1,7 +0,0 @@
> -/* { dg-do compile } */
> -/* { dg-options "-Wdisallowed-function-list=foobar" } */
> -
> -int foobar (int i)
> -{
> - return (i * 5);
> -}
> --- gcc/testsuite/g++.dg/warn/Wdisallowed-functions-2.C.jj 2008-09-30 16:55:11.000000000 +0200
> +++ gcc/testsuite/g++.dg/warn/Wdisallowed-functions-2.C 2009-03-26 14:35:05.000000000 +0100
> @@ -1,12 +0,0 @@
> -/* { dg-do compile } */
> -/* { dg-options "-Wdisallowed-function-list=foo,foobar,bar,foobar" } */
> -
> -int foobar (int i)
> -{
> - return (i * 5);
> -}
> -
> -int foobar1 (int i)
> -{
> - return foobar (i); /* { dg-warning "disallowed call to 'foobar'" } */
> -}
>
>
> Jakub
>
More information about the Gcc-patches
mailing list