@@ -6577,16 +6577,18 @@ warn_defaults_to (location_t location, int opt, const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- rich_location richloc (line_table, location);
+ diagnostic_t kind;
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);
+ if (flag_isoc99 && !flag_pedantic_errors && opt)
+ kind = DK_PERMERROR;
+ else if (flag_isoc99)
+ kind = DK_PEDWARN;
+ else
+ kind = DK_WARNING;
+ emit_diagnostic_valist (kind, location, opt, gmsgid, &ap);
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. */
@@ -10635,9 +10637,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);
+ pedpermerror (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,
@@ -6180,6 +6180,7 @@ that have their own flag:
@gccoptlist{
-Wimplicit-function-declaration @r{(C)}
+-Wimplicit-int @r{(C)}
-Wint-conversion @r{(C)}
-Wnarrowing @r{(C++)}
}
@@ -6851,8 +6852,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}.
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "" } */
+/* { dg-options "-fpermissive" } */
static l; /* { dg-warning "type defaults to" } */
new file mode 100644
@@ -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" } */
+}
@@ -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" } */
new file mode 100644
@@ -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" } */
+}
@@ -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
new file mode 100644
@@ -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" } */
new file mode 100644
@@ -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 } */
@@ -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" } */
new file mode 100644
@@ -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" } */
+}
@@ -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" } */