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 10/73] parse, show-parse: Fix attribute propagation, enum overflow, and bounds
Date: Mon, 9 Nov 2026 12:31:56 -0800 [thread overview]
Message-ID: <20261109203259.362845-11-bvanassche@acm.org> (raw)
In-Reply-To: <20261109203259.362845-1-bvanassche@acm.org>
Fix parser attribute handling, enumerator overflow promotion, and type
formatting bounds in expression.c, parse.c, show-parse.c, and symbol.h:
- Reject invalid integer suffixes and missing _Generic association
expressions in expression.c.
- Propagate designated_init and transparent_union attributes on forward
and post-brace tag declarations, promote overflowing enumerators while
diagnosing ULLONG_MAX wraparound, validate alignment and address_space
bounds, transfer context attributes across pointer return types, and
guard null current_fn.
- Enlarge show-parse.c formatting buffers, reserve space for the trailing
NUL byte, and route all type formatting through prepend() and append()
with pointer-subtraction capacity checks.
- Add regression tests in validation/parser-type-fixes.c and
validation/parser-enum-overflow.c.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
expression.c | 16 +++++-
parse.c | 81 ++++++++++++++++++++++++---
show-parse.c | 61 ++++++++++++--------
symbol.h | 2 +
validation/parser-enum-overflow.c | 13 +++++
validation/parser-type-fixes.c | 93 +++++++++++++++++++++++++++++++
6 files changed, 233 insertions(+), 33 deletions(-)
create mode 100644 validation/parser-enum-overflow.c
create mode 100644 validation/parser-type-fixes.c
diff --git a/expression.c b/expression.c
index 727e7056e460..04b1a242d08a 100644
--- a/expression.c
+++ b/expression.c
@@ -290,8 +290,12 @@ static void get_number_value(struct expression *expr, struct token *token)
size = 2;
end++;
}
- } else
+ } else if (c == '.' || c == 'e' || c == 'E' || c == 'p' || c == 'P' ||
+ strchr(end, '.') || strchr(end, 'e') || strchr(end, 'E')) {
goto Float;
+ } else {
+ goto Enoint;
+ }
}
if (overflow)
goto Eoverflow;
@@ -402,8 +406,12 @@ static struct token *generic_selection(struct token *token, struct expression **
token = typename(token, &map->type, NULL);
token = expect(token, ':', "after typename");
token = assignment_expression(token, &map->expr);
- *last = map;
- last = &map->next;
+ if (!map->expr)
+ sparse_error(token->pos, "expected expression after ':'");
+ else {
+ *last = map;
+ last = &map->next;
+ }
} else if (match_ident(token, &default_ident)) {
if (expr->def) {
warning(token->pos, "multiple default in generic expression");
@@ -412,6 +420,8 @@ static struct token *generic_selection(struct token *token, struct expression **
token = token->next;
token = expect(token, ':', "after typename");
token = assignment_expression(token, &expr->def);
+ if (!expr->def)
+ sparse_error(token->pos, "expected expression after ':'");
}
}
end:
diff --git a/parse.c b/parse.c
index f349cc75bff4..ea90d088a244 100644
--- a/parse.c
+++ b/parse.c
@@ -753,8 +753,21 @@ static struct token *struct_union_enum_specifier(enum type type,
ctx->ctype.base_type = sym;
repos = &token->pos;
token = token->next;
- if (!match_op(token, '{'))
+ if (!match_op(token, '{')) {
+ if (attr.designated_init) {
+ if (sym->type == SYM_STRUCT)
+ sym->designated_init = 1;
+ else
+ warning(token->pos, "attribute designated_init applied to non-structure type");
+ }
+ if (attr.transparent_union) {
+ if (sym->type == SYM_UNION)
+ sym->transparent_union = 1;
+ else
+ warning(token->pos, "attribute __transparent_union__ applied to non-union type");
+ }
return token;
+ }
// The following test is actually wrong for empty
// structs, but (1) they are not C99, (2) gcc does
@@ -782,6 +795,18 @@ static struct token *struct_union_enum_specifier(enum type type,
token = handle_attributes(token, &attr);
apply_ctype(token->pos, &sym->ctype, &attr.ctype);
sym->packed = attr.packed;
+ if (attr.designated_init) {
+ if (sym->type == SYM_STRUCT)
+ sym->designated_init = 1;
+ else
+ warning(token->pos, "attribute designated_init applied to non-structure type");
+ }
+ if (attr.transparent_union) {
+ if (sym->type == SYM_UNION)
+ sym->transparent_union = 1;
+ else
+ warning(token->pos, "attribute __transparent_union__ applied to non-union type");
+ }
sym->endpos = token->pos;
@@ -935,6 +960,7 @@ static struct token *parse_enum_declaration(struct token *token, struct symbol *
struct token *next = token->next;
struct decl_state ctx = { };
struct symbol *sym;
+ bool overflow = false;
// FIXME: only 'deprecated' should be accepted
next = handle_attributes(next, &ctx);
@@ -948,14 +974,41 @@ static struct token *parse_enum_declaration(struct token *token, struct symbol *
} else if (!ctype) {
ctype = &int_ctype;
} else if (is_int_type(ctype)) {
- lastval++;
+ struct range crange = type_range(ctype);
+ if (is_signed_type(ctype) && (long long)lastval == crange.pos) {
+ if (ctype->bit_size < bits_in_int)
+ ctype = &int_ctype;
+ else if (ctype->bit_size < bits_in_long)
+ ctype = &long_ctype;
+ else if (ctype->bit_size < bits_in_longlong)
+ ctype = &llong_ctype;
+ else
+ ctype = &ullong_ctype;
+ } else if (!is_signed_type(ctype) && lastval == crange.pos) {
+ if (ctype->bit_size < bits_in_int - 1)
+ ctype = &int_ctype;
+ else if (ctype->bit_size < bits_in_int)
+ ctype = &uint_ctype;
+ else if (ctype->bit_size < bits_in_long)
+ ctype = &ulong_ctype;
+ else if (ctype->bit_size < bits_in_longlong)
+ ctype = &ullong_ctype;
+ else {
+ sparse_error(token->pos,
+ "enumerator value for '%s' overflows",
+ show_ident(token->ident));
+ overflow = true;
+ }
+ }
+ if (!overflow)
+ lastval++;
} else {
error_die(token->pos, "can't increment the last enum member");
}
if (!expr) {
expr = alloc_expression(token->pos, EXPR_VALUE);
- expr->value = lastval;
+ expr->value = lastval & bits_mask(ctype->bit_size);
expr->ctype = ctype;
}
@@ -1135,7 +1188,7 @@ static struct token *attribute_packed(struct token *token, struct symbol *attr,
static struct token *attribute_aligned(struct token *token, struct symbol *attr, struct decl_state *ctx)
{
- int alignment = max_alignment;
+ long long alignment = max_alignment;
struct expression *expr = NULL;
if (match_op(token, '(')) {
@@ -1143,7 +1196,7 @@ static struct token *attribute_aligned(struct token *token, struct symbol *attr,
if (expr)
alignment = const_expression_value(expr);
}
- if (alignment & (alignment-1)) {
+ if (alignment <= 0 || alignment > INT_MAX || (alignment & (alignment - 1))) {
warning(token->pos, "I don't like non-power-of-2 alignments");
return token;
} else if (alignment > ctx->ctype.alignment)
@@ -1222,7 +1275,7 @@ static struct token *attribute_address_space(struct token *token, struct symbol
switch (token_type(token)) {
case TOKEN_NUMBER:
next = primary_expression(token, &expr);
- if (expr->type != EXPR_VALUE)
+ if (expr->type != EXPR_VALUE || expr->value > INT_MAX)
goto invalid;
as = numerical_address_space(expr->value);
break;
@@ -1351,6 +1404,8 @@ static struct token *attribute_designated_init(struct token *token, struct symbo
{
if (ctx->ctype.base_type && ctx->ctype.base_type->type == SYM_STRUCT)
ctx->ctype.base_type->designated_init = 1;
+ else if (!ctx->ctype.base_type)
+ ctx->designated_init = 1;
else
warning(token->pos, "attribute designated_init applied to non-structure type");
return token;
@@ -1363,6 +1418,8 @@ static struct token *attribute_transparent_union(struct token *token, struct sym
if (ctx->ctype.base_type && ctx->ctype.base_type->type == SYM_UNION)
ctx->ctype.base_type->transparent_union = 1;
+ else if (!ctx->ctype.base_type)
+ ctx->transparent_union = 1;
else
warning(token->pos, "attribute __transparent_union__ applied to non-union type");
return token;
@@ -1856,9 +1913,16 @@ static struct token *direct_declarator(struct token *token, struct decl_state *c
if (match_op(token, '(')) {
enum kind kind = which_func(token, p, ctx->prefer_abstract);
- struct symbol *fn;
+ struct symbol *fn, *walk;
fn = alloc_indirect_symbol(token->pos, ctype, SYM_FN);
ctype->modifiers |= ctx->f_modifiers;
+ for (walk = fn->ctype.base_type; walk && walk->type == SYM_PTR; walk = walk->ctype.base_type) {
+ if (walk->ctype.contexts) {
+ concat_ptr_list((struct ptr_list *)walk->ctype.contexts,
+ (struct ptr_list **)&ctype->contexts);
+ walk->ctype.contexts = NULL;
+ }
+ }
token = token->next;
if (kind == K_R)
token = identifier_list(token, fn);
@@ -2440,7 +2504,8 @@ static void warn_label_usage(struct position def, struct position use, struct id
const char *id = show_ident(ident);
sparse_error(use, "label '%s' used outside statement expression", id);
info(def, " label '%s' defined here", id);
- current_fn->bogus_linear = 1;
+ if (current_fn)
+ current_fn->bogus_linear = 1;
}
void check_label_usage(struct symbol *label, struct position use_pos)
diff --git a/show-parse.c b/show-parse.c
index ceb6b3cb6f82..8ef59b5ee255 100644
--- a/show-parse.c
+++ b/show-parse.c
@@ -204,17 +204,27 @@ const char *show_as(struct ident *as)
struct type_name {
char *start;
char *end;
+ char *buf_start;
+ char *buf_end;
};
static void FORMAT_ATTR(2) prepend(struct type_name *name, const char *fmt, ...)
{
- static char buffer[512];
+ static char buffer[4096];
int n;
va_list args;
va_start(args, fmt);
- n = vsprintf(buffer, fmt, args);
+ n = vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args);
+ if (n <= 0)
+ return;
+ if (n >= sizeof(buffer))
+ n = sizeof(buffer) - 1;
+ if (n > name->start - name->buf_start)
+ n = name->start - name->buf_start;
+ if (n <= 0)
+ return;
name->start -= n;
memcpy(name->start, buffer, n);
@@ -222,13 +232,21 @@ static void FORMAT_ATTR(2) prepend(struct type_name *name, const char *fmt, ...)
static void FORMAT_ATTR(2) append(struct type_name *name, const char *fmt, ...)
{
- static char buffer[512];
+ static char buffer[4096];
int n;
va_list args;
va_start(args, fmt);
- n = vsprintf(buffer, fmt, args);
+ n = vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args);
+ if (n <= 0)
+ return;
+ if (n >= sizeof(buffer))
+ n = sizeof(buffer) - 1;
+ if (n > name->buf_end - name->end)
+ n = name->buf_end - name->end;
+ if (n <= 0)
+ return;
memcpy(name->end, buffer, n);
name->end += n;
@@ -314,17 +332,14 @@ deeper:
if (sym && (sym->type != SYM_NODE && sym->type != SYM_ARRAY &&
sym->type != SYM_BITFIELD)) {
const char *s;
- size_t len;
if (as)
prepend(name, "%s ", show_as(as));
- if (sym && (sym->type == SYM_BASETYPE || sym->type == SYM_ENUM))
+ if (sym->type == SYM_BASETYPE || sym->type == SYM_ENUM)
mod &= ~MOD_SPECIFIER;
s = modifier_string(mod);
- len = strlen(s);
- name->start -= len;
- memcpy(name->start, s, len);
+ prepend(name, "%s", s);
mod = 0;
as = NULL;
}
@@ -333,11 +348,9 @@ deeper:
goto out;
if ((typename = builtin_typename(sym))) {
- int len = strlen(typename);
if (name->start != name->end)
- *--name->start = ' ';
- name->start -= len;
- memcpy(name->start, typename, len);
+ prepend(name, " ");
+ prepend(name, "%s", typename);
goto out;
}
@@ -362,13 +375,13 @@ deeper:
case SYM_STRUCT:
if (name->start != name->end)
- *--name->start = ' ';
+ prepend(name, " ");
prepend(name, "struct %s", show_ident(sym->ident));
goto out;
case SYM_UNION:
if (name->start != name->end)
- *--name->start = ' ';
+ prepend(name, " ");
prepend(name, "union %s", show_ident(sym->ident));
goto out;
@@ -401,7 +414,7 @@ deeper:
append(name, " )");
was_ptr = 0;
}
- append(name, "[%lld]", get_expression_value(sym->array_size));
+ append(name, "[%lld]", get_expression_value_silent(sym->array_size));
break;
case SYM_RESTRICT:
@@ -410,7 +423,7 @@ deeper:
break;
}
if (name->start != name->end)
- *--name->start = ' ';
+ prepend(name, " ");
prepend(name, "restricted %s", show_ident(sym->ident));
goto out;
@@ -420,7 +433,7 @@ deeper:
default:
if (name->start != name->end)
- *--name->start = ' ';
+ prepend(name, " ");
prepend(name, "unknown type %d", sym->type);
goto out;
}
@@ -441,10 +454,12 @@ out:
void show_type(struct symbol *sym)
{
- char array[200];
+ char array[8192];
struct type_name name;
- name.start = name.end = array+100;
+ name.start = name.end = array + 4096;
+ name.buf_start = array;
+ name.buf_end = array + sizeof(array) - 1;
do_show_type(sym, &name);
*name.end = 0;
printf("%s", name.start);
@@ -452,10 +467,12 @@ void show_type(struct symbol *sym)
const char *show_typename(struct symbol *sym)
{
- static char array[200];
+ static char array[8192];
struct type_name name;
- name.start = name.end = array+100;
+ name.start = name.end = array + 4096;
+ name.buf_start = array;
+ name.buf_end = array + sizeof(array) - 1;
do_show_type(sym, &name);
*name.end = 0;
return name.start;
diff --git a/symbol.h b/symbol.h
index 9d657fbba260..9a8e58d5da28 100644
--- a/symbol.h
+++ b/symbol.h
@@ -115,6 +115,8 @@ struct decl_state {
unsigned char autotype;
unsigned char forced;
unsigned char packed;
+ unsigned char designated_init;
+ unsigned char transparent_union;
};
struct pseudo;
diff --git a/validation/parser-enum-overflow.c b/validation/parser-enum-overflow.c
new file mode 100644
index 000000000000..3e72a56b9e50
--- /dev/null
+++ b/validation/parser-enum-overflow.c
@@ -0,0 +1,13 @@
+enum {
+ E_ULLMAX = ~0ULL,
+ E_ULL_OVERFLOW,
+};
+
+/*
+ * check-name: parser-enum-overflow
+ * check-command: sparse $file
+ *
+ * check-error-start
+parser-enum-overflow.c:3:9: error: enumerator value for 'E_ULL_OVERFLOW' overflows
+ * check-error-end
+ */
diff --git a/validation/parser-type-fixes.c b/validation/parser-type-fixes.c
new file mode 100644
index 000000000000..dafcdd4a3f75
--- /dev/null
+++ b/validation/parser-type-fixes.c
@@ -0,0 +1,93 @@
+/* 1. designated_init propagation on forward and post-brace declarations */
+struct __attribute__((designated_init)) s_fwd;
+struct s_fwd {
+ int a;
+ int b;
+};
+static struct s_fwd fwd_pos = { 1, 2 };
+static struct s_fwd fwd_des = { .a = 1, .b = 2 };
+
+struct s_post {
+ int a;
+ int b;
+} __attribute__((designated_init));
+static struct s_post post_pos = { 3, 4 };
+static struct s_post post_des = { .a = 3, .b = 4 };
+
+/* 2. transparent_union propagation on forward and post-brace declarations */
+union __attribute__((__transparent_union__)) u_fwd;
+union u_fwd {
+ int *ip;
+ long *lp;
+};
+void take_u_fwd(union u_fwd u);
+
+union u_post {
+ int *ip;
+ long *lp;
+} __attribute__((__transparent_union__));
+void take_u_post(union u_post u);
+
+void call_transparent(int *ip, long *lp)
+{
+ take_u_fwd(ip);
+ take_u_fwd(lp);
+ take_u_post(ip);
+ take_u_post(lp);
+}
+
+/* 3. Function context attribute transferred through pointer return type */
+int *acquire_ptr(void) __attribute__((context(0, 1)));
+
+void good_context(void)
+{
+ (void)acquire_ptr();
+ __context__(-1);
+}
+
+void bad_context(void)
+{
+ (void)acquire_ptr();
+}
+
+/* 4. typeof on restrict-qualified pointer */
+void typeof_restrict(int * restrict p)
+{
+ typeof(p) q = p;
+ (void)q;
+}
+
+/* 5. Sub-int enum auto-increment promotes to int before long/ulong */
+enum {
+ E_SCHAR = (signed char)127,
+ E_SCHAR_NEXT,
+ E_SHRT = (short)32767,
+ E_SHRT_NEXT,
+ E_UCHAR = (unsigned char)255,
+ E_UCHAR_NEXT,
+};
+_Static_assert(E_SCHAR_NEXT == 128, "schar + 1");
+_Static_assert(__builtin_types_compatible_p(typeof(E_SCHAR_NEXT), int), "schar + 1 is int");
+_Static_assert(E_SHRT_NEXT == 32768, "short + 1");
+_Static_assert(__builtin_types_compatible_p(typeof(E_SHRT_NEXT), int), "short + 1 is int");
+_Static_assert(E_UCHAR_NEXT == 256, "uchar + 1");
+_Static_assert(__builtin_types_compatible_p(typeof(E_UCHAR_NEXT), int), "uchar + 1 is int");
+
+/* 6. Out-of-range address_space and aligned warnings */
+int __attribute__((address_space(0x100000000ULL))) *bad_as;
+int __attribute__((aligned(0x100000000ULL))) bad_align;
+
+/*
+ * check-name: parser-type-fixes
+ * check-command: sparse -Wno-decl $file
+ *
+ * check-error-start
+parser-type-fixes.c:77:34: warning: invalid address space name
+parser-type-fixes.c:78:43: warning: I don't like non-power-of-2 alignments
+parser-type-fixes.c:7:33: warning: in initializer for fwd_pos: positional init of field in struct s_fwd, declared with attribute designated_init
+parser-type-fixes.c:7:36: warning: in initializer for fwd_pos: positional init of field in struct s_fwd, declared with attribute designated_init
+parser-type-fixes.c:14:35: warning: in initializer for post_pos: positional init of field in struct s_post, declared with attribute designated_init
+parser-type-fixes.c:14:38: warning: in initializer for post_pos: positional init of field in struct s_post, declared with attribute designated_init
+parser-type-fixes.c:48:6: warning: context imbalance in 'bad_context' - wrong count at exit
+ * check-error-end
+ */
next prev 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 ` Bart Van Assche [this message]
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 ` [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-11-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