invoke.texi: Document -Wc99-c11-compat.

* doc/invoke.texi: Document -Wc99-c11-compat.
c-family/
	* c.opt (Wc99-c11-compat): New option.
c/
	* c-decl.c (diagnose_mismatched_decls): Unconditionally call
	pedwarn_c99 instead of pedwarn.
	(grokfield): Likewise.
	(warn_defaults_to): New function.
	(grokdeclarator): Call warn_defaults_to instead of pedwarn_c99.
	Unconditionally call pedwarn_c99 instead of pedwarn.
	(start_function): Call warn_defaults_to instead of pedwarn_c99.
	(declspecs_add_scspec): Call pedwarn_c99 instead of pedwarn, don't
	check flag_isoc11 before.
	* c-errors.c (pedwarn_c99): Change the return type to bool.
	Handle -Wc99-c11-compat.
	* c-parser.c (disable_extension_diagnostics): Handle
	warn_c99_c11_compat.
	(restore_extension_diagnostics): Likewise.
	(c_parser_static_assert_declaration_no_semi): Call pedwarn_c99
	instead of pedwarn, don't check flag_isoc11 before.
	(c_parser_declspecs): Likewise.
	(c_parser_alignas_specifier): Likewise.
	(c_parser_alignof_expression): Likewise.
	(c_parser_generic_selection): Likewise.
	* c-tree.h (pedwarn_c99): Update declaration.
	* c-typeck.c (c_finish_return): Call pedwarn or warning_at instead
	of pedwarn_c99.
testsuite/
	* gcc.dg/Wc99-c11-compat-1.c: New test.
	* gcc.dg/Wc99-c11-compat-2.c: New test.
	* gcc.dg/Wc99-c11-compat-3.c: New test.
	* gcc.dg/Wc99-c11-compat-4.c: New test.
	* gcc.dg/Wc99-c11-compat-5.c: New test.
	* gcc.dg/Wc99-c11-compat-6.c: New test.
	* gcc.dg/Wc99-c11-compat-7.c: New test.

From-SVN: r214133
This commit is contained in:
Marek Polacek 2014-08-19 06:04:38 +00:00 committed by Marek Polacek
parent fdec323d35
commit 35aff4fb82
18 changed files with 291 additions and 78 deletions

View File

@ -1,3 +1,7 @@
2014-08-19 Marek Polacek <polacek@redhat.com>
* doc/invoke.texi: Document -Wc99-c11-compat.
2014-08-19 David Malcolm <dmalcolm@redhat.com> 2014-08-19 David Malcolm <dmalcolm@redhat.com>
* rtl.h (PREV_INSN): Split macro in two: the existing one, * rtl.h (PREV_INSN): Split macro in two: the existing one,

View File

@ -1,3 +1,7 @@
2014-08-19 Marek Polacek <polacek@redhat.com>
* c.opt (Wc99-c11-compat): New option.
2014-08-19 Marek Polacek <polacek@redhat.com> 2014-08-19 Marek Polacek <polacek@redhat.com>
* c-opts.c (sanitize_cpp_opts): Make warn_long_long be set according * c-opts.c (sanitize_cpp_opts): Make warn_long_long be set according

View File

@ -295,6 +295,10 @@ Wc90-c99-compat
C ObjC Var(warn_c90_c99_compat) Init(-1) Warning C ObjC Var(warn_c90_c99_compat) Init(-1) Warning
Warn about features not present in ISO C90, but present in ISO C99 Warn about features not present in ISO C90, but present in ISO C99
Wc99-c11-compat
C ObjC Var(warn_c99_c11_compat) Init(-1) Warning
Warn about features not present in ISO C99, but present in ISO C11
Wc++-compat Wc++-compat
C ObjC Var(warn_cxx_compat) Warning C ObjC Var(warn_cxx_compat) Warning
Warn about C constructs that are not in the common subset of C and C++ Warn about C constructs that are not in the common subset of C and C++

View File

@ -1,3 +1,29 @@
2014-08-19 Marek Polacek <polacek@redhat.com>
* c-decl.c (diagnose_mismatched_decls): Unconditionally call
pedwarn_c99 instead of pedwarn.
(grokfield): Likewise.
(warn_defaults_to): New function.
(grokdeclarator): Call warn_defaults_to instead of pedwarn_c99.
Unconditionally call pedwarn_c99 instead of pedwarn.
(start_function): Call warn_defaults_to instead of pedwarn_c99.
(declspecs_add_scspec): Call pedwarn_c99 instead of pedwarn, don't
check flag_isoc11 before.
* c-errors.c (pedwarn_c99): Change the return type to bool.
Handle -Wc99-c11-compat.
* c-parser.c (disable_extension_diagnostics): Handle
warn_c99_c11_compat.
(restore_extension_diagnostics): Likewise.
(c_parser_static_assert_declaration_no_semi): Call pedwarn_c99
instead of pedwarn, don't check flag_isoc11 before.
(c_parser_declspecs): Likewise.
(c_parser_alignas_specifier): Likewise.
(c_parser_alignof_expression): Likewise.
(c_parser_generic_selection): Likewise.
* c-tree.h (pedwarn_c99): Update declaration.
* c-typeck.c (c_finish_return): Call pedwarn or warning_at instead
of pedwarn_c99.
2014-08-19 Marek Polacek <polacek@redhat.com> 2014-08-19 Marek Polacek <polacek@redhat.com>
* c-decl.c (warn_variable_length_array): Pass OPT_Wvla unconditionally * c-decl.c (warn_variable_length_array): Pass OPT_Wvla unconditionally

View File

@ -538,6 +538,8 @@ static tree grokdeclarator (const struct c_declarator *,
bool *, enum deprecated_states); bool *, enum deprecated_states);
static tree grokparms (struct c_arg_info *, bool); static tree grokparms (struct c_arg_info *, bool);
static void layout_array_type (tree); static void layout_array_type (tree);
static void warn_defaults_to (location_t, int, const char *, ...)
ATTRIBUTE_GCC_DIAG(3,4);
/* T is a statement. Add it to the statement-tree. This is the /* T is a statement. Add it to the statement-tree. This is the
C/ObjC version--C++ has a slightly different version of this C/ObjC version--C++ has a slightly different version of this
@ -1844,12 +1846,9 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
newdecl); newdecl);
locate_old_decl (olddecl); locate_old_decl (olddecl);
} }
else if (pedantic && !flag_isoc11) else if (pedwarn_c99 (input_location, OPT_Wpedantic,
{ "redefinition of typedef %q+D", newdecl))
pedwarn (input_location, OPT_Wpedantic, locate_old_decl (olddecl);
"redefinition of typedef %q+D", newdecl);
locate_old_decl (olddecl);
}
return true; return true;
} }
@ -4941,6 +4940,22 @@ 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;
va_start (ap, gmsgid);
diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
flag_isoc99 ? DK_PEDWARN : DK_WARNING);
diagnostic.option_index = opt;
report_diagnostic (&diagnostic);
va_end (ap);
}
/* Given declspecs and a declarator, /* Given declspecs and a declarator,
determine the name and type of the object declared determine the name and type of the object declared
and construct a ..._DECL node for it. and construct a ..._DECL node for it.
@ -5117,12 +5132,12 @@ grokdeclarator (const struct c_declarator *declarator,
else else
{ {
if (name) if (name)
pedwarn_c99 (loc, flag_isoc99 ? 0 : OPT_Wimplicit_int, warn_defaults_to (loc, flag_isoc99 ? 0 : OPT_Wimplicit_int,
"type defaults to %<int%> in declaration of %qE", "type defaults to %<int%> in declaration "
name); "of %qE", name);
else else
pedwarn_c99 (input_location, flag_isoc99 ? 0 : OPT_Wimplicit_int, warn_defaults_to (loc, flag_isoc99 ? 0 : OPT_Wimplicit_int,
"type defaults to %<int%> in type name"); "type defaults to %<int%> in type name");
} }
} }
@ -6249,15 +6264,12 @@ grokdeclarator (const struct c_declarator *declarator,
DECL_DECLARED_INLINE_P (decl) = 1; DECL_DECLARED_INLINE_P (decl) = 1;
if (declspecs->noreturn_p) if (declspecs->noreturn_p)
{ {
if (!flag_isoc11) if (flag_isoc99)
{ pedwarn_c99 (loc, OPT_Wpedantic,
if (flag_isoc99)
pedwarn (loc, OPT_Wpedantic,
"ISO C99 does not support %<_Noreturn%>"); "ISO C99 does not support %<_Noreturn%>");
else else
pedwarn (loc, OPT_Wpedantic, pedwarn_c99 (loc, OPT_Wpedantic,
"ISO C90 does not support %<_Noreturn%>"); "ISO C90 does not support %<_Noreturn%>");
}
TREE_THIS_VOLATILE (decl) = 1; TREE_THIS_VOLATILE (decl) = 1;
} }
} }
@ -6964,15 +6976,12 @@ grokfield (location_t loc,
pedwarn (loc, 0, "declaration does not declare anything"); pedwarn (loc, 0, "declaration does not declare anything");
return NULL_TREE; return NULL_TREE;
} }
if (!flag_isoc11) if (flag_isoc99)
{ pedwarn_c99 (loc, OPT_Wpedantic,
if (flag_isoc99)
pedwarn (loc, OPT_Wpedantic,
"ISO C99 doesn%'t support unnamed structs/unions"); "ISO C99 doesn%'t support unnamed structs/unions");
else else
pedwarn (loc, OPT_Wpedantic, pedwarn_c99 (loc, OPT_Wpedantic,
"ISO C90 doesn%'t support unnamed structs/unions"); "ISO C90 doesn%'t support unnamed structs/unions");
}
} }
value = grokdeclarator (declarator, declspecs, FIELD, false, value = grokdeclarator (declarator, declspecs, FIELD, false,
@ -7913,9 +7922,10 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
} }
if (warn_about_return_type) if (warn_about_return_type)
pedwarn_c99 (loc, flag_isoc99 ? 0 warn_defaults_to (loc, flag_isoc99 ? 0
: (warn_return_type ? OPT_Wreturn_type : OPT_Wimplicit_int), : (warn_return_type ? OPT_Wreturn_type
"return type defaults to %<int%>"); : OPT_Wimplicit_int),
"return type defaults to %<int%>");
/* Make the init_value nonzero so pushdecl knows this is not tentative. /* Make the init_value nonzero so pushdecl knows this is not tentative.
error_mark_node is replaced below (in pop_scope) with the BLOCK. */ error_mark_node is replaced below (in pop_scope) with the BLOCK. */
@ -9893,14 +9903,14 @@ declspecs_add_scspec (source_location loc,
identifier in the implementation namespace; only diagnose identifier in the implementation namespace; only diagnose
it for the C11 spelling because of existing code using it for the C11 spelling because of existing code using
the other spelling. */ the other spelling. */
if (!flag_isoc11 && !specs->thread_gnu_p) if (!specs->thread_gnu_p)
{ {
if (flag_isoc99) if (flag_isoc99)
pedwarn (loc, OPT_Wpedantic, pedwarn_c99 (loc, OPT_Wpedantic,
"ISO C99 does not support %qE", scspec); "ISO C99 does not support %qE", scspec);
else else
pedwarn (loc, OPT_Wpedantic, pedwarn_c99 (loc, OPT_Wpedantic,
"ISO C90 does not support %qE", scspec); "ISO C90 does not support %qE", scspec);
} }
specs->locations[cdw_thread] = loc; specs->locations[cdw_thread] = loc;
} }

View File

@ -29,20 +29,42 @@ along with GCC; see the file COPYING3. If not see
#include "diagnostic.h" #include "diagnostic.h"
#include "opts.h" #include "opts.h"
/* Issue an ISO C99 pedantic warning MSGID. */ /* Issue an ISO C99 pedantic warning MSGID if -pedantic outside C11 mode,
otherwise issue warning MSGID if -Wc99-c11-compat is specified.
This function is supposed to be used for matters that are allowed in
ISO C11 but not supported in ISO C99, thus we explicitly don't pedwarn
when C11 is specified. */
void bool
pedwarn_c99 (location_t location, int opt, const char *gmsgid, ...) pedwarn_c99 (location_t location, int opt, const char *gmsgid, ...)
{ {
diagnostic_info diagnostic; diagnostic_info diagnostic;
va_list ap; va_list ap;
bool warned = false;
va_start (ap, gmsgid); va_start (ap, gmsgid);
diagnostic_set_info (&diagnostic, gmsgid, &ap, location, /* If desired, issue the C99/C11 compat warning, which is more specific
flag_isoc99 ? DK_PEDWARN : DK_WARNING); than -pedantic. */
diagnostic.option_index = opt; if (warn_c99_c11_compat > 0)
report_diagnostic (&diagnostic); {
diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
(pedantic && !flag_isoc11)
? DK_PEDWARN : DK_WARNING);
diagnostic.option_index = OPT_Wc99_c11_compat;
warned = report_diagnostic (&diagnostic);
}
/* -Wno-c99-c11-compat suppresses even the pedwarns. */
else if (warn_c99_c11_compat == 0)
;
/* For -pedantic outside C11, issue a pedwarn. */
else if (pedantic && !flag_isoc11)
{
diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_PEDWARN);
diagnostic.option_index = opt;
warned = report_diagnostic (&diagnostic);
}
va_end (ap); va_end (ap);
return warned;
} }
/* Issue an ISO C90 pedantic warning MSGID if -pedantic outside C99 mode, /* Issue an ISO C90 pedantic warning MSGID if -pedantic outside C99 mode,

View File

@ -1076,7 +1076,11 @@ disable_extension_diagnostics (void)
/* warn_c90_c99_compat has three states: -1/0/1, so we must /* warn_c90_c99_compat has three states: -1/0/1, so we must
play tricks to properly restore it. */ play tricks to properly restore it. */
| ((warn_c90_c99_compat == 1) << 7) | ((warn_c90_c99_compat == 1) << 7)
| ((warn_c90_c99_compat == -1) << 8)); | ((warn_c90_c99_compat == -1) << 8)
/* Similarly for warn_c99_c11_compat. */
| ((warn_c99_c11_compat == 1) << 9)
| ((warn_c99_c11_compat == -1) << 10)
);
cpp_opts->cpp_pedantic = pedantic = 0; cpp_opts->cpp_pedantic = pedantic = 0;
warn_pointer_arith = 0; warn_pointer_arith = 0;
cpp_opts->cpp_warn_traditional = warn_traditional = 0; cpp_opts->cpp_warn_traditional = warn_traditional = 0;
@ -1085,6 +1089,7 @@ disable_extension_diagnostics (void)
warn_cxx_compat = 0; warn_cxx_compat = 0;
warn_overlength_strings = 0; warn_overlength_strings = 0;
warn_c90_c99_compat = 0; warn_c90_c99_compat = 0;
warn_c99_c11_compat = 0;
return ret; return ret;
} }
@ -1103,6 +1108,7 @@ restore_extension_diagnostics (int flags)
warn_overlength_strings = (flags >> 6) & 1; warn_overlength_strings = (flags >> 6) & 1;
/* See above for why is this needed. */ /* See above for why is this needed. */
warn_c90_c99_compat = (flags >> 7) & 1 ? 1 : ((flags >> 8) & 1 ? -1 : 0); warn_c90_c99_compat = (flags >> 7) & 1 ? 1 : ((flags >> 8) & 1 ? -1 : 0);
warn_c99_c11_compat = (flags >> 9) & 1 ? 1 : ((flags >> 10) & 1 ? -1 : 0);
} }
/* Possibly kinds of declarator to parse. */ /* Possibly kinds of declarator to parse. */
@ -2009,15 +2015,12 @@ c_parser_static_assert_declaration_no_semi (c_parser *parser)
gcc_assert (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT)); gcc_assert (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT));
assert_loc = c_parser_peek_token (parser)->location; assert_loc = c_parser_peek_token (parser)->location;
if (!flag_isoc11) if (flag_isoc99)
{ pedwarn_c99 (assert_loc, OPT_Wpedantic,
if (flag_isoc99)
pedwarn (assert_loc, OPT_Wpedantic,
"ISO C99 does not support %<_Static_assert%>"); "ISO C99 does not support %<_Static_assert%>");
else else
pedwarn (assert_loc, OPT_Wpedantic, pedwarn_c99 (assert_loc, OPT_Wpedantic,
"ISO C90 does not support %<_Static_assert%>"); "ISO C90 does not support %<_Static_assert%>");
}
c_parser_consume_token (parser); c_parser_consume_token (parser);
if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
return; return;
@ -2382,15 +2385,12 @@ c_parser_declspecs (c_parser *parser, struct c_declspecs *specs,
correct lvalue-to-rvalue conversions. */ correct lvalue-to-rvalue conversions. */
if (flag_openmp) if (flag_openmp)
sorry ("%<_Atomic%> with OpenMP"); sorry ("%<_Atomic%> with OpenMP");
if (!flag_isoc11) if (flag_isoc99)
{ pedwarn_c99 (loc, OPT_Wpedantic,
if (flag_isoc99)
pedwarn (loc, OPT_Wpedantic,
"ISO C99 does not support the %<_Atomic%> qualifier"); "ISO C99 does not support the %<_Atomic%> qualifier");
else else
pedwarn (loc, OPT_Wpedantic, pedwarn_c99 (loc, OPT_Wpedantic,
"ISO C90 does not support the %<_Atomic%> qualifier"); "ISO C90 does not support the %<_Atomic%> qualifier");
}
attrs_ok = true; attrs_ok = true;
tree value; tree value;
value = c_parser_peek_token (parser)->value; value = c_parser_peek_token (parser)->value;
@ -3055,15 +3055,12 @@ c_parser_alignas_specifier (c_parser * parser)
location_t loc = c_parser_peek_token (parser)->location; location_t loc = c_parser_peek_token (parser)->location;
gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNAS)); gcc_assert (c_parser_next_token_is_keyword (parser, RID_ALIGNAS));
c_parser_consume_token (parser); c_parser_consume_token (parser);
if (!flag_isoc11) if (flag_isoc99)
{ pedwarn_c99 (loc, OPT_Wpedantic,
if (flag_isoc99)
pedwarn (loc, OPT_Wpedantic,
"ISO C99 does not support %<_Alignas%>"); "ISO C99 does not support %<_Alignas%>");
else else
pedwarn (loc, OPT_Wpedantic, pedwarn_c99 (loc, OPT_Wpedantic,
"ISO C90 does not support %<_Alignas%>"); "ISO C90 does not support %<_Alignas%>");
}
if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
return ret; return ret;
if (c_parser_next_tokens_start_typename (parser, cla_prefer_id)) if (c_parser_next_tokens_start_typename (parser, cla_prefer_id))
@ -6579,14 +6576,14 @@ c_parser_alignof_expression (c_parser *parser)
/* A diagnostic is not required for the use of this identifier in /* A diagnostic is not required for the use of this identifier in
the implementation namespace; only diagnose it for the C11 the implementation namespace; only diagnose it for the C11
spelling because of existing code using the other spellings. */ spelling because of existing code using the other spellings. */
if (!flag_isoc11 && is_c11_alignof) if (is_c11_alignof)
{ {
if (flag_isoc99) if (flag_isoc99)
pedwarn (loc, OPT_Wpedantic, "ISO C99 does not support %qE", pedwarn_c99 (loc, OPT_Wpedantic, "ISO C99 does not support %qE",
alignof_spelling); alignof_spelling);
else else
pedwarn (loc, OPT_Wpedantic, "ISO C90 does not support %qE", pedwarn_c99 (loc, OPT_Wpedantic, "ISO C90 does not support %qE",
alignof_spelling); alignof_spelling);
} }
c_parser_consume_token (parser); c_parser_consume_token (parser);
c_inhibit_evaluation_warnings++; c_inhibit_evaluation_warnings++;
@ -6745,15 +6742,12 @@ c_parser_generic_selection (c_parser *parser)
gcc_assert (c_parser_next_token_is_keyword (parser, RID_GENERIC)); gcc_assert (c_parser_next_token_is_keyword (parser, RID_GENERIC));
generic_loc = c_parser_peek_token (parser)->location; generic_loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser); c_parser_consume_token (parser);
if (!flag_isoc11) if (flag_isoc99)
{ pedwarn_c99 (generic_loc, OPT_Wpedantic,
if (flag_isoc99)
pedwarn (generic_loc, OPT_Wpedantic,
"ISO C99 does not support %<_Generic%>"); "ISO C99 does not support %<_Generic%>");
else else
pedwarn (generic_loc, OPT_Wpedantic, pedwarn_c99 (generic_loc, OPT_Wpedantic,
"ISO C90 does not support %<_Generic%>"); "ISO C90 does not support %<_Generic%>");
}
if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
return error_expr; return error_expr;

View File

@ -678,7 +678,7 @@ extern tree c_check_omp_declare_reduction_r (tree *, int *, void *);
/* In c-errors.c */ /* In c-errors.c */
extern void pedwarn_c90 (location_t, int opt, const char *, ...) extern void pedwarn_c90 (location_t, int opt, const char *, ...)
ATTRIBUTE_GCC_DIAG(3,4); ATTRIBUTE_GCC_DIAG(3,4);
extern void pedwarn_c99 (location_t, int opt, const char *, ...) extern bool pedwarn_c99 (location_t, int opt, const char *, ...)
ATTRIBUTE_GCC_DIAG(3,4); ATTRIBUTE_GCC_DIAG(3,4);
#endif /* ! GCC_C_TREE_H */ #endif /* ! GCC_C_TREE_H */

View File

@ -9220,9 +9220,12 @@ c_finish_return (location_t loc, tree retval, tree origtype)
if ((warn_return_type || flag_isoc99) if ((warn_return_type || flag_isoc99)
&& valtype != 0 && TREE_CODE (valtype) != VOID_TYPE) && valtype != 0 && TREE_CODE (valtype) != VOID_TYPE)
{ {
pedwarn_c99 (loc, flag_isoc99 ? 0 : OPT_Wreturn_type, if (flag_isoc99)
"%<return%> with no value, in " pedwarn (loc, 0, "%<return%> with no value, in "
"function returning non-void"); "function returning non-void");
else
warning_at (loc, OPT_Wreturn_type, "%<return%> with no value, "
"in function returning non-void");
no_warning = true; no_warning = true;
} }
} }

View File

@ -241,7 +241,7 @@ Objective-C and Objective-C++ Dialects}.
-w -Wextra -Wall -Waddress -Waggregate-return @gol -w -Wextra -Wall -Waddress -Waggregate-return @gol
-Waggressive-loop-optimizations -Warray-bounds @gol -Waggressive-loop-optimizations -Warray-bounds @gol
-Wno-attributes -Wno-builtin-macro-redefined @gol -Wno-attributes -Wno-builtin-macro-redefined @gol
-Wc90-c99-compat @gol -Wc90-c99-compat -Wc99-c11-compat @gol
-Wc++-compat -Wc++11-compat -Wcast-align -Wcast-qual @gol -Wc++-compat -Wc++11-compat -Wcast-align -Wcast-qual @gol
-Wchar-subscripts -Wclobbered -Wcomment -Wconditionally-supported @gol -Wchar-subscripts -Wclobbered -Wcomment -Wconditionally-supported @gol
-Wconversion -Wcoverage-mismatch -Wdate-time -Wdelete-incomplete -Wno-cpp @gol -Wconversion -Wcoverage-mismatch -Wdate-time -Wdelete-incomplete -Wno-cpp @gol
@ -4527,6 +4527,16 @@ type, @code{bool} type, compound literals, designated initializers, and so
on. This option is independent of the standards mode. Warnings are disabled on. This option is independent of the standards mode. Warnings are disabled
in the expression that follows @code{__extension__}. in the expression that follows @code{__extension__}.
@item -Wc99-c11-compat @r{(C and Objective-C only)}
@opindex Wc99-c11-compat
@opindex Wno-c99-c11-compat
Warn about features not present in ISO C99, but present in ISO C11.
For instance, warn about use of anonymous structures and unions,
@code{_Atomic} type qualifier, @code{_Thread_local} storage-class specifier,
@code{_Alignas} specifier, @code{Alignof} operator, @code{_Generic} keyword,
and so on. This option is independent of the standards mode. Warnings are
disabled in the expression that follows @code{__extension__}.
@item -Wc++-compat @r{(C and Objective-C only)} @item -Wc++-compat @r{(C and Objective-C only)}
Warn about ISO C constructs that are outside of the common subset of Warn about ISO C constructs that are outside of the common subset of
ISO C and ISO C++, e.g.@: request for implicit conversion from ISO C and ISO C++, e.g.@: request for implicit conversion from

View File

@ -1,3 +1,13 @@
2014-08-19 Marek Polacek <polacek@redhat.com>
* gcc.dg/Wc99-c11-compat-1.c: New test.
* gcc.dg/Wc99-c11-compat-2.c: New test.
* gcc.dg/Wc99-c11-compat-3.c: New test.
* gcc.dg/Wc99-c11-compat-4.c: New test.
* gcc.dg/Wc99-c11-compat-5.c: New test.
* gcc.dg/Wc99-c11-compat-6.c: New test.
* gcc.dg/Wc99-c11-compat-7.c: New test.
2014-08-19 Marek Polacek <polacek@redhat.com> 2014-08-19 Marek Polacek <polacek@redhat.com>
* gcc.dg/Wc90-c99-compat-4.c: Remove all dg-warnings. * gcc.dg/Wc90-c99-compat-4.c: Remove all dg-warnings.

View File

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-std=gnu90 -pedantic -Wc99-c11-compat" } */
struct S { int i; struct { int a; }; }; /* { dg-warning "ISO C90 doesn.t support unnamed structs/unions" } */
_Noreturn void foo (void); /* { dg-warning "ISO C90 does not support ._Noreturn." } */
typedef int A;
typedef int A; /* { dg-warning "redefinition of typedef .A." } */
_Thread_local int i; /* { dg-warning "ISO C90 does not support ._Thread_local." } */
_Static_assert (1, "foo"); /* { dg-warning "ISO C90 does not support ._Static_assert." } */
_Atomic int a; /* { dg-warning "ISO C90 does not support the ._Atomic. qualifier" } */
_Alignas (int) int aa; /* { dg-warning "ISO C90 does not support ._Alignas." } */
enum e { E = _Alignof (double) }; /* { dg-warning "ISO C90 does not support ._Alignof." } */
void
fn (int n)
{
_Generic (n, int: 0); /* { dg-warning "ISO C90 does not support ._Generic." } */
}

View File

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-std=gnu99 -pedantic -Wc99-c11-compat" } */
struct S { int i; struct { int a; }; }; /* { dg-warning "ISO C99 doesn.t support unnamed structs/unions" } */
_Noreturn void foo (void); /* { dg-warning "ISO C99 does not support ._Noreturn." } */
typedef int A;
typedef int A; /* { dg-warning "redefinition of typedef .A." } */
_Thread_local int i; /* { dg-warning "ISO C99 does not support ._Thread_local." } */
_Static_assert (1, "foo"); /* { dg-warning "ISO C99 does not support ._Static_assert." } */
_Atomic int a; /* { dg-warning "ISO C99 does not support the ._Atomic. qualifier" } */
_Alignas (int) int aa; /* { dg-warning "ISO C99 does not support ._Alignas." } */
enum e { E = _Alignof (double) }; /* { dg-warning "ISO C99 does not support ._Alignof." } */
void
fn (int n)
{
_Generic (n, int: 0); /* { dg-warning "ISO C99 does not support ._Generic." } */
}

View File

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-std=gnu11 -pedantic-errors -Wc99-c11-compat" } */
struct S { int i; struct { int a; }; }; /* { dg-warning "ISO C99 doesn.t support unnamed structs/unions" } */
_Noreturn void foo (void); /* { dg-warning "ISO C99 does not support ._Noreturn." } */
typedef int A;
typedef int A; /* { dg-warning "redefinition of typedef .A." } */
_Thread_local int i; /* { dg-warning "ISO C99 does not support ._Thread_local." } */
_Static_assert (1, "foo"); /* { dg-warning "ISO C99 does not support ._Static_assert." } */
_Atomic int a; /* { dg-warning "ISO C99 does not support the ._Atomic. qualifier" } */
_Alignas (int) int aa; /* { dg-warning "ISO C99 does not support ._Alignas." } */
enum e { E = _Alignof (double) }; /* { dg-warning "ISO C99 does not support ._Alignof." } */
void
fn (int n)
{
_Generic (n, int: 0); /* { dg-warning "ISO C99 does not support ._Generic." } */
}

View File

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-std=gnu99 -pedantic-errors -Wno-c99-c11-compat" } */
struct S { int i; struct { int a; }; };
_Noreturn void foo (void);
typedef int A;
typedef int A;
_Thread_local int i;
_Static_assert (1, "foo");
_Atomic int a;
_Alignas (int) int aa;
enum e { E = _Alignof (double) };
void
fn (int n)
{
_Generic (n, int: 0);
}

View File

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-std=gnu11 -Wc99-c11-compat" } */
__extension__ struct S { int i; struct { int a; }; };
__extension__ _Noreturn void foo (void);
typedef int A;
__extension__ typedef int A;
__extension__ _Thread_local int i;
__extension__ _Static_assert (1, "foo");
__extension__ _Atomic int a;
__extension__ _Alignas (int) int aa;
enum e { E = __extension__ _Alignof (double) };
void
fn (int n)
{
__extension__ _Generic (n, int: 0);
}

View File

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-std=gnu90 -pedantic-errors -Wc99-c11-compat" } */
struct S { int i; struct { int a; }; }; /* { dg-error "ISO C90 doesn.t support unnamed structs/unions" } */
_Noreturn void foo (void); /* { dg-error "ISO C90 does not support ._Noreturn." } */
typedef int A;
typedef int A; /* { dg-error "redefinition of typedef .A." } */
_Thread_local int i; /* { dg-error "ISO C90 does not support ._Thread_local." } */
_Static_assert (1, "foo"); /* { dg-error "ISO C90 does not support ._Static_assert." } */
_Atomic int a; /* { dg-error "ISO C90 does not support the ._Atomic. qualifier" } */
_Alignas (int) int aa; /* { dg-error "ISO C90 does not support ._Alignas." } */
enum e { E = _Alignof (double) }; /* { dg-error "ISO C90 does not support ._Alignof." } */
void
fn (int n)
{
_Generic (n, int: 0); /* { dg-error "ISO C90 does not support ._Generic." } */
}

View File

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-std=gnu99 -pedantic-errors -Wc99-c11-compat" } */
struct S { int i; struct { int a; }; }; /* { dg-error "ISO C99 doesn.t support unnamed structs/unions" } */
_Noreturn void foo (void); /* { dg-error "ISO C99 does not support ._Noreturn." } */
typedef int A;
typedef int A; /* { dg-error "redefinition of typedef .A." } */
_Thread_local int i; /* { dg-error "ISO C99 does not support ._Thread_local." } */
_Static_assert (1, "foo"); /* { dg-error "ISO C99 does not support ._Static_assert." } */
_Atomic int a; /* { dg-error "ISO C99 does not support the ._Atomic. qualifier" } */
_Alignas (int) int aa; /* { dg-error "ISO C99 does not support ._Alignas." } */
enum e { E = _Alignof (double) }; /* { dg-error "ISO C99 does not support ._Alignof." } */
void
fn (int n)
{
_Generic (n, int: 0); /* { dg-error "ISO C99 does not support ._Generic." } */
}