On Fri, Nov 15, 2024 at 9:13 AM Florian Weimer <fwei...@redhat.com> wrote:
>
> This is another recent GCC extension whose use is apparently
> difficult to spot in code reviews.
>
> The name of the option is due to Jonathan Wakely.  Part of it
> could apply to C++ as well (for labels at the end of a compound
> statement).

I like this idea of having an option here, though I am not a fan of
the name of the option. When I saw `free`, I was not thinking of free
flowing or free radicals but rather free as price (beer).
I can't think of a good alternative though.

Note clang just uses Wc++23-extensions/Wc23-extensions (which is
similar to GCC's Wc11-c23-compat) and does not seem to have another
option to enable/disable this specific one.

Thanks,
Andrew Pinski


>
> gcc/c-family/
>
>         * c-opts.cc (c_common_post_options): Initialize
>         warn_free_labels.
>         * c.opt (Wfree-labels): New option.
>         * c.opt.urls: Regenerate.
>
> gcc/c/
>
>         * c-parser.cc (c_parser_compound_statement_nostart): Use
>         OPT_Wfree_labels for warning about labels on declarations.
>         (c_parser_compound_statement_nostart): Use OPT_Wfree_labels
>         for warning about labels at end of compound statements.
>
> gcc/
>
>         * doc/invoke.texi: Document -Wfree-labels.
>
> gcc/testsuite/
>
>         * gcc.dg/Wfree-labels-1.c: New test.
>         * gcc.dg/Wfree-labels-2.c: New test.
>         * gcc.dg/Wfree-labels-3.c: New test.
>
> ---
>  gcc/c-family/c-opts.cc                |  5 +++++
>  gcc/c-family/c.opt                    |  4 ++++
>  gcc/c-family/c.opt.urls               |  3 +++
>  gcc/c/c-parser.cc                     |  5 +++--
>  gcc/doc/invoke.texi                   | 14 +++++++++++++-
>  gcc/testsuite/gcc.dg/Wfree-labels-1.c | 18 ++++++++++++++++++
>  gcc/testsuite/gcc.dg/Wfree-labels-2.c | 18 ++++++++++++++++++
>  gcc/testsuite/gcc.dg/Wfree-labels-3.c | 18 ++++++++++++++++++
>  8 files changed, 82 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
> index 127f9553e0c..e90730adc34 100644
> --- a/gcc/c-family/c-opts.cc
> +++ b/gcc/c-family/c-opts.cc
> @@ -993,6 +993,11 @@ c_common_post_options (const char **pfilename)
>        = ((pedantic && !flag_isoc23 && warn_c11_c23_compat != 0)
>          || warn_c11_c23_compat > 0);
>
> +  /* Likewise for -Wfree-labels.  */
> +  if (warn_free_labels == -1)
> +    warn_free_labels = ((pedantic && !flag_isoc23 && warn_c11_c23_compat != 
> 0)
> +                       || warn_c11_c23_compat > 0);
> +
>    /* -Wshift-negative-value is enabled by -Wextra in C99 and C++11 to C++17
>       modes.  */
>    if (warn_shift_negative_value == -1)
> diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
> index 61cfe33c251..9226e9d7472 100644
> --- a/gcc/c-family/c.opt
> +++ b/gcc/c-family/c.opt
> @@ -828,6 +828,10 @@ Wframe-address
>  C ObjC C++ ObjC++ Var(warn_frame_address) Warning LangEnabledBy(C ObjC C++ 
> ObjC++,Wall)
>  Warn when __builtin_frame_address or __builtin_return_address is used 
> unsafely.
>
> +Wfree-labels
> +C ObjC Var(warn_free_labels) Init(-1) Warning
> +Warn about labels on declarations and at the end of compound statements.
> +
>  Wglobal-module
>  C++ ObjC++ Var(warn_global_module) Warning Init(1)
>  Warn about the global module fragment not containing only preprocessing 
> directives.
> diff --git a/gcc/c-family/c.opt.urls b/gcc/c-family/c.opt.urls
> index 04f8e2ee008..f2595b9dfc3 100644
> --- a/gcc/c-family/c.opt.urls
> +++ b/gcc/c-family/c.opt.urls
> @@ -418,6 +418,9 @@ UrlSuffix(gcc/Warning-Options.html#index-Wformat)
>  Wframe-address
>  UrlSuffix(gcc/Warning-Options.html#index-Wframe-address)
>
> +Wfree-labels
> +UrlSuffix(gcc/Warning-Options.html#index-Wfree-labels)
> +
>  Wglobal-module
>  UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-Wglobal-module)
>
> diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
> index 70fbf940835..413eaae5fe3 100644
> --- a/gcc/c/c-parser.cc
> +++ b/gcc/c/c-parser.cc
> @@ -7403,7 +7403,7 @@ c_parser_compound_statement_nostart (c_parser *parser)
>                    && (have_std_attrs = true)))
>         {
>           if (last_label)
> -           pedwarn_c11 (c_parser_peek_token (parser)->location, 
> OPT_Wpedantic,
> +           pedwarn_c11 (c_parser_peek_token (parser)->location, 
> OPT_Wfree_labels,
>                          "a label can only be part of a statement and "
>                          "a declaration is not a statement");
>           /* It's unlikely we'll see a nested loop in a declaration in
> @@ -7550,7 +7550,8 @@ c_parser_compound_statement_nostart (c_parser *parser)
>        parser->error = false;
>      }
>    if (last_label)
> -    pedwarn_c11 (label_loc, OPT_Wpedantic, "label at end of compound 
> statement");
> +    pedwarn_c11 (label_loc, OPT_Wfree_labels,
> +                "label at end of compound statement");
>    location_t endloc = c_parser_peek_token (parser)->location;
>    c_parser_consume_token (parser);
>
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 36d79d1c76b..6c2a755a015 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -520,7 +520,7 @@ Objective-C and Objective-C++ Dialects}.
>  }
>
>  @item C and Objective-C-only Warning Options
> -@gccoptlist{-Wbad-function-cast -Wmissing-declarations
> +@gccoptlist{-Wbad-function-cast -Wfree-labels -Wmissing-declarations
>  -Wmissing-parameter-name -Wmissing-parameter-type
>  -Wdeclaration-missing-parameter-type -Wmissing-prototypes
>  -Wmissing-variable-declarations -Wnested-externs -Wold-style-declaration
> @@ -6366,6 +6366,7 @@ name is still supported, but the newer name is more 
> descriptive.)
>  -Wempty-body
>  -Wenum-conversion @r{(only for C/ObjC)}
>  -Wexpansion-to-defined
> +-Wfree-labels @r{(C/ObjC only)}
>  -Wignored-qualifiers  @r{(only for C/C++)}
>  -Wimplicit-fallthrough=3
>  -Wmaybe-uninitialized
> @@ -10011,6 +10012,17 @@ Do not warn if certain built-in macros are 
> redefined.  This suppresses
>  warnings for redefinition of @code{__TIMESTAMP__}, @code{__TIME__},
>  @code{__DATE__}, @code{__FILE__}, and @code{__BASE_FILE__}.
>
> +@opindex Wfree-labels
> +@opindex Wno-free-labels
> +@item -Wfree-labels @r{(C and Objective-C only)}
> +Warn if a label is applied to a non-statement, or occurs at the end of a
> +compound statement.  Such labels are allowed by C23 and later dialects
> +of C, and are available as a GCC extension in all other dialects.
> +
> +This warning is also enabled by @option{-Wc11-c23-compat}.  It is turned
> +into an error if building for a C version before C23 by
> +@option{-pedantic-errors}.
> +
>  @opindex Wheader-guard
>  @item -Wheader-guard
>  Warn if a valid preprocessor header multiple inclusion guard has
> diff --git a/gcc/testsuite/gcc.dg/Wfree-labels-1.c 
> b/gcc/testsuite/gcc.dg/Wfree-labels-1.c
> new file mode 100644
> index 00000000000..a7f9ad4dd50
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/Wfree-labels-1.c
> @@ -0,0 +1,18 @@
> +/* { dg-do compile } */
> +/* { dg-options "-Wfree-labels" } */
> +
> +void
> +f (void)
> +{
> +  goto l;
> + l: /* { dg-warning "label at end of compound statement" } */
> +}
> +
> +int
> +g (void)
> +{
> +  goto l;
> + l:
> +  int x = 0; /* { dg-warning "a label can only be part of a statement" } */
> +  return x;
> +}
> diff --git a/gcc/testsuite/gcc.dg/Wfree-labels-2.c 
> b/gcc/testsuite/gcc.dg/Wfree-labels-2.c
> new file mode 100644
> index 00000000000..56b1fb0aeba
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/Wfree-labels-2.c
> @@ -0,0 +1,18 @@
> +/* { dg-do compile } */
> +/* { dg-options "-std=c11 -pedantic -Wno-free-labels" } */
> +
> +void
> +f (void)
> +{
> +  goto l;
> + l:
> +}
> +
> +int
> +g (void)
> +{
> +  goto l;
> + l:
> +  int x = 0;
> +  return x;
> +}
> diff --git a/gcc/testsuite/gcc.dg/Wfree-labels-3.c 
> b/gcc/testsuite/gcc.dg/Wfree-labels-3.c
> new file mode 100644
> index 00000000000..c9365977dbb
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/Wfree-labels-3.c
> @@ -0,0 +1,18 @@
> +/* { dg-do compile } */
> +/* { dg-options "-Wc11-c23-compat -Wno-free-labels" } */
> +
> +void
> +f (void)
> +{
> +  goto l;
> + l:
> +}
> +
> +int
> +g (void)
> +{
> +  goto l;
> + l:
> +  int x = 0;
> +  return x;
> +}
>
> base-commit: 5f71122e9d83b63d5c572079ebb1df6eba2e4314
>

Reply via email to