Add -std=c2x, -std=gnu2x, -Wc11-c2x-compat, C2X _Static_assert support.
authorJoseph Myers <joseph@codesourcery.com>
Wed, 17 Oct 2018 23:58:54 +0000 (00:58 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Wed, 17 Oct 2018 23:58:54 +0000 (00:58 +0100)
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

27 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c-family/c-common.h
gcc/c-family/c-opts.c
gcc/c-family/c.opt
gcc/c/ChangeLog
gcc/c/c-errors.c
gcc/c/c-parser.c
gcc/c/c-tree.h
gcc/config/rl78/rl78.c
gcc/doc/cpp.texi
gcc/doc/invoke.texi
gcc/doc/standards.texi
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c11-static-assert-7.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c11-static-assert-8.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c11-static-assert-9.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c2x-static-assert-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c2x-static-assert-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c99-static-assert-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gnu2x-static-assert-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/missing-symbol-3.c
libcpp/ChangeLog
libcpp/include/cpplib.h
libcpp/init.c

index 85bfe7f07b01e70dd40e7d6957786c3be4ad228b..f4e147c26ee2b53f72d19449da2e511a0b2535f2 100644 (file)
@@ -1,3 +1,11 @@
+2018-10-17  Joseph Myers  <joseph@codesourcery.com>
+
+       * 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.
+
 2018-10-17  Joseph Myers  <joseph@codesourcery.com>
 
        * doc/invoke.texi (-std=c17), doc/standards.texi (C Language):
index 2e01482832f23d25e93e77be79ba332ad84f9a97..5b334f37360f6920fac980fdf70f853b862c0646 100644 (file)
@@ -1,3 +1,16 @@
+2018-10-17  Joseph Myers  <joseph@codesourcery.com>
+
+       * 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.
+
 2018-10-17  Joseph Myers  <joseph@codesourcery.com>
 
        * c.opt (std=c17, std=c18, std=gnu17, std=gnu18, std=iso9899:2017)
index 2e64a6b71ac18b62f56342bc27521c237da8bb82..f10cf89c3a782b739f866fa5fda79358d8fd9909 100644 (file)
@@ -214,6 +214,10 @@ int flag_isoc99;
 
 int flag_isoc11;
 
+/* Nonzero means use the ISO C2X dialect of C.  */
+
+int flag_isoc2x;
+
 /* Nonzero means that we have builtin functions, and main is an int.  */
 
 int flag_hosted = 1;
index 70b152f459e781cb928f0559d4dc37a8d3c346fc..641fe57d671d45fb2e8fdbd2737a13845810713a 100644 (file)
@@ -498,7 +498,7 @@ extern GTY(()) tree c_global_trees[CTI_MAX];
 
 enum c_language_kind
 {
-  clk_c                = 0,            /* C90, C94, C99 or C11 */
+  clk_c                = 0,            /* C90, C94, C99, C11 or C2X */
   clk_objc     = 1,            /* clk_c with ObjC features.  */
   clk_cxx      = 2,            /* ANSI/ISO C++ */
   clk_objcxx   = 3             /* clk_cxx with ObjC features.  */
@@ -635,14 +635,18 @@ extern int flag_cond_mismatch;
 
 extern int flag_isoc94;
 
-/* Nonzero means use the ISO C99 (or C11) dialect of C.  */
+/* Nonzero means use the ISO C99 (or later) dialect of C.  */
 
 extern int flag_isoc99;
 
-/* Nonzero means use the ISO C11 dialect of C.  */
+/* Nonzero means use the ISO C11 (or later) dialect of C.  */
 
 extern int flag_isoc11;
 
+/* Nonzero means use the ISO C2X dialect of C.  */
+
+extern int flag_isoc2x;
+
 /* Nonzero means that we have builtin functions, and main is an int.  */
 
 extern int flag_hosted;
index 10cb53b2513a57c882dce552cd3dbe6f818c5796..9cf1900fb9ab94540e2c03c39a44413ac79b6d54 100644 (file)
@@ -117,6 +117,7 @@ static void set_std_c89 (int, int);
 static void set_std_c99 (int);
 static void set_std_c11 (int);
 static void set_std_c17 (int);
+static void set_std_c2x (int);
 static void check_deps_environment_vars (void);
 static void handle_deferred_opts (void);
 static void sanitize_cpp_opts (void);
@@ -679,6 +680,16 @@ c_common_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
        set_std_c17 (false /* ISO */);
       break;
 
+    case OPT_std_c2x:
+      if (!preprocessing_asm_p)
+       set_std_c2x (true /* ISO */);
+      break;
+
+    case OPT_std_gnu2x:
+      if (!preprocessing_asm_p)
+       set_std_c2x (false /* ISO */);
+      break;
+
     case OPT_trigraphs:
       cpp_opts->trigraphs = 1;
       break;
@@ -1554,6 +1565,7 @@ set_std_c89 (int c94, int iso)
   flag_isoc94 = c94;
   flag_isoc99 = 0;
   flag_isoc11 = 0;
+  flag_isoc2x = 0;
   lang_hooks.name = "GNU C89";
 }
 
@@ -1565,6 +1577,7 @@ set_std_c99 (int iso)
   flag_no_asm = iso;
   flag_no_nonansi_builtin = iso;
   flag_iso = iso;
+  flag_isoc2x = 0;
   flag_isoc11 = 0;
   flag_isoc99 = 1;
   flag_isoc94 = 1;
@@ -1579,6 +1592,7 @@ set_std_c11 (int iso)
   flag_no_asm = iso;
   flag_no_nonansi_builtin = iso;
   flag_iso = iso;
+  flag_isoc2x = 0;
   flag_isoc11 = 1;
   flag_isoc99 = 1;
   flag_isoc94 = 1;
@@ -1593,12 +1607,28 @@ set_std_c17 (int iso)
   flag_no_asm = iso;
   flag_no_nonansi_builtin = iso;
   flag_iso = iso;
+  flag_isoc2x = 0;
   flag_isoc11 = 1;
   flag_isoc99 = 1;
   flag_isoc94 = 1;
   lang_hooks.name = "GNU C17";
 }
 
+/* Set the C 2X standard (without GNU extensions if ISO).  */
+static void
+set_std_c2x (int iso)
+{
+  cpp_set_lang (parse_in, iso ? CLK_STDC2X: CLK_GNUC2X);
+  flag_no_asm = iso;
+  flag_no_nonansi_builtin = iso;
+  flag_iso = iso;
+  flag_isoc2x = 1;
+  flag_isoc11 = 1;
+  flag_isoc99 = 1;
+  flag_isoc94 = 1;
+  lang_hooks.name = "GNU C2X";
+}
+
 
 /* Set the C++ 98 standard (without GNU extensions if ISO).  */
 static void
index a7c8dd5d8f3b7338932dc82b117d946d13c7b50a..6f88a1013d6f67b6d709896cd87c7760cdecc04e 100644 (file)
@@ -366,6 +366,10 @@ Wbuiltin-macro-redefined
 C ObjC C++ ObjC++ CPP(warn_builtin_macro_redefined) CppReason(CPP_W_BUILTIN_MACRO_REDEFINED) Var(cpp_warn_builtin_macro_redefined) Init(1) Warning
 Warn when a built-in preprocessor macro is undefined or redefined.
 
+Wc11-c2x-compat
+C ObjC Var(warn_c11_c2x_compat) Init(-1) Warning
+Warn about features not present in ISO C11, but present in ISO C2X.
+
 Wc90-c99-compat
 C ObjC CPP(cpp_warn_c90_c99_compat) CppReason(CPP_W_C90_C99_COMPAT) Var(warn_c90_c99_compat) Init(-1) Warning
 Warn about features not present in ISO C90, but present in ISO C99.
@@ -1998,6 +2002,10 @@ std=c18
 C ObjC Alias(std=c17)
 Conform to the ISO 2017 C standard (published in 2018).
 
+std=c2x
+C ObjC
+Conform to the ISO 202X C standard draft (experimental and incomplete support).
+
 std=c89
 C ObjC Alias(std=c90)
 Conform to the ISO 1990 C standard.
@@ -2068,6 +2076,10 @@ std=gnu18
 C ObjC Alias(std=gnu17)
 Conform to the ISO 2017 C standard (published in 2018) with GNU extensions.
 
+std=gnu2x
+C ObjC
+Conform to the ISO 202X C standard draft with GNU extensions (experimental and incomplete support).
+
 std=gnu89
 C ObjC Alias(std=gnu90)
 Conform to the ISO 1990 C standard with GNU extensions.
index 4807a322527d52fd29032aafe36be4f67fd552ad..2c07f2f612599e1598b5d293c6cdfb40a52c79a0 100644 (file)
@@ -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.
index 2d507107f0ca7b70e287b711bf52ba553d77f0f6..4ff2080e94a08a119679880e4af509cc368493d4 100644 (file)
@@ -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
index 1f173fc10e229e477cbd5f75ba02e6fd169b6435..ee66ce89b5dea3f56956c74a1d223a3e6d271483 100644 (file)
@@ -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
index 017c01c592ce6825ec211b2b16bc63eecf51258a..be63feec7bd5dd8a3728687005b15d507b7f178c 100644 (file)
@@ -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,
index 03c78fc7549f2e712b0bc79d4a94497a5051f9b8..6663e3558345fa85658f09737f10d05c48604599 100644 (file)
@@ -366,6 +366,7 @@ rl78_option_override (void)
       && strcmp (lang_hooks.name, "GNU C")
       && strcmp (lang_hooks.name, "GNU C11")
       && strcmp (lang_hooks.name, "GNU C17")
+      && strcmp (lang_hooks.name, "GNU C2X")
       && strcmp (lang_hooks.name, "GNU C89")
       && strcmp (lang_hooks.name, "GNU C99")
       /* Compiling with -flto results in a language of GNU GIMPLE being used... */
index 53455741fd9778b8bf8df118f975020d3324c300..cb5d5bd77759d1bebdadf898a32f09a2e5c22cd0 100644 (file)
@@ -1887,7 +1887,8 @@ the 1999 revision of the C standard; the value @code{201112L}
 signifies the 2011 revision of the C standard; the value
 @code{201710L} signifies the 2017 revision of the C standard (which is
 otherwise identical to the 2011 version apart from correction of
-defects).
+defects).  An unspecified value larger than @code{201710L} is used for
+the experimental @option{-std=c2x} and @option{-std=gnu2x} modes.
 
 This macro is not defined if the @option{-traditional-cpp} option is
 used, nor when compiling C++ or Objective-C@.
index 7b080767692196b9f820749b622399aead2fc48d..bf8bcfb290703bc5efa04db0b958d970a3f568fa 100644 (file)
@@ -1933,6 +1933,10 @@ same as C11 except for corrections of defects (all of which are also
 applied with @option{-std=c11}) and a new value of
 @code{__STDC_VERSION__}, and so is supported to the same extent as C11.
 
+@item c2x
+The next version of the ISO C standard, still under development.  The
+support for this version is experimental and incomplete.
+
 @item gnu90
 @itemx gnu89
 GNU dialect of ISO C90 (including some C99 features).
@@ -1950,6 +1954,11 @@ The name @samp{gnu1x} is deprecated.
 @itemx gnu18
 GNU dialect of ISO C17.  This is the default for C code.
 
+@item gnu2x
+The next version of the ISO C standard, still under development, plus
+GNU extensions.  The support for this version is experimental and
+incomplete.
+
 @item c++98
 @itemx c++03
 The 1998 ISO C++ standard plus the 2003 technical corrigendum and some
index bd9ff6bf8229647e708366b70d67ebb7d098a0a6..26350cc926551870b9c4b74ed2c4630423606a0c 100644 (file)
@@ -38,6 +38,8 @@ with some exceptions, and possibly with some extensions.
 @cindex C1X
 @cindex ISO C17
 @cindex C17
+@cindex ISO C2X
+@cindex C2X
 @cindex Technical Corrigenda
 @cindex TC1
 @cindex Technical Corrigendum 1
@@ -109,6 +111,10 @@ known as @dfn{C17} and is supported with @option{-std=c17} or
 @option{-std=c11}, and the only difference between the options is the
 value of @code{__STDC_VERSION__}.
 
+A further version of the C standard, known as @dfn{C2X}, is under
+development; experimental and incomplete support for this is enabled
+with @option{-std=c2x}.
+
 By default, GCC provides some extensions to the C language that, on
 rare occasions conflict with the C standard.  @xref{C
 Extensions,,Extensions to the C Language Family}.  
index 0772b364919454428075c560851744e7214f43da..42eab9e0f660c1df8baad37622a33b458e0007c0 100644 (file)
@@ -24329,6 +24329,8 @@ highest_c_language (const char *lang1, const char *lang2)
   if (strcmp ("GNU C++98", lang1) == 0 || strcmp ("GNU C++98", lang2) == 0)
     return "GNU C++98";
 
+  if (strcmp ("GNU C2X", lang1) == 0 || strcmp ("GNU C2X", lang2) == 0)
+    return "GNU C2X";
   if (strcmp ("GNU C17", lang1) == 0 || strcmp ("GNU C17", lang2) == 0)
     return "GNU C17";
   if (strcmp ("GNU C11", lang1) == 0 || strcmp ("GNU C11", lang2) == 0)
@@ -24408,7 +24410,8 @@ gen_compile_unit_die (const char *filename)
 
          if (dwarf_version >= 5 /* || !dwarf_strict */)
            if (strcmp (language_string, "GNU C11") == 0
-               || strcmp (language_string, "GNU C17") == 0)
+               || strcmp (language_string, "GNU C17") == 0
+               || strcmp (language_string, "GNU C2X"))
              language = DW_LANG_C11;
        }
     }
index 9cb109ef0346295138f25efc4f462daf4835f3eb..f6dbcf731c2d2d8f98878b5bba267d1d18fddb6d 100644 (file)
@@ -1,3 +1,11 @@
+2018-10-17  Joseph Myers  <joseph@codesourcery.com>
+
+       * 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.
+
 2018-10-17  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/87632
diff --git a/gcc/testsuite/gcc.dg/c11-static-assert-7.c b/gcc/testsuite/gcc.dg/c11-static-assert-7.c
new file mode 100644 (file)
index 0000000..8cea923
--- /dev/null
@@ -0,0 +1,5 @@
+/* Test C11 static assertions.  Omitting the string not supported.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -pedantic" } */
+
+_Static_assert (1); /* { dg-warning "does not support omitting the string" } */
diff --git a/gcc/testsuite/gcc.dg/c11-static-assert-8.c b/gcc/testsuite/gcc.dg/c11-static-assert-8.c
new file mode 100644 (file)
index 0000000..20e5a6d
--- /dev/null
@@ -0,0 +1,5 @@
+/* Test C11 static assertions.  Omitting the string not supported.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -pedantic-errors" } */
+
+_Static_assert (1); /* { dg-error "does not support omitting the string" } */
diff --git a/gcc/testsuite/gcc.dg/c11-static-assert-9.c b/gcc/testsuite/gcc.dg/c11-static-assert-9.c
new file mode 100644 (file)
index 0000000..93696ab
--- /dev/null
@@ -0,0 +1,6 @@
+/* Test C11 static assertions.  Omitting the string not supported, but
+   -Wno-c11-c2x-compat disables the -pedantic diagnostic for that.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c11 -pedantic -Wno-c11-c2x-compat" } */
+
+_Static_assert (1);
diff --git a/gcc/testsuite/gcc.dg/c2x-static-assert-1.c b/gcc/testsuite/gcc.dg/c2x-static-assert-1.c
new file mode 100644 (file)
index 0000000..1b771a1
--- /dev/null
@@ -0,0 +1,5 @@
+/* Test C2x static assertions.  Omitting the string supported.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x -pedantic" } */
+
+_Static_assert (1);
diff --git a/gcc/testsuite/gcc.dg/c2x-static-assert-2.c b/gcc/testsuite/gcc.dg/c2x-static-assert-2.c
new file mode 100644 (file)
index 0000000..c347467
--- /dev/null
@@ -0,0 +1,6 @@
+/* Test C2x static assertions.  Omitting the string supported.  Failed
+   assertions.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x -pedantic" } */
+
+_Static_assert (0); /* { dg-error "static assertion failed" } */
diff --git a/gcc/testsuite/gcc.dg/c99-static-assert-2.c b/gcc/testsuite/gcc.dg/c99-static-assert-2.c
new file mode 100644 (file)
index 0000000..dffa77c
--- /dev/null
@@ -0,0 +1,6 @@
+/* Test static assertions.  Omitting the string should not result in a
+   duplicate diagnostic in pre-C11 modes.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -pedantic" } */
+
+_Static_assert (1); /* { dg-warning "ISO C99 does not support '_Static_assert'" } */
diff --git a/gcc/testsuite/gcc.dg/gnu2x-static-assert-1.c b/gcc/testsuite/gcc.dg/gnu2x-static-assert-1.c
new file mode 100644 (file)
index 0000000..4ed095c
--- /dev/null
@@ -0,0 +1,6 @@
+/* Test C11 static assertions.  Omitting the string diagnosed with
+   -Wc11-c2x-compat.  */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu2x -Wc11-c2x-compat" } */
+
+_Static_assert (1); /* { dg-warning "does not support omitting the string" } */
index e2d00dfa03fee6fa24c0309b4c778460fe051442..5c7aaed6a2735567d52936b11ba961d2160d3ea8 100644 (file)
@@ -15,11 +15,11 @@ void test_static_assert_1 (void)
 
 void test_static_assert_2 (void)
 {
-  _Static_assert(sizeof(int) >= sizeof(char); /* { dg-error "expected ',' before ';' token" } */
+  _Static_assert(sizeof(int) >= sizeof(char); /* { dg-error "expected '\\)' before ';' token" } */
   /* { dg-begin-multiline-output "" }
    _Static_assert(sizeof(int) >= sizeof(char);
-                                             ^
-                                             ,
+                 ~                           ^
+                                             )
      { dg-end-multiline-output "" } */
 }
 
index e240b2c7058f751878278013464ce29257ace9bd..fd08a330ccaa24e40bc66e82d1cecb5396a0b2ee 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-17  Joseph Myers  <joseph@codesourcery.com>
+
+       * 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.
+
 2018-10-11  David Malcolm  <dmalcolm@redhat.com>
 
        * macro.c (_cpp_arguments_ok): If the argument count is wrong, add
index 797cfb92e78c251887afd6eba778378d82474d59..a9b4fb3973cf9a255f259236417106a9103ace07 100644 (file)
@@ -167,8 +167,9 @@ enum cpp_ttype
 #undef TK
 
 /* C language kind, used when calling cpp_create_reader.  */
-enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_GNUC11, CLK_GNUC17,
+enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_GNUC11, CLK_GNUC17, CLK_GNUC2X,
             CLK_STDC89, CLK_STDC94, CLK_STDC99, CLK_STDC11, CLK_STDC17,
+            CLK_STDC2X,
             CLK_GNUCXX, CLK_CXX98, CLK_GNUCXX11, CLK_CXX11,
             CLK_GNUCXX14, CLK_CXX14, CLK_GNUCXX17, CLK_CXX17,
             CLK_GNUCXX2A, CLK_CXX2A, CLK_ASM};
index 32a595651743dc78f941c4cf867d2c4911ce0a9f..9b7490b0d8a8d71675232c3fb92b65c1cced9662 100644 (file)
@@ -100,11 +100,13 @@ static const struct lang_flags lang_defaults[] =
   /* GNUC99   */  { 1,  0,  1,  1,  0,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1 },
   /* GNUC11   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1 },
   /* GNUC17   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1 },
+  /* GNUC2X   */  { 1,  0,  1,  1,  1,  0,  1,   1,   1,   0,    0,     0,     0,   0,      1 },
   /* STDC89   */  { 0,  0,  0,  0,  0,  1,  0,   0,   0,   0,    0,     0,     1,   0,      0 },
   /* STDC94   */  { 0,  0,  0,  0,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0 },
   /* STDC99   */  { 1,  0,  1,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0 },
   /* STDC11   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0 },
   /* STDC17   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0 },
+  /* STDC2X   */  { 1,  0,  1,  1,  1,  1,  1,   1,   0,   0,    0,     0,     1,   0,      0 },
   /* GNUCXX   */  { 0,  1,  1,  1,  0,  0,  1,   0,   0,   0,    0,     0,     0,   0,      1 },
   /* CXX98    */  { 0,  1,  0,  1,  0,  1,  1,   0,   0,   0,    0,     0,     1,   0,      0 },
   /* GNUCXX11 */  { 1,  1,  1,  1,  1,  0,  1,   1,   1,   1,    0,     0,     0,   0,      1 },
@@ -521,6 +523,9 @@ cpp_init_builtins (cpp_reader *pfile, int hosted)
     _cpp_define_builtin (pfile, "__ASSEMBLER__ 1");
   else if (CPP_OPTION (pfile, lang) == CLK_STDC94)
     _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L");
+  else if (CPP_OPTION (pfile, lang) == CLK_STDC2X
+          || CPP_OPTION (pfile, lang) == CLK_GNUC2X)
+    _cpp_define_builtin (pfile, "__STDC_VERSION__ 202000L");
   else if (CPP_OPTION (pfile, lang) == CLK_STDC17
           || CPP_OPTION (pfile, lang) == CLK_GNUC17)
     _cpp_define_builtin (pfile, "__STDC_VERSION__ 201710L");