aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2018-10-18 00:58:54 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2018-10-18 00:58:54 +0100
commit9f936c861383dc69e0053e34315d5d0262a19e8f (patch)
treef23e8dc38949667312676b0c8bf7e5b1dfaacb6e /gcc/c
parent7a8a92c448bf7d9ceeef1879f741901cf337d921 (diff)
downloadgcc-9f936c861383dc69e0053e34315d5d0262a19e8f.zip
gcc-9f936c861383dc69e0053e34315d5d0262a19e8f.tar.gz
gcc-9f936c861383dc69e0053e34315d5d0262a19e8f.tar.bz2
Add -std=c2x, -std=gnu2x, -Wc11-c2x-compat, C2X _Static_assert support.
Now new features are starting to be added to a C2X draft (in the C2x branch of the C standard git repository, no public WG14 document yet), it's time to add -std=c2x and associated options to GCC for use in enabling C2X features. This patch adds the expected set of options: -std=c2x, -std=gnu2x, -Wc11-c2x-compat. A first C2X feature is added (the only one so far in the repository that's obviously relevant to GCC): support (as in C++) for the string constant to be omitted in _Static_assert. This feature is duly also supported as an extension in earlier standard modes (diagnosed with -pedantic, unless -Wno-c11-c2x-compat is given, or with -Wc11-c2x-compat even in C2X mode). Bootstrapped with no regressions on x86_64-pc-linux-gnu. gcc/ * doc/cpp.texi (__STDC_VERSION__): Document C2X handling. * doc/invoke.texi (-std=c2x, -std=gnu2x): Document new options. * doc/standards.texi (C Language): Document C2X. * dwarf2out.c (highest_c_language), config/rl78/rl78.c (rl78_option_override): Handle "GNU C2X" language name. gcc/c/ * c-errors.c (pedwarn_c11): New function. * c-parser.c (disable_extension_diagnostics): Save warn_c11_c2x_compat and set it to 0. (restore_extension_diagnostics): Restore warn_c11_c2x_compat. (c_parser_static_assert_declaration_no_semi): Handle _Static_assert without string constant. * c-tree.h (pedwarn_c11): New prototype. gcc/c-family/ * c-common.c (flag_isoc2x): New variable. * c-common.h (clk_c): Update comment to reference C2X. (flag_isoc99, flag_isoc11): Update comments to reference future standard versions in general. (flag_isoc2x): Declare. * c-opts.c (set_std_c2x): New function. (c_common_handle_option): Handle -std=c2x and -std=gnu2x. (set_std_c89, set_std_c99, set_std_c11, set_std_c17): Set flag_isoc2x to 0. * c.opt (Wc11-c2x-compat, std=c2x, std=gnu2x): New options. gcc/testsuite/ * gcc.dg/c11-static-assert-7.c, gcc.dg/c11-static-assert-8.c, gcc.dg/c11-static-assert-9.c, gcc.dg/c2x-static-assert-1.c, gcc.dg/c2x-static-assert-2.c, gcc.dg/c99-static-assert-2.c, gcc.dg/gnu2x-static-assert-1.c: New tests. * gcc.dg/missing-symbol-3.c: Update expected fix-it text. libcpp/ * include/cpplib.h (enum c_lang): Add CLK_GNUC2X and CLK_STDC2X. * init.c (lang_defaults): Add GNUC2X and STDC2X entries. (cpp_init_builtins): Define __STDC_VERSION__ to 202000L for C2X. From-SVN: r265251
Diffstat (limited to 'gcc/c')
-rw-r--r--gcc/c/ChangeLog10
-rw-r--r--gcc/c/c-errors.c39
-rw-r--r--gcc/c/c-parser.c60
-rw-r--r--gcc/c/c-tree.h2
4 files changed, 91 insertions, 20 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 4807a32..2c07f2f 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,13 @@
+2018-10-17 Joseph Myers <joseph@codesourcery.com>
+
+ * c-errors.c (pedwarn_c11): New function.
+ * c-parser.c (disable_extension_diagnostics): Save
+ warn_c11_c2x_compat and set it to 0.
+ (restore_extension_diagnostics): Restore warn_c11_c2x_compat.
+ (c_parser_static_assert_declaration_no_semi): Handle
+ _Static_assert without string constant.
+ * c-tree.h (pedwarn_c11): New prototype.
+
2018-10-17 David Malcolm <dmalcolm@redhat.com>
* Make-lang.in (selftest-c): New.
diff --git a/gcc/c/c-errors.c b/gcc/c/c-errors.c
index 2d50710..4ff2080 100644
--- a/gcc/c/c-errors.c
+++ b/gcc/c/c-errors.c
@@ -25,6 +25,45 @@ along with GCC; see the file COPYING3. If not see
#include "c-tree.h"
#include "opts.h"
+/* Issue an ISO C11 pedantic warning MSGID if -pedantic outside C2X mode,
+ otherwise issue warning MSGID if -Wc11-c2X-compat is specified.
+ This function is supposed to be used for matters that are allowed in
+ ISO C2X but not supported in ISO C11, thus we explicitly don't pedwarn
+ when C2X is specified. */
+
+bool
+pedwarn_c11 (location_t location, int opt, const char *gmsgid, ...)
+{
+ diagnostic_info diagnostic;
+ va_list ap;
+ bool warned = false;
+ rich_location richloc (line_table, location);
+
+ va_start (ap, gmsgid);
+ /* If desired, issue the C11/C2X compat warning, which is more specific
+ than -pedantic. */
+ if (warn_c11_c2x_compat > 0)
+ {
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc,
+ (pedantic && !flag_isoc2x)
+ ? DK_PEDWARN : DK_WARNING);
+ diagnostic.option_index = OPT_Wc11_c2x_compat;
+ warned = diagnostic_report_diagnostic (global_dc, &diagnostic);
+ }
+ /* -Wno-c11-c2x-compat suppresses even the pedwarns. */
+ else if (warn_c11_c2x_compat == 0)
+ ;
+ /* For -pedantic outside C2X, issue a pedwarn. */
+ else if (pedantic && !flag_isoc2x)
+ {
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_PEDWARN);
+ diagnostic.option_index = opt;
+ warned = diagnostic_report_diagnostic (global_dc, &diagnostic);
+ }
+ va_end (ap);
+ return warned;
+}
+
/* 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
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index 1f173fc..ee66ce8 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -1327,6 +1327,9 @@ disable_extension_diagnostics (void)
/* Similarly for warn_c99_c11_compat. */
| ((warn_c99_c11_compat == 1) << 9)
| ((warn_c99_c11_compat == -1) << 10)
+ /* Similarly for warn_c11_c2x_compat. */
+ | ((warn_c11_c2x_compat == 1) << 11)
+ | ((warn_c11_c2x_compat == -1) << 12)
);
cpp_opts->cpp_pedantic = pedantic = 0;
warn_pointer_arith = 0;
@@ -1337,6 +1340,7 @@ disable_extension_diagnostics (void)
warn_overlength_strings = 0;
warn_c90_c99_compat = 0;
warn_c99_c11_compat = 0;
+ warn_c11_c2x_compat = 0;
return ret;
}
@@ -1356,6 +1360,7 @@ restore_extension_diagnostics (int flags)
/* See above for why is this needed. */
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);
+ warn_c11_c2x_compat = (flags >> 11) & 1 ? 1 : ((flags >> 12) & 1 ? -1 : 0);
}
/* Helper data structure for parsing #pragma acc routine. */
@@ -2404,6 +2409,10 @@ c_parser_static_assert_declaration (c_parser *parser)
static_assert-declaration-no-semi:
_Static_assert ( constant-expression , string-literal )
+
+ C2X:
+ static_assert-declaration-no-semi:
+ _Static_assert ( constant-expression )
*/
static void
@@ -2411,7 +2420,7 @@ c_parser_static_assert_declaration_no_semi (c_parser *parser)
{
location_t assert_loc, value_loc;
tree value;
- tree string;
+ tree string = NULL_TREE;
gcc_assert (c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT));
assert_loc = c_parser_peek_token (parser)->location;
@@ -2429,27 +2438,33 @@ c_parser_static_assert_declaration_no_semi (c_parser *parser)
value = c_parser_expr_no_commas (parser, NULL).value;
value_loc = EXPR_LOC_OR_LOC (value, value_tok_loc);
parser->lex_untranslated_string = true;
- if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
- {
- parser->lex_untranslated_string = false;
- return;
- }
- switch (c_parser_peek_token (parser)->type)
+ if (c_parser_next_token_is (parser, CPP_COMMA))
{
- case CPP_STRING:
- case CPP_STRING16:
- case CPP_STRING32:
- case CPP_WSTRING:
- case CPP_UTF8STRING:
- string = c_parser_peek_token (parser)->value;
c_parser_consume_token (parser);
- parser->lex_untranslated_string = false;
- break;
- default:
- c_parser_error (parser, "expected string literal");
- parser->lex_untranslated_string = false;
- return;
+ switch (c_parser_peek_token (parser)->type)
+ {
+ case CPP_STRING:
+ case CPP_STRING16:
+ case CPP_STRING32:
+ case CPP_WSTRING:
+ case CPP_UTF8STRING:
+ string = c_parser_peek_token (parser)->value;
+ c_parser_consume_token (parser);
+ parser->lex_untranslated_string = false;
+ break;
+ default:
+ c_parser_error (parser, "expected string literal");
+ parser->lex_untranslated_string = false;
+ return;
+ }
}
+ else if (flag_isoc11)
+ /* If pedantic for pre-C11, the use of _Static_assert itself will
+ have been diagnosed, so do not also diagnose the use of this
+ new C2X feature of _Static_assert. */
+ pedwarn_c11 (assert_loc, OPT_Wpedantic,
+ "ISO C11 does not support omitting the string in "
+ "%<_Static_assert%>");
parens.require_close (parser);
if (!INTEGRAL_TYPE_P (TREE_TYPE (value)))
@@ -2473,7 +2488,12 @@ c_parser_static_assert_declaration_no_semi (c_parser *parser)
}
constant_expression_warning (value);
if (integer_zerop (value))
- error_at (assert_loc, "static assertion failed: %E", string);
+ {
+ if (string)
+ error_at (assert_loc, "static assertion failed: %E", string);
+ else
+ error_at (assert_loc, "static assertion failed");
+ }
}
/* Parse some declaration specifiers (possibly none) (C90 6.5, C99
diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h
index 017c01c..be63fee 100644
--- a/gcc/c/c-tree.h
+++ b/gcc/c/c-tree.h
@@ -762,6 +762,8 @@ extern bool pedwarn_c90 (location_t, int opt, const char *, ...)
ATTRIBUTE_GCC_DIAG(3,4);
extern bool pedwarn_c99 (location_t, int opt, const char *, ...)
ATTRIBUTE_GCC_DIAG(3,4);
+extern bool pedwarn_c11 (location_t, int opt, const char *, ...)
+ ATTRIBUTE_GCC_DIAG(3,4);
extern void
set_c_expr_source_range (c_expr *expr,