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 42/73] c23: Add support for static_assert, alignas, alignof, thread_local
Date: Mon,  9 Nov 2026 12:32:28 -0800	[thread overview]
Message-ID: <20261109203259.362845-43-bvanassche@acm.org> (raw)
In-Reply-To: <20261109203259.362845-1-bvanassche@acm.org>

Register static_assert, alignas, alignof, and thread_local as reserved
C23 keywords and support single-argument static_assert(expr) without a
message string per ISO C23 6.7.12:
- Mark static_assert and alignof as reserved identifiers in C23 mode
  while keeping them available as ordinary identifiers in pre-C23 modes.
- Warn under -Wpedantic when alignof or _Alignof is applied to an
  expression rather than a type name.
- Enforce ISO C23 constraints on alignas and thread_local declarations,
  and avoid materializing block-scope thread_local symbols as stack
  locals during linearization.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
 expression.c                        |  15 ++++-
 ident-list.h                        |   9 ++-
 linearize.c                         |   2 +-
 options.c                           |   2 +
 parse.c                             | 100 ++++++++++++++++++++++++++--
 parse.h                             |   1 +
 symbol.h                            |   2 +
 validation/c11-c23-keywords-ident.c |  19 ++++++
 validation/c23-alignof-pedantic.c   |  20 ++++++
 validation/c23-keywords-error.c     |  48 +++++++++++++
 validation/c23-keywords.c           |  30 +++++++++
 11 files changed, 241 insertions(+), 7 deletions(-)
 create mode 100644 validation/c11-c23-keywords-ident.c
 create mode 100644 validation/c23-alignof-pedantic.c
 create mode 100644 validation/c23-keywords-error.c
 create mode 100644 validation/c23-keywords.c

diff --git a/expression.c b/expression.c
index 04b1a242d08a..4545adcf4c02 100644
--- a/expression.c
+++ b/expression.c
@@ -646,13 +646,21 @@ static struct token *type_info_expression(struct token *token,
 	struct expression **tree, int type)
 {
 	struct expression *expr = alloc_expression(token->pos, type);
+	struct ident *op_ident = token->ident;
+	bool std_alignof = (op_ident == &_Alignof_ident ||
+			    op_ident == &alignof_ident);
 	struct token *p;
 
 	*tree = expr;
 	expr->flags = CEF_SET_ICE; /* XXX: VLA support will need that changed */
 	token = token->next;
-	if (!match_op(token, '(') || !lookup_type(token->next))
+	if (!match_op(token, '(') || !lookup_type(token->next)) {
+		if (std_alignof && Wpedantic)
+			warning(expr->pos,
+				"ISO C does not allow '%s' on an expression",
+				show_ident(op_ident));
 		return unary_expression(token, &expr->cast_expression);
+	}
 	p = token;
 	token = typename(token->next, &expr->cast_type, NULL);
 
@@ -672,6 +680,10 @@ static struct token *type_info_expression(struct token *token,
 	 */
 	if (match_op(token, '{')) {
 		struct expression *cast = alloc_expression(p->pos, EXPR_CAST);
+		if (std_alignof && Wpedantic)
+			warning(expr->pos,
+				"ISO C does not allow '%s' on an expression",
+				show_ident(op_ident));
 		cast->cast_type = expr->cast_type;
 		expr->cast_type = NULL;
 		expr->cast_expression = cast;
@@ -691,6 +703,7 @@ static struct token *unary_expression(struct token *token, struct expression **t
 				int type;
 			} type_information[] = {
 				{ &sizeof_ident, EXPR_SIZEOF },
+				{ &alignof_ident, EXPR_ALIGNOF },
 				{ &__alignof___ident, EXPR_ALIGNOF },
 				{ &__alignof_ident, EXPR_ALIGNOF },
 				{ &_Alignof_ident, EXPR_ALIGNOF },
diff --git a/ident-list.h b/ident-list.h
index 5f4d1fef5a81..83031b265388 100644
--- a/ident-list.h
+++ b/ident-list.h
@@ -43,12 +43,19 @@ IDENT(_Noreturn);
 IDENT_RESERVED(_Static_assert);
 IDENT(_Thread_local);
 
+/* C23 keywords */
+IDENT(alignas);
+IDENT(alignof);
+IDENT(static_assert);
+IDENT(thread_local);
+
 /* Special case for L'\t' */
 IDENT(L);
 
 /* Extended gcc identifiers */
 IDENT(asm); IDENT_RESERVED(__asm); IDENT_RESERVED(__asm__);
-IDENT(alignof); IDENT_RESERVED(__alignof); IDENT_RESERVED(__alignof__); 
+IDENT_RESERVED(__alignof);
+IDENT_RESERVED(__alignof__);
 IDENT_RESERVED(__sizeof_ptr__);
 IDENT_RESERVED(__builtin_types_compatible_p);
 IDENT_RESERVED(__builtin_offsetof);
diff --git a/linearize.c b/linearize.c
index 24b402622b83..bb3a5a9ecf16 100644
--- a/linearize.c
+++ b/linearize.c
@@ -1995,7 +1995,7 @@ static pseudo_t linearize_one_symbol(struct entrypoint *ep, struct symbol *sym)
 		return VOID;
 
 	/* We need to output these puppies some day too.. */
-	if (sym->ctype.modifiers & (MOD_STATIC | MOD_TOPLEVEL))
+	if (sym->ctype.modifiers & (MOD_STATIC | MOD_TOPLEVEL | MOD_TLS))
 		return VOID;
 
 	sym->initialized = 1;
diff --git a/options.c b/options.c
index c140a912e8e9..2de74afc5c35 100644
--- a/options.c
+++ b/options.c
@@ -11,6 +11,7 @@
 #include "lib.h"
 #include "machine.h"
 #include "target.h"
+#include "parse.h"
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -1068,4 +1069,5 @@ void handle_switch_finalize(void)
 {
 	handle_switch_v_finalize();
 	handle_switch_W_finalize();
+	init_parser_finalize();
 }
diff --git a/parse.c b/parse.c
index c30a00eafb3e..d6c23fcdfb5d 100644
--- a/parse.c
+++ b/parse.c
@@ -465,6 +465,7 @@ static struct init_keyword {
 	struct symbol_op *op;
 	struct symbol *type;
 	unsigned long mods;
+	int std;
 } typedefs[] = {
 #define N(I, O,...)	{ I, O,##__VA_ARGS__ }
 #define D(I, O,...)	N(I,O,##__VA_ARGS__ ),		\
@@ -481,6 +482,7 @@ static struct init_keyword {
 	N("extern",		&extern_op,	.mods = MOD_EXTERN),
 	N("__thread",		&thread_op),
 	N("_Thread_local",	&thread_op),
+	N("thread_local",	&thread_op,	.std = STANDARD_C23),
 
 	A("inline",		&inline_op,	.mods = MOD_INLINE),
 
@@ -498,6 +500,7 @@ static struct init_keyword {
 	N("_Atomic",		&atomic_op,	.mods = MOD_ATOMIC),
 	N("_Noreturn",		&noreturn_op,	.mods = MOD_NORETURN),
 	N("_Alignas",		&alignas_op),
+	N("alignas",		&alignas_op,	.std = STANDARD_C23),
 
 	U("attribute",		&attribute_op),
 
@@ -546,6 +549,7 @@ static struct init_keyword {
 	N("__context__",	&__context___op),
 	N("__range__",		&range_op),
 	N("_Static_assert",	&static_assert_op),
+	N("static_assert",	&static_assert_op, .std = STANDARD_C23),
 
 	/* Attributes */
 	D("packed",		&packed_op),
@@ -607,14 +611,23 @@ static void init_keyword(int stream, struct init_keyword *kw, enum namespace ns)
 	sym->op = kw->op;
 }
 
+static int parser_stream;
+
 void init_parser(int stream)
 {
 	int i;
 
-	for (i = 0; i < ARRAY_SIZE(typedefs); i++)
+	parser_stream = stream;
+	for (i = 0; i < ARRAY_SIZE(typedefs); i++) {
+		if (typedefs[i].std)
+			continue;
 		init_keyword(stream, &typedefs[i], NS_TYPEDEF);
-	for (i = 0; i < ARRAY_SIZE(keywords); i++)
+	}
+	for (i = 0; i < ARRAY_SIZE(keywords); i++) {
+		if (keywords[i].std)
+			continue;
 		init_keyword(stream, &keywords[i], NS_KEYWORD);
+	}
 
 	for (i = 0; i < ARRAY_SIZE(ignored_attributes); i++) {
 		const char * name = ignored_attributes[i];
@@ -627,6 +640,23 @@ void init_parser(int stream)
 	}
 }
 
+void init_parser_finalize(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(typedefs); i++) {
+		if (typedefs[i].std && standard >= typedefs[i].std)
+			init_keyword(parser_stream, &typedefs[i], NS_TYPEDEF);
+	}
+	for (i = 0; i < ARRAY_SIZE(keywords); i++) {
+		if (keywords[i].std && standard >= keywords[i].std)
+			init_keyword(parser_stream, &keywords[i], NS_KEYWORD);
+	}
+	if (standard >= STANDARD_C23) {
+		static_assert_ident.reserved = 1;
+		alignof_ident.reserved = 1;
+	}
+}
 
 static struct token *skip_to(struct token *token, int op)
 {
@@ -1513,6 +1543,7 @@ static struct token *alignas_specifier(struct token *token, struct symbol *sym,
 {
 	int alignment = 0;
 
+	ctx->has_alignas = 1;
 	if (!match_op(token, '(')) {
 		sparse_error(token->pos, "expected '(' after _Alignas");
 		return token;
@@ -1986,6 +2017,9 @@ static struct token *handle_bitfield(struct token *token, struct decl_state *ctx
 	}
 
 	bitfield = alloc_indirect_symbol(token->pos, ctype, SYM_BITFIELD);
+	if (ctx->has_alignas)
+		sparse_error(token->pos, "alignment specified for bitfield '%s'",
+			show_ident(*ctx->ident));
 	token = conditional_expression(token->next, &expr);
 	width = const_expression_value(expr);
 	bitfield->bit_size = width;
@@ -2042,6 +2076,11 @@ static struct token *declaration_list(struct token *token, struct symbol_list **
 		decl->ctype.modifiers |= mod;
 		decl->cleanup = ctx.cleanup;
 		decl->endpos = token->pos;
+		if (decl->ctype.modifiers & MOD_TLS)
+			sparse_error(
+				decl->pos,
+				"struct or union member '%s' cannot be thread-local",
+				show_ident(decl->ident));
 		add_symbol(list, decl);
 		if (!match_op(token, ','))
 			break;
@@ -2054,7 +2093,9 @@ static struct token *declaration_list(struct token *token, struct symbol_list **
 static struct token *struct_declaration_list(struct token *token, struct symbol_list **list)
 {
 	while (!match_op(token, '}')) {
-		if (match_ident(token, &_Static_assert_ident)) {
+		if (match_ident(token, &_Static_assert_ident) ||
+		    (standard >= STANDARD_C23 &&
+		     match_ident(token, &static_assert_ident))) {
 			token = parse_static_assert(token, NULL);
 			continue;
 		}
@@ -2082,6 +2123,14 @@ static struct token *parameter_declaration(struct token *token, struct symbol *s
 	sym->ctype.modifiers |= decl_modifiers(&ctx);
 	sym->endpos = token->pos;
 	sym->forced_arg = ctx.forced;
+	if (ctx.has_alignas)
+		sparse_error(sym->pos,
+			     "alignment specified for parameter '%s'",
+			     show_ident(sym->ident));
+	if (sym->ctype.modifiers & MOD_TLS)
+		sparse_error(sym->pos,
+			     "parameter '%s' cannot be thread-local",
+			     show_ident(sym->ident));
 	return token;
 }
 
@@ -2092,6 +2141,8 @@ struct token *typename(struct token *token, struct symbol **p, int *forced)
 	struct symbol *sym = alloc_symbol(token->pos, SYM_NODE);
 	*p = sym;
 	token = declaration_specifiers(token, &ctx);
+	if (ctx.has_alignas)
+		sparse_error(sym->pos, "alignment specified for type name");
 	token = declarator(token, &ctx);
 	apply_modifiers(token->pos, &ctx);
 	sym->ctype = ctx.ctype;
@@ -2654,7 +2705,9 @@ static struct token * statement_list(struct token *token, struct statement_list
 			break;
 		if (match_op(token, '}'))
 			break;
-		if (match_ident(token, &_Static_assert_ident)) {
+		if (match_ident(token, &_Static_assert_ident) ||
+		    (standard >= STANDARD_C23 &&
+		     match_ident(token, &static_assert_ident))) {
 			token = parse_static_assert(token, NULL);
 			continue;
 		}
@@ -3104,6 +3157,16 @@ struct token *external_declaration(struct token *token, struct symbol_list **lis
 		decl->ctype.modifiers |= ctx.f_modifiers;
 
 		/* K&R argument declaration? */
+		if (lookup_type(token) || match_op(token, '{')) {
+			if (ctx.has_alignas)
+				sparse_error(decl->pos,
+					     "alignment specified for function '%s'",
+					     show_ident(decl->ident));
+			if (decl->ctype.modifiers & MOD_TLS)
+				sparse_error(decl->pos,
+					     "function '%s' cannot be thread-local",
+					     show_ident(decl->ident));
+		}
 		if (lookup_type(token))
 			return parse_k_r_arguments(token, decl, list);
 		if (match_op(token, '{'))
@@ -3167,6 +3230,35 @@ struct token *external_declaration(struct token *token, struct symbol_list **lis
 			}
 		}
 
+		if (ctx.has_alignas) {
+			if (is_typedef)
+				sparse_error(decl->pos,
+					     "alignment specified for typedef '%s'",
+					     show_ident(decl->ident));
+			else if (decl->ctype.base_type &&
+				 decl->ctype.base_type->type == SYM_FN)
+				sparse_error(decl->pos,
+					     "alignment specified for function '%s'",
+					     show_ident(decl->ident));
+			else if (decl->ctype.modifiers & MOD_REGISTER)
+				sparse_error(decl->pos,
+					     "alignment specified for 'register' object '%s'",
+					     show_ident(decl->ident));
+		}
+
+		if (!is_typedef && (decl->ctype.modifiers & MOD_TLS)) {
+			if (decl->ctype.base_type &&
+			    decl->ctype.base_type->type == SYM_FN)
+				sparse_error(decl->pos,
+					     "function '%s' cannot be thread-local",
+					     show_ident(decl->ident));
+			else if (!(decl->ctype.modifiers &
+				   (MOD_TOPLEVEL | MOD_STATIC | MOD_EXTERN)))
+				sparse_error(decl->pos,
+					     "thread-local variable '%s' at block scope must be 'static' or 'extern'",
+					     show_ident(decl->ident));
+		}
+
 		if (!match_op(token, ','))
 			break;
 
diff --git a/parse.h b/parse.h
index e7ea3642b65c..6a528bc8ca4d 100644
--- a/parse.h
+++ b/parse.h
@@ -139,6 +139,7 @@ extern struct symbol *ctype_integer(int size, int want_unsigned);
 extern int inline_function(struct expression *expr, struct symbol *sym);
 extern void uninline(struct symbol *sym);
 extern void init_parser(int);
+extern void init_parser_finalize(void);
 
 struct token *expect(struct token *, int, const char *);
 
diff --git a/symbol.h b/symbol.h
index a14686fe863b..2c6731f88399 100644
--- a/symbol.h
+++ b/symbol.h
@@ -115,6 +115,7 @@ struct decl_state {
 	unsigned char autotype;
 	unsigned char forced;
 	unsigned char packed;
+	unsigned char has_alignas;
 	unsigned char designated_init;
 	unsigned char transparent_union;
 };
@@ -199,6 +200,7 @@ struct symbol {
 					torename:1,
 					packed:1,
 					transparent_union:1;
+			unsigned int has_alignas : 1;
 			int		rank:3;	// arithmetic's rank
 			struct expression *array_size;
 			struct ctype ctype;
diff --git a/validation/c11-c23-keywords-ident.c b/validation/c11-c23-keywords-ident.c
new file mode 100644
index 000000000000..8fdb011268e4
--- /dev/null
+++ b/validation/c11-c23-keywords-ident.c
@@ -0,0 +1,19 @@
+static int test_c11_idents(void)
+{
+	int alignas = 1;
+	int alignof = 2;
+	int static_assert = 3;
+	int thread_local = 4;
+	int bool = 5;
+	int true = 6;
+	int false = 7;
+	int nullptr = 8;
+
+	return alignas + alignof + static_assert + thread_local +
+	       bool + true + false + nullptr;
+}
+
+/*
+ * check-name: c11-c23-keywords-ident
+ * check-command: sparse -std=c11 $file
+ */
diff --git a/validation/c23-alignof-pedantic.c b/validation/c23-alignof-pedantic.c
new file mode 100644
index 000000000000..d17eabb79108
--- /dev/null
+++ b/validation/c23-alignof-pedantic.c
@@ -0,0 +1,20 @@
+static int test(void)
+{
+	alignas(8) int x = 0;
+	int a = alignof(int);
+	int b = alignof(x);
+	int c = _Alignof(x);
+	int d = __alignof__(x);
+	int e = __alignof(x);
+	return a + b + c + d + e;
+}
+
+/*
+ * check-name: c23-alignof-pedantic
+ * check-command: sparse -std=c23 -pedantic $file
+ *
+ * check-error-start
+c23-alignof-pedantic.c:5:17: warning: ISO C does not allow 'alignof' on an expression
+c23-alignof-pedantic.c:6:17: warning: ISO C does not allow '_Alignof' on an expression
+ * check-error-end
+ */
diff --git a/validation/c23-keywords-error.c b/validation/c23-keywords-error.c
new file mode 100644
index 000000000000..25d3adac3ce8
--- /dev/null
+++ b/validation/c23-keywords-error.c
@@ -0,0 +1,48 @@
+static_assert(0);
+static_assert(0, "must fail");
+
+typedef alignas(8) int bad_typedef;
+
+struct bf {
+	alignas(4) unsigned int x : 2;
+};
+
+static void bad_param(alignas(8) int p)
+{
+	(void)p;
+}
+
+static void bad_fn_locals(void)
+{
+	thread_local int local_tl = 0;
+	register alignas(8) int reg_a = 0;
+	int sz = sizeof(alignas(8) int);
+	(void)local_tl;
+	(void)reg_a;
+	(void)sz;
+}
+
+static int (alignas);
+static int (alignof);
+static int (static_assert);
+static int (thread_local);
+
+/*
+ * check-name: c23-keywords-error
+ * check-command: sparse -std=c23 -Wno-decl $file
+ *
+ * check-error-start
+c23-keywords-error.c:1:15: error: static assertion failed
+c23-keywords-error.c:2:15: error: static assertion failed: "must fail"
+c23-keywords-error.c:4:24: error: alignment specified for typedef 'bad_typedef'
+c23-keywords-error.c:7:35: error: alignment specified for bitfield 'x'
+c23-keywords-error.c:10:23: error: alignment specified for parameter 'p'
+c23-keywords-error.c:17:26: error: thread-local variable 'local_tl' at block scope must be 'static' or 'extern'
+c23-keywords-error.c:18:33: error: alignment specified for 'register' object 'reg_a'
+c23-keywords-error.c:19:25: error: alignment specified for type name
+c23-keywords-error.c:25:12: error: Trying to use reserved word 'alignas' as identifier
+c23-keywords-error.c:26:12: error: Trying to use reserved word 'alignof' as identifier
+c23-keywords-error.c:27:12: error: Trying to use reserved word 'static_assert' as identifier
+c23-keywords-error.c:28:12: error: Trying to use reserved word 'thread_local' as identifier
+ * check-error-end
+ */
diff --git a/validation/c23-keywords.c b/validation/c23-keywords.c
new file mode 100644
index 000000000000..a6f44a735c7e
--- /dev/null
+++ b/validation/c23-keywords.c
@@ -0,0 +1,30 @@
+static_assert(1);
+static_assert(1, "file scope");
+
+struct s {
+	static_assert(1);
+	static_assert(1, "struct scope");
+	alignas(16) int a;
+};
+
+static_assert(alignof(struct s) == 16);
+
+thread_local int tl;
+alignas(double) static int aligned_dbl;
+
+static int test(void)
+{
+	static_assert(1);
+	static_assert(1, "func scope");
+	alignas(8) int x = 0;
+	static thread_local int local_tl = 3;
+	extern thread_local int tl;
+	static_assert(alignof(int) <= 8);
+	static_assert(alignof(double) <= 16);
+	return x + tl + local_tl + aligned_dbl;
+}
+
+/*
+ * check-name: c23-keywords
+ * 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 ` Bart Van Assche [this message]
2026-11-09 20:32 ` [PATCH 43/73] c23: Add support for bool, true, and false keywords Bart Van Assche
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-43-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