On Mon, Nov 20, 2023 at 10:56:20AM +0100, Florian Weimer wrote:
> Most of these new permerrors are currently not diagnosed in system
> headers.
> 
> gcc/
> 
>       PR c/91093
>       PR c/96284
>       * doc/invoke.texi (Warning Options): Document changes.
> 
> gcc/c/
> 
>       * c-decl.cc (warn_defaults_to): Remove.
>       (grok_declarator, start_function): Call permerror_opt
>       instead of warn_defaults_to.
>       (store_parm_decls_oldstyle): Call permerror_opt for
>       OPT_Wimplicit_int.
> 
> gcc/testsuite/
> 
>       * gcc.dg/permerror-default.c (implicit_int_1, implicit_int_2)
>       (implicit_int_3, implicit_int_4): Expect new permerror.
>       * gcc.dg/permerror-system.c: Expect a single new permerror.
>       * gcc.dg/Wimplicit-int-1.c: Compile with -fpermissive due to
>       expected warning.
>       * gcc.dg/Wimplicit-int-4.c: Likewise.
>       * gcc.dg/Wimplicit-int-1a.c: New test.  Copied from
>       gcc.dg/Wimplicit-int-1.c, but expect errors.
>       * gcc.dg/Wimplicit-int-4a.c: New test.  Copied from
>       gcc.dg/Wimplicit-int-4.c, but expect errors.
>       * gcc.dg/gnu23-attr-syntax-2.c: Compile with -fpermissive
>       due to expected implicit-int error.
>       * gcc.dg/gnu23-attr-syntax-3.c: New test.  Copied from
>       gcc.dg/gnu23-attr-syntax-2.c, but expect an error.
>       * gcc.dg/pr105635.c: Build with -fpermissive due to implicit
>       int.
>       * gcc.dg/pr105635-2.c: New test.  Copied from
>       gcc.dg/pr105635.c.  Expect implicit int error.
>       * gcc.dg/noncompile/pr79758.c: Build with -fpermissive due to
>       implicit        int.

Some extra whitespaces here.

The patch looks good.

>       * gcc.dg/noncompile/pr79758-2.c: New test.  Copied from
>       gcc.dg/noncompile/pr79758.c.  Expect implicit int error.
> ---
>  gcc/c/c-decl.cc                             | 43 ++++++---------------
>  gcc/doc/invoke.texi                         |  7 +++-
>  gcc/testsuite/gcc.dg/Wimplicit-int-1.c      |  2 +-
>  gcc/testsuite/gcc.dg/Wimplicit-int-1a.c     | 11 ++++++
>  gcc/testsuite/gcc.dg/Wimplicit-int-4.c      |  2 +-
>  gcc/testsuite/gcc.dg/Wimplicit-int-4a.c     | 11 ++++++
>  gcc/testsuite/gcc.dg/gnu23-attr-syntax-2.c  |  2 +-
>  gcc/testsuite/gcc.dg/gnu23-attr-syntax-3.c  | 17 ++++++++
>  gcc/testsuite/gcc.dg/noncompile/pr79758-2.c |  6 +++
>  gcc/testsuite/gcc.dg/noncompile/pr79758.c   |  1 +
>  gcc/testsuite/gcc.dg/permerror-default.c    | 12 +++---
>  gcc/testsuite/gcc.dg/permerror-system.c     |  2 +
>  gcc/testsuite/gcc.dg/pr105635-2.c           | 11 ++++++
>  gcc/testsuite/gcc.dg/pr105635.c             |  2 +-
>  14 files changed, 86 insertions(+), 43 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/Wimplicit-int-1a.c
>  create mode 100644 gcc/testsuite/gcc.dg/Wimplicit-int-4a.c
>  create mode 100644 gcc/testsuite/gcc.dg/gnu23-attr-syntax-3.c
>  create mode 100644 gcc/testsuite/gcc.dg/noncompile/pr79758-2.c
>  create mode 100644 gcc/testsuite/gcc.dg/pr105635-2.c
> 
> diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
> index 011f0bf0a69..893e24f7dc6 100644
> --- a/gcc/c/c-decl.cc
> +++ b/gcc/c/c-decl.cc
> @@ -647,8 +647,6 @@ static tree grokdeclarator (const struct c_declarator *,
>                           bool *, enum deprecated_states);
>  static tree grokparms (struct c_arg_info *, bool);
>  static void layout_array_type (tree);
> -static void warn_defaults_to (location_t, int, const char *, ...)
> -    ATTRIBUTE_GCC_DIAG(3,4);
>  static const char *header_for_builtin_fn (tree);
>  
>  /* T is a statement.  Add it to the statement-tree.  This is the
> @@ -6570,23 +6568,6 @@ warn_variable_length_array (tree name, tree size)
>      }
>  }
>  
> -/* Print warning about defaulting to int if necessary.  */
> -
> -static void
> -warn_defaults_to (location_t location, int opt, const char *gmsgid, ...)
> -{
> -  diagnostic_info diagnostic;
> -  va_list ap;
> -  rich_location richloc (line_table, location);
> -
> -  va_start (ap, gmsgid);
> -  diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc,
> -                       flag_isoc99 ? DK_PEDWARN : DK_WARNING);
> -  diagnostic.option_index = opt;
> -  diagnostic_report_diagnostic (global_dc, &diagnostic);
> -  va_end (ap);
> -}
> -
>  /* Returns the smallest location != UNKNOWN_LOCATION in LOCATIONS,
>     considering only those c_declspec_words found in LIST, which
>     must be terminated by cdw_number_of_elements.  */
> @@ -6875,12 +6856,12 @@ grokdeclarator (const struct c_declarator *declarator,
>        else
>       {
>         if (name)
> -         warn_defaults_to (loc, OPT_Wimplicit_int,
> -                           "type defaults to %<int%> in declaration "
> -                           "of %qE", name);
> +         permerror_opt (loc, OPT_Wimplicit_int,
> +                        "type defaults to %<int%> in declaration "
> +                        "of %qE", name);
>         else
> -         warn_defaults_to (loc, OPT_Wimplicit_int,
> -                           "type defaults to %<int%> in type name");
> +         permerror_opt (loc, OPT_Wimplicit_int,
> +                        "type defaults to %<int%> in type name");
>       }
>      }
>  
> @@ -10290,10 +10271,10 @@ start_function (struct c_declspecs *declspecs, 
> struct c_declarator *declarator,
>      }
>  
>    if (warn_about_return_type)
> -    warn_defaults_to (loc, flag_isoc99 ? OPT_Wimplicit_int
> -                        : (warn_return_type > 0 ? OPT_Wreturn_type
> -                           : OPT_Wimplicit_int),
> -                   "return type defaults to %<int%>");
> +    permerror_opt (loc, flag_isoc99 ? OPT_Wimplicit_int
> +                : (warn_return_type > 0 ? OPT_Wreturn_type
> +                   : OPT_Wimplicit_int),
> +                "return type defaults to %<int%>");
>  
>    /* Make the init_value nonzero so pushdecl knows this is not tentative.
>       error_mark_node is replaced below (in pop_scope) with the BLOCK.  */
> @@ -10635,9 +10616,9 @@ store_parm_decls_oldstyle (tree fndecl, const struct 
> c_arg_info *arg_info)
>         warn_if_shadowing (decl);
>  
>         if (flag_isoc99)
> -         pedwarn (DECL_SOURCE_LOCATION (decl),
> -                  OPT_Wimplicit_int, "type of %qD defaults to %<int%>",
> -                  decl);
> +         permerror_opt (DECL_SOURCE_LOCATION (decl),
> +                        OPT_Wimplicit_int, "type of %qD defaults to %<int%>",
> +                        decl);
>         else
>           warning_at (DECL_SOURCE_LOCATION (decl),
>                       OPT_Wmissing_parameter_type,
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 055cca08f1c..eb7417fd9be 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -6182,6 +6182,7 @@ that have their own flag:
>  
>  @gccoptlist{
>  -Wimplicit-function-declaration @r{(C)}
> +-Wimplicit-int @r{(C)}
>  -Wint-conversion @r{(C)}
>  -Wnarrowing @r{(C++)}
>  }
> @@ -6853,8 +6854,10 @@ This warning is enabled by @option{-Wall} in C++.
>  @opindex Wno-implicit-int
>  @item -Wno-implicit-int @r{(C and Objective-C only)}
>  This option controls warnings when a declaration does not specify a type.
> -This warning is enabled by default in C99 and later dialects of C,
> -and also by @option{-Wall}.
> +This warning is enabled by default, as an error, in C99 and later
> +dialects of C, and also by @option{-Wall}.  The error can be downgraded
> +to a warning using @option{-fpermissive} (along with certain other
> +errors), or for this error alone, with @option{-Wno-error=implicit-int}.
>  
>  This warning is upgraded to an error by @option{-pedantic-errors}.
>  
> diff --git a/gcc/testsuite/gcc.dg/Wimplicit-int-1.c 
> b/gcc/testsuite/gcc.dg/Wimplicit-int-1.c
> index 4a96e8f505d..fc7726c517e 100644
> --- a/gcc/testsuite/gcc.dg/Wimplicit-int-1.c
> +++ b/gcc/testsuite/gcc.dg/Wimplicit-int-1.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "" } */
> +/* { dg-options "-fpermissive" } */
>  
>  static l; /* { dg-warning "type defaults to" } */
>  
> diff --git a/gcc/testsuite/gcc.dg/Wimplicit-int-1a.c 
> b/gcc/testsuite/gcc.dg/Wimplicit-int-1a.c
> new file mode 100644
> index 00000000000..ef1835e2d3a
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/Wimplicit-int-1a.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "" } */
> +
> +static l; /* { dg-error "type defaults to" } */
> +
> +foo (a) /* { dg-error "return type defaults to" } */
> +/* { dg-error "type of .a. defaults to .int." "type" { target *-*-* } .-1 } 
> */
> +{
> +  auto p; /* { dg-error "type defaults to" } */
> +  typedef bar; /* { dg-error "type defaults to" } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/Wimplicit-int-4.c 
> b/gcc/testsuite/gcc.dg/Wimplicit-int-4.c
> index c9c6e8e5e95..99c61a76ecf 100644
> --- a/gcc/testsuite/gcc.dg/Wimplicit-int-4.c
> +++ b/gcc/testsuite/gcc.dg/Wimplicit-int-4.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-Wno-implicit -Wimplicit-int" } */
> +/* { dg-options "-fpermissive -Wno-implicit -Wimplicit-int" } */
>  
>  static l; /* { dg-warning "type defaults to" } */
>  
> diff --git a/gcc/testsuite/gcc.dg/Wimplicit-int-4a.c 
> b/gcc/testsuite/gcc.dg/Wimplicit-int-4a.c
> new file mode 100644
> index 00000000000..920a088f02b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/Wimplicit-int-4a.c
> @@ -0,0 +1,11 @@
> +/* { dg-do compile } */
> +/* { dg-options "-Wno-implicit -Wimplicit-int" } */
> +
> +static l; /* { dg-error "type defaults to" } */
> +
> +foo (a) /* { dg-error "return type defaults to" } */
> +/* { dg-error "type of .a. defaults to .int." "type" { target *-*-* } .-1 } 
> */
> +{
> +  auto p; /* { dg-error "type defaults to" } */
> +  typedef bar; /* { dg-error "type defaults to" } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/gnu23-attr-syntax-2.c 
> b/gcc/testsuite/gcc.dg/gnu23-attr-syntax-2.c
> index ba60f7a095a..8943534f2b2 100644
> --- a/gcc/testsuite/gcc.dg/gnu23-attr-syntax-2.c
> +++ b/gcc/testsuite/gcc.dg/gnu23-attr-syntax-2.c
> @@ -1,7 +1,7 @@
>  /* Test C23 attribute syntax.  Invalid uses of attributes with GNU C
>     features.  */
>  /* { dg-do compile } */
> -/* { dg-options "-std=gnu23 -w" } */
> +/* { dg-options "-fpermissive -std=gnu23 -w" } */
>  
>  /* Attributes cannot be used as prefix attributes on old-style
>     parameter declarations or on function declarators with identifier
> diff --git a/gcc/testsuite/gcc.dg/gnu23-attr-syntax-3.c 
> b/gcc/testsuite/gcc.dg/gnu23-attr-syntax-3.c
> new file mode 100644
> index 00000000000..d73d6a3cfa8
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/gnu23-attr-syntax-3.c
> @@ -0,0 +1,17 @@
> +/* Test C23 attribute syntax.  Invalid uses of attributes with GNU C
> +   features.  Non-permissive variant.  */
> +/* { dg-do compile } */
> +/* { dg-options "-std=gnu23 -w" } */
> +
> +/* Attributes cannot be used as prefix attributes on old-style
> +   parameter declarations or on function declarators with identifier
> +   lists (removed from C23).  */
> +
> +void (*f(a, b) [[]])() int a, b; { } /* { dg-error "expected" } */
> +
> +void f(x, y) int x; [[]] int y; { } /* { dg-error "expected" } */
> +/* { dg-error "type of 'y' defaults to 'int'" "" { target *-*-* } .-1 } */
> +
> +/* Nonempty attributes cannot be used as postfix attributes with
> +   __auto_type.  */
> +__auto_type [[gnu::no_such_attr]] x = 1; /* { dg-error "'__auto_type' 
> followed by" } */
> diff --git a/gcc/testsuite/gcc.dg/noncompile/pr79758-2.c 
> b/gcc/testsuite/gcc.dg/noncompile/pr79758-2.c
> new file mode 100644
> index 00000000000..e6a27f952ef
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/noncompile/pr79758-2.c
> @@ -0,0 +1,6 @@
> +/* PR c/79758 */
> +/* { dg-do compile } */
> +
> +void fn1 (int[a]) { }; /* { dg-error "undeclared here" } */
> +void fn1 (b) { }; /* { dg-error "redefinition" } */
> +/* { dg-error "defaults to 'int'" "" { target *-*-* } .-1 } */
> diff --git a/gcc/testsuite/gcc.dg/noncompile/pr79758.c 
> b/gcc/testsuite/gcc.dg/noncompile/pr79758.c
> index a31216068f0..e42a44380fa 100644
> --- a/gcc/testsuite/gcc.dg/noncompile/pr79758.c
> +++ b/gcc/testsuite/gcc.dg/noncompile/pr79758.c
> @@ -1,5 +1,6 @@
>  /* PR c/79758 */
>  /* { dg-do compile } */
> +/* { dg-additional-options "-fpermissive" } */
>  
>  void fn1 (int[a]) { }; /* { dg-error "undeclared here" } */
>  void fn1 (b) { }; /* { dg-error "redefinition" } */
> diff --git a/gcc/testsuite/gcc.dg/permerror-default.c 
> b/gcc/testsuite/gcc.dg/permerror-default.c
> index f37f9189e41..90f2220037c 100644
> --- a/gcc/testsuite/gcc.dg/permerror-default.c
> +++ b/gcc/testsuite/gcc.dg/permerror-default.c
> @@ -10,13 +10,13 @@ implicit_function_declaration (void)
>    f1 (); /* { dg-error "'f1' \\\[-Wimplicit-function-declaration\\\]" } */
>  }
>  
> -extern implicit_int_1; /* { dg-warning "'implicit_int_1' 
> \\\[-Wimplicit-int\\\]" } */
> -typedef implicit_int_2; /* { dg-warning "'implicit_int_2' 
> \\\[-Wimplicit-int\\\]" } */
> -extern implicit_int_3 (void); /* { dg-warning "'implicit_int_3' 
> \\\[-Wimplicit-int\\]" } */
> -implicit_int_4 (i) /* { dg-warning "return type defaults to 'int' 
> \\\[-Wimplicit-int\\\]" } */
> -/* { dg-warning "type of 'i' defaults to 'int' \\\[-Wimplicit-int\\\]" "" { 
> target *-*-*} .-1 } */
> +extern implicit_int_1; /* { dg-error "'implicit_int_1' 
> \\\[-Wimplicit-int\\\]" } */
> +typedef implicit_int_2; /* { dg-error "'implicit_int_2' 
> \\\[-Wimplicit-int\\\]" } */
> +extern implicit_int_3 (void); /* { dg-error "'implicit_int_3' 
> \\\[-Wimplicit-int\\]" } */
> +implicit_int_4 (i) /* { dg-error "return type defaults to 'int' 
> \\\[-Wimplicit-int\\\]" } */
> +/* { dg-error "type of 'i' defaults to 'int' \\\[-Wimplicit-int\\\]" "" { 
> target *-*-*} .-1 } */
>  {
> -  (const) 0; /* { dg-warning "type defaults to 'int' in type name 
> \\\[-Wimplicit-int\\\]" } */
> +  (const) 0; /* { dg-error "type defaults to 'int' in type name 
> \\\[-Wimplicit-int\\\]" } */
>  }
>  
>  extern int missing_parameter_type (i); /* { dg-warning "parameter names 
> \\\(without types\\\) in function declaration\n" } */
> diff --git a/gcc/testsuite/gcc.dg/permerror-system.c 
> b/gcc/testsuite/gcc.dg/permerror-system.c
> index e4da4a99e9a..60c65ffc1d4 100644
> --- a/gcc/testsuite/gcc.dg/permerror-system.c
> +++ b/gcc/testsuite/gcc.dg/permerror-system.c
> @@ -10,6 +10,8 @@
>  
>  /* { dg-error "'f1' \\\[-Wimplicit-function-declaration\\\]" "" { target 
> *-*-* } 10 } */
>  
> +/* { dg-error "type of 'i' defaults to 'int' \\\[-Wimplicit-int\\\]" "" { 
> target *-*-*} 16 } */
> +
>  /* { dg-error "pointer/integer type mismatch in conditional expression 
> \\\[-Wint-conversion\\\]" "" { target *-*-* } 29 } */
>  /* { dg-error "pointer/integer type mismatch in conditional expression 
> \\\[-Wint-conversion\\\]" "" { target *-*-* } 30 } */
>  /* { dg-error "passing argument 1 of 'f2' makes pointer from integer without 
> a cast \\\[-Wint-conversion\\\]" "" { target *-*-* } 31 } */
> diff --git a/gcc/testsuite/gcc.dg/pr105635-2.c 
> b/gcc/testsuite/gcc.dg/pr105635-2.c
> new file mode 100644
> index 00000000000..807eef0b7cd
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr105635-2.c
> @@ -0,0 +1,11 @@
> +/* PR c/105635 */
> +/* { dg-do compile } */
> +/* { dg-options "-Wall" } */
> +
> +void foo (int, int[*]);      /* { dg-message "previous declaration of 'foo' 
> with type" } */
> +
> +foo (int x, int y)   /* { dg-error "return type defaults to 'int'" } */
> +{                    /* { dg-warning "conflicting types for 'foo'" "" { 
> target *-*-* } .-1 } */
> +                     /* { dg-message "declared here" "" { target *-*-* } .-2 
> } */
> +  return (x >= 0) != (y < 0);        /* { dg-warning "'return' with a value, 
> in function returning void" } */
> +}
> diff --git a/gcc/testsuite/gcc.dg/pr105635.c b/gcc/testsuite/gcc.dg/pr105635.c
> index aa02f593bfa..b98ea1b3c3b 100644
> --- a/gcc/testsuite/gcc.dg/pr105635.c
> +++ b/gcc/testsuite/gcc.dg/pr105635.c
> @@ -1,6 +1,6 @@
>  /* PR c/105635 */
>  /* { dg-do compile } */
> -/* { dg-options "-Wall" } */
> +/* { dg-options "-fpermissive -Wall" } */
>  
>  void foo (int, int[*]);      /* { dg-message "previous declaration of 'foo' 
> with type" } */
>  
> -- 
> 2.42.0
> 
> 

Marek

Reply via email to