Skip to content
Snippets Groups Projects
  • Joseph Myers's avatar
    0a91bdaf
    c: New C2x keywords · 0a91bdaf
    Joseph Myers authored
    C2x follows C++ in making alignas, alignof, bool, false,
    static_assert, thread_local and true keywords; implement this
    accordingly.  This implementation makes them normal keywords in C2x
    mode just like any other keyword (C2x leaves open the possibility of
    implementation using predefined macros instead - thus, there aren't
    any testcases asserting that they aren't macros).  As in C++ and
    previous versions of C, true and false are handled like signed 1 and 0
    in #if (there was an intermediate state in some C2x drafts where they
    had different macro expansions that were unsigned in #if).
    
    Bootstrapped with no regressions for x86_64-pc-linux-gnu.
    
    As with the removal of unprototyped functions, this change has a high
    risk of breaking some old code and people doing GNU/Linux distribution
    builds may wish to see how much is broken in a build with a -std=gnu2x
    default.
    
    gcc/
    	* ginclude/stdalign.h [defined __STDC_VERSION__ &&
    	__STDC_VERSION__ > 201710L]: Disable all content.
    	* ginclude/stdbool.h [defined __STDC_VERSION__ && __STDC_VERSION__
    	> 201710L] (bool, true, false): Do not define.
    
    gcc/c-family/
    	* c-common.cc (c_common_reswords): Use D_C2X instead of D_CXXONLY
    	for alignas, alignof, bool, false, static_assert, thread_local and
    	true.
    
    gcc/c/
    	* c-parser.cc (c_parser_static_assert_declaration_no_semi)
    	(c_parser_alignas_specifier, c_parser_alignof_expression): Allow
    	for C2x spellings of keywords.
    	(c_parser_postfix_expression): Handle RID_TRUE and RID_FALSE.
    
    gcc/testsuite/
    	* gcc.dg/c11-keywords-1.c, gcc.dg/c2x-align-1.c,
    	gcc.dg/c2x-align-6.c, gcc.dg/c2x-bool-2.c,
    	gcc.dg/c2x-static-assert-3.c, gcc.dg/c2x-static-assert-4.c,
    	gcc.dg/c2x-thread-local-1.c: New tests.
    	* gcc.dg/c2x-bool-1.c: Update expectations.
    
    libcpp/
    	* include/cpplib.h (struct cpp_options): Add true_false.
    	* expr.cc (eval_token): Check true_false not cplusplus to
    	determine whether to handle true and false keywords.
    	* init.cc (struct lang_flags): Add true_false.
    	(lang_defaults): Update.
    	(cpp_set_lang): Set true_false.
    0a91bdaf
    History
    c: New C2x keywords
    Joseph Myers authored
    C2x follows C++ in making alignas, alignof, bool, false,
    static_assert, thread_local and true keywords; implement this
    accordingly.  This implementation makes them normal keywords in C2x
    mode just like any other keyword (C2x leaves open the possibility of
    implementation using predefined macros instead - thus, there aren't
    any testcases asserting that they aren't macros).  As in C++ and
    previous versions of C, true and false are handled like signed 1 and 0
    in #if (there was an intermediate state in some C2x drafts where they
    had different macro expansions that were unsigned in #if).
    
    Bootstrapped with no regressions for x86_64-pc-linux-gnu.
    
    As with the removal of unprototyped functions, this change has a high
    risk of breaking some old code and people doing GNU/Linux distribution
    builds may wish to see how much is broken in a build with a -std=gnu2x
    default.
    
    gcc/
    	* ginclude/stdalign.h [defined __STDC_VERSION__ &&
    	__STDC_VERSION__ > 201710L]: Disable all content.
    	* ginclude/stdbool.h [defined __STDC_VERSION__ && __STDC_VERSION__
    	> 201710L] (bool, true, false): Do not define.
    
    gcc/c-family/
    	* c-common.cc (c_common_reswords): Use D_C2X instead of D_CXXONLY
    	for alignas, alignof, bool, false, static_assert, thread_local and
    	true.
    
    gcc/c/
    	* c-parser.cc (c_parser_static_assert_declaration_no_semi)
    	(c_parser_alignas_specifier, c_parser_alignof_expression): Allow
    	for C2x spellings of keywords.
    	(c_parser_postfix_expression): Handle RID_TRUE and RID_FALSE.
    
    gcc/testsuite/
    	* gcc.dg/c11-keywords-1.c, gcc.dg/c2x-align-1.c,
    	gcc.dg/c2x-align-6.c, gcc.dg/c2x-bool-2.c,
    	gcc.dg/c2x-static-assert-3.c, gcc.dg/c2x-static-assert-4.c,
    	gcc.dg/c2x-thread-local-1.c: New tests.
    	* gcc.dg/c2x-bool-1.c: Update expectations.
    
    libcpp/
    	* include/cpplib.h (struct cpp_options): Add true_false.
    	* expr.cc (eval_token): Check true_false not cplusplus to
    	determine whether to handle true and false keywords.
    	* init.cc (struct lang_flags): Add true_false.
    	(lang_defaults): Update.
    	(cpp_set_lang): Set true_false.