Linux SPARSE checker discussions
 help / color / mirror / Atom feed
From: Bart Van Assche <bvanassche@acm.org>
To: linux-sparse@vger.kernel.org
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Bart Van Assche <bvanassche@acm.org>
Subject: [PATCH 43/73] c23: Add support for bool, true, and false keywords
Date: Mon,  9 Nov 2026 12:32:29 -0800	[thread overview]
Message-ID: <20261109203259.362845-44-bvanassche@acm.org> (raw)
In-Reply-To: <20261109203259.362845-1-bvanassche@acm.org>

Register bool, true, and false as reserved keywords in C23 mode and
evaluate true and false as integer constant expressions of type bool
with values 1 and 0 in both C expressions and #if conditionals per ISO
C23 6.4.4.5 and 6.10.1.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 expression.c                | 15 ++++++++++++-
 ident-list.h                |  3 +++
 parse.c                     |  3 +++
 pre-process.c               | 10 +++++++++
 validation/c23-bool-error.c | 23 +++++++++++++++++++
 validation/c23-bool.c       | 45 +++++++++++++++++++++++++++++++++++++
 6 files changed, 98 insertions(+), 1 deletion(-)
 create mode 100644 validation/c23-bool-error.c
 create mode 100644 validation/c23-bool.c

diff --git a/expression.c b/expression.c
index 4545adcf4c02..9b07963c914a 100644
--- a/expression.c
+++ b/expression.c
@@ -466,9 +466,22 @@ struct token *primary_expression(struct token *token, struct expression **tree)
 	}
 
 	case TOKEN_IDENT: {
-		struct symbol *sym = lookup_symbol(token->ident, NS_SYMBOL | NS_TYPEDEF);
+		struct symbol *sym;
 		struct token *next = token->next;
 
+		if (standard >= STANDARD_C23 &&
+		    (token->ident == &true_ident ||
+		     token->ident == &false_ident)) {
+			expr = alloc_expression(token->pos, EXPR_VALUE);
+			expr->flags = CEF_SET_INT;
+			expr->ctype = &bool_ctype;
+			expr->value = (token->ident == &true_ident);
+			token = next;
+			break;
+		}
+
+		sym = lookup_symbol(token->ident, NS_SYMBOL | NS_TYPEDEF);
+
 		if (!sym) {
 			sym = handle_func(token);
 			if (token->ident == &__builtin_types_compatible_p_ident) {
diff --git a/ident-list.h b/ident-list.h
index 83031b265388..31a37bede4ed 100644
--- a/ident-list.h
+++ b/ident-list.h
@@ -46,8 +46,11 @@ IDENT(_Thread_local);
 /* C23 keywords */
 IDENT(alignas);
 IDENT(alignof);
+IDENT(bool);
+IDENT(false);
 IDENT(static_assert);
 IDENT(thread_local);
+IDENT(true);
 
 /* Special case for L'\t' */
 IDENT(L);
diff --git a/parse.c b/parse.c
index d6c23fcdfb5d..4edfed1cdf97 100644
--- a/parse.c
+++ b/parse.c
@@ -520,6 +520,7 @@ static struct init_keyword {
 	N("unsigned",		&unsigned_op),
 	N("__int128",		&int128_op),
 	N("_Bool",		&spec_op,	.type = &bool_ctype),
+	N("bool",		&spec_op,	.type = &bool_ctype, .std = STANDARD_C23),
 
 	/* Predeclared types */
 	N("__builtin_va_list",	&spec_op,	.type = &ptr_ctype),
@@ -655,6 +656,8 @@ void init_parser_finalize(void)
 	if (standard >= STANDARD_C23) {
 		static_assert_ident.reserved = 1;
 		alignof_ident.reserved = 1;
+		true_ident.reserved = 1;
+		false_ident.reserved = 1;
 	}
 }
 
diff --git a/pre-process.c b/pre-process.c
index fbe4ba215532..a733927c4c14 100644
--- a/pre-process.c
+++ b/pre-process.c
@@ -1937,6 +1937,16 @@ static int expression_value(struct token **where)
 				continue;
 			if (token_type(p) != TOKEN_IDENT)
 				break;
+			if (standard >= STANDARD_C23 &&
+			    p->ident == &true_ident) {
+				replace_with_bool(p, 1);
+				break;
+			}
+			if (standard >= STANDARD_C23 &&
+			    p->ident == &false_ident) {
+				replace_with_bool(p, 0);
+				break;
+			}
 			token_type(p) = TOKEN_ZERO_IDENT;
 			break;
 		case 1:
diff --git a/validation/c23-bool-error.c b/validation/c23-bool-error.c
new file mode 100644
index 000000000000..49bfafa5bbd1
--- /dev/null
+++ b/validation/c23-bool-error.c
@@ -0,0 +1,23 @@
+static int (bool);
+static int (true);
+static int (false);
+typedef int bool;
+
+static void bad_lvalue(void)
+{
+	true = false;
+}
+
+/*
+ * check-name: c23-bool-error
+ * check-command: sparse -std=c23 -Wno-decl $file
+ *
+ * check-error-start
+c23-bool-error.c:1:12: error: Trying to use reserved word 'bool' as identifier
+c23-bool-error.c:2:12: error: Trying to use reserved word 'true' as identifier
+c23-bool-error.c:3:12: error: Trying to use reserved word 'false' as identifier
+c23-bool-error.c:4:13: error: two or more data types in declaration specifiers
+c23-bool-error.c:4:13: error: Trying to use reserved word 'bool' as identifier
+c23-bool-error.c:8:14: error: not an lvalue
+ * check-error-end
+ */
diff --git a/validation/c23-bool.c b/validation/c23-bool.c
new file mode 100644
index 000000000000..8b68b2ad9261
--- /dev/null
+++ b/validation/c23-bool.c
@@ -0,0 +1,45 @@
+#if true
+int t = 1;
+#endif
+
+#if !false
+int f = 1;
+#endif
+
+#if true + true != 2
+#error "true + true must equal 2 in preprocessor"
+#endif
+
+bool a = true;
+bool b = false;
+
+struct bool_bf {
+	bool flag : 1;
+};
+
+static_assert(true == 1, "true is 1");
+static_assert(false == 0, "false is 0");
+static_assert(true + true == 2, "integer promotion of true");
+static_assert(sizeof(true) == sizeof(bool), "sizeof true is sizeof bool");
+static_assert(sizeof(false) == sizeof(bool), "sizeof false is sizeof bool");
+static_assert(_Generic(true, bool: 1, int: 0, default: 0) == 1,
+	      "type of true is bool");
+static_assert(_Generic(false, bool: 1, int: 0, default: 0) == 1,
+	      "type of false is bool");
+static_assert(_Generic(+true, int: 1, bool: 0, default: 0) == 1,
+	      "+true promotes to int");
+
+static int test_conversions(void)
+{
+	bool b1 = (bool)0.5;
+	bool b2 = (bool)0.0;
+	bool b3 = (bool)&a;
+	struct bool_bf s = { .flag = true };
+
+	return b1 + !b2 + b3 + s.flag;
+}
+
+/*
+ * check-name: c23-bool
+ * check-command: sparse -std=c23 -pedantic -Wno-decl $file
+ */

  parent reply	other threads:[~2026-11-09 20:33 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-09 20:31 Bart Van Assche
2026-11-09 20:31 ` [PATCH 01/73] Makefile: Pass '--' to rm in clean target to handle dash-prefixed files Bart Van Assche
2026-11-09 20:31 ` [PATCH 02/73] sparse-llvm: Use LLVMCreateBuilderForModule() with LLVM 24 and later Bart Van Assche
2026-11-09 20:31 ` [PATCH 03/73] typeof_unqual: Strip qualifiers and address space from types and arrays Bart Van Assche
2026-11-09 20:31 ` [PATCH 04/73] bitfield: Pack consecutive _Bool bitfields into byte containers Bart Van Assche
2026-11-09 20:31 ` [PATCH 05/73] allocate: Harden slab allocation bounds, zeroing, and mmap checks Bart Van Assche
2026-11-09 20:31 ` [PATCH 06/73] tokenize: Support 4096-byte identifiers and fix escape bounds Bart Van Assche
2026-11-09 20:31 ` [PATCH 07/73] pre-process: Fix macro expansion and include directive handling Bart Van Assche
2026-11-09 20:31 ` [PATCH 08/73] options, lib: Harden warning buffers and command-line option parsing Bart Van Assche
2026-11-09 20:31 ` [PATCH 09/73] builtin: Fix atomic builtin type checking and object_size bounds Bart Van Assche
2026-11-09 20:31 ` [PATCH 10/73] parse, show-parse: Fix attribute propagation, enum overflow, and bounds Bart Van Assche
2026-11-09 20:31 ` [PATCH 11/73] target-openrisc: Set target_openrisc.mach to MACH_OPENRISC Bart Van Assche
2026-11-09 20:31 ` [PATCH 12/73] evaluate: Fix pointer arithmetic, incomplete types, and qualifiers Bart Van Assche
2026-11-09 20:31 ` [PATCH 13/73] expand: Fix static initializer folding and floating-point casts Bart Van Assche
2026-11-09 20:32 ` [PATCH 14/73] inline: Copy union cast types and VLA bounds when inlining Bart Van Assche
2026-11-09 20:32 ` [PATCH 15/73] linearize, flow: Fix asm operands, switch case bounds, and DSE Bart Van Assche
2026-11-09 20:32 ` [PATCH 16/73] memops, ssa: Walk parent insns in reverse and skip mixed-size SSA Bart Van Assche
2026-11-09 20:32 ` [PATCH 17/73] simplify: Prevent overflow on LLONG_MIN negation and fix simplifications Bart Van Assche
2026-11-09 20:32 ` [PATCH 18/73] sparse: Gate context failure warning on Wcontext and catch underflow Bart Van Assche
2026-11-09 20:32 ` [PATCH 19/73] ast-model: Return AST_N_COLUMNS and inspect child nodes lazily Bart Van Assche
2026-11-09 20:32 ` [PATCH 20/73] c2xml: Guard against recursive symbols and free xmlGetProp() string Bart Van Assche
2026-11-09 20:32 ` [PATCH 21/73] compile-i386: Fix buffer bounds, unsigned '<=' codegen, and null checks Bart Van Assche
2026-11-09 20:32 ` [PATCH 22/73] ctags: Fix line comparison order and handle SYM_RESTRICT and SYM_LABEL Bart Van Assche
2026-11-09 20:32 ` [PATCH 23/73] dissect: Unwrap array element type via base_type() Bart Van Assche
2026-11-09 20:32 ` [PATCH 24/73] example: Fix show_op() rotating buffer dimensions Bart Van Assche
2026-11-09 20:32 ` [PATCH 25/73] graph: Check PSEUDO_SYM before dereferencing insn->func->sym Bart Van Assche
2026-11-09 20:32 ` [PATCH 26/73] scheck: Fix slice() upper bit index calculation Bart Van Assche
2026-11-09 20:32 ` [PATCH 27/73] sparse-llvm: Support arbitrary struct member counts and fix operand types Bart Van Assche
2026-11-09 20:32 ` [PATCH 28/73] inline: Duplicate generic expressions instead of evaluating them Bart Van Assche
2026-11-09 20:32 ` [PATCH 29/73] lib: Avoid mutating fmt before va_start() in warning() Bart Van Assche
2026-11-09 20:32 ` [PATCH 30/73] cse, canon: Cast pointers to uintptr_t before relational comparison Bart Van Assche
2026-11-09 20:32 ` [PATCH 31/73] context: Add "conditional context increment" model Bart Van Assche
2026-11-09 20:32 ` [PATCH 32/73] expand: Simplify signed constants early Bart Van Assche
2026-11-09 20:32 ` [PATCH 33/73] bitwise: Allow all-bits-set as a restricted value Bart Van Assche
2026-11-09 20:32 ` [PATCH 34/73] bitwise: Allow restricted ordered compares with unrestricted values Bart Van Assche
2026-11-09 20:32 ` [PATCH 35/73] bitwise: Keep unrestricted values unrestricted after a cast Bart Van Assche
2026-11-09 20:32 ` [PATCH 36/73] bitwise: Don't remove MOD_SPECIFIER from 'bitwise' types Bart Van Assche
2026-11-09 20:32 ` [PATCH 37/73] bitwise: Allow both regular casts and forced casts for restricted values Bart Van Assche
2026-11-09 20:32 ` [PATCH 38/73] clang-format: Add .clang-format configuration file Bart Van Assche
2026-11-09 20:32 ` [PATCH 39/73] options: Add support for -std=c23, -std=c2x and -std=gnu23 Bart Van Assche
2026-11-09 20:32 ` [PATCH 40/73] preprocessor: Add support for #elifdef and #elifndef Bart Van Assche
2026-11-09 20:32 ` [PATCH 41/73] preprocessor: Add support for __has_include and __has_include_next Bart Van Assche
2026-11-09 20:32 ` [PATCH 42/73] c23: Add support for static_assert, alignas, alignof, thread_local Bart Van Assche
2026-11-09 20:32 ` Bart Van Assche [this message]
2026-11-09 20:32 ` [PATCH 44/73] c23: Add support for nullptr and nullptr_t Bart Van Assche
2026-11-09 20:32 ` [PATCH 45/73] c23: Add support for digit separators in numeric literals Bart Van Assche
2026-11-09 20:32 ` [PATCH 46/73] c23: Support unnamed parameters in function definitions Bart Van Assche
2026-11-09 20:32 ` [PATCH 47/73] c23: Support variadic functions without named parameters Bart Van Assche
2026-11-09 20:32 ` [PATCH 48/73] c23: Support labels before declarations and at block ends Bart Van Assche
2026-11-09 20:32 ` [PATCH 49/73] c23: Support auto type inference Bart Van Assche
2026-11-09 20:32 ` [PATCH 50/73] c23: Support constexpr object specifier Bart Van Assche
2026-11-09 20:32 ` [PATCH 51/73] c23: Support enumerations with fixed underlying types Bart Van Assche
2026-11-09 20:32 ` [PATCH 52/73] c23: Support standard [[]] attribute syntax Bart Van Assche
2026-11-09 20:32 ` [PATCH 53/73] preprocessor: Add support for __has_c_attribute Bart Van Assche
2026-11-09 20:32 ` [PATCH 54/73] c23: Support empty initializer braces {} Bart Van Assche
2026-11-09 20:32 ` [PATCH 55/73] preprocessor: Add support for __has_embed Bart Van Assche
2026-11-09 20:32 ` [PATCH 56/73] preprocessor: Add support for #embed directive Bart Van Assche
2026-11-09 20:32 ` [PATCH 57/73] c23: Add support for u8 character constants and string literals Bart Van Assche
2026-11-09 20:32 ` [PATCH 58/73] preprocessor: Add support for __VA_OPT__ Bart Van Assche
2026-11-09 20:32 ` [PATCH 59/73] c23: Treat empty parameter list () as (void) and reject K&R functions Bart Van Assche
2026-11-09 20:32 ` [PATCH 60/73] c23: Support storage-class specifiers in compound literals Bart Van Assche
2026-11-09 20:32 ` [PATCH 61/73] c23: Add support for _BitInt(N) Bart Van Assche
2026-11-09 20:32 ` [PATCH 62/73] enum: Support machine mode attributes on enumeration types Bart Van Assche
2026-11-09 20:32 ` [PATCH 63/73] enum: Support __attribute__((packed)) " Bart Van Assche
2026-11-09 20:32 ` [PATCH 64/73] expand: Ignore top-level non-array address space in compare_types() Bart Van Assche
2026-11-09 20:32 ` [PATCH 65/73] builtin: Support __builtin_infer_alloc_token() as a size_t ICE Bart Van Assche
2026-11-09 20:32 ` [PATCH 66/73] builtin: Add support for Linux kernel compiler builtins Bart Van Assche
2026-11-09 20:32 ` [PATCH 67/73] builtin: Add support for __builtin_has_attribute() Bart Van Assche
2026-11-09 20:32 ` [PATCH 68/73] cleanup: Support __attribute__((cleanup(...))) in linearize and -Wcontext Bart Van Assche
2026-11-09 20:32 ` [PATCH 69/73] builtin: Do not evaluate __builtin_clz(0) and __builtin_ctz(0) Bart Van Assche
2026-11-09 20:32 ` [PATCH 70/73] pre-process: Support long token and string expansions dynamically Bart Van Assche
2026-11-09 20:32 ` [PATCH 71/73] x86: Undefine conflicting bitness macros when parsing -m flags Bart Van Assche
2026-11-09 20:32 ` [PATCH 72/73] evaluate: Accept conditional expressions with only one void side Bart Van Assche
2026-11-09 20:32 ` [PATCH 73/73] ci: Add Linux kernel GitHub Actions workflow and build script Bart Van Assche

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261109203259.362845-44-bvanassche@acm.org \
    --to=bvanassche@acm.org \
    --cc=linux-sparse@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox