aboutsummaryrefslogtreecommitdiff
path: root/libcpp/expr.cc
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2022-09-07 13:56:25 +0000
committerJoseph Myers <joseph@codesourcery.com>2022-09-07 13:56:46 +0000
commit0a91bdaf177409a2a5e7895bce4f0e7091b4b3ca (patch)
tree403ae03d079179e0a3cf9fc3096c4c3b8e763e44 /libcpp/expr.cc
parent7abcdb06e31d82d4933cb6e0a626c3ccb28fa0c3 (diff)
downloadgcc-0a91bdaf177409a2a5e7895bce4f0e7091b4b3ca.zip
gcc-0a91bdaf177409a2a5e7895bce4f0e7091b4b3ca.tar.gz
gcc-0a91bdaf177409a2a5e7895bce4f0e7091b4b3ca.tar.bz2
c: New C2x keywords
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.
Diffstat (limited to 'libcpp/expr.cc')
-rw-r--r--libcpp/expr.cc2
1 files changed, 1 insertions, 1 deletions
diff --git a/libcpp/expr.cc b/libcpp/expr.cc
index a022904..4bb02c4 100644
--- a/libcpp/expr.cc
+++ b/libcpp/expr.cc
@@ -1183,7 +1183,7 @@ eval_token (cpp_reader *pfile, const cpp_token *token,
case CPP_NAME:
if (token->val.node.node == pfile->spec_nodes.n_defined)
return parse_defined (pfile);
- else if (CPP_OPTION (pfile, cplusplus)
+ else if (CPP_OPTION (pfile, true_false)
&& (token->val.node.node == pfile->spec_nodes.n_true
|| token->val.node.node == pfile->spec_nodes.n_false))
{