Module Name: src Committed By: rillig Date: Thu May 9 11:08:07 UTC 2024
Modified Files: src/tests/usr.bin/xlint/lint1: c23.c src/usr.bin/xlint/lint1: cgram.y debug.c externs1.h lex.c lint1.h Log Message: lint: in C23 mode, support the nullptr constant To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/tests/usr.bin/xlint/lint1/c23.c cvs rdiff -u -r1.495 -r1.496 src/usr.bin/xlint/lint1/cgram.y cvs rdiff -u -r1.77 -r1.78 src/usr.bin/xlint/lint1/debug.c cvs rdiff -u -r1.224 -r1.225 src/usr.bin/xlint/lint1/externs1.h \ src/usr.bin/xlint/lint1/lex.c cvs rdiff -u -r1.225 -r1.226 src/usr.bin/xlint/lint1/lint1.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/usr.bin/xlint/lint1/c23.c diff -u src/tests/usr.bin/xlint/lint1/c23.c:1.10 src/tests/usr.bin/xlint/lint1/c23.c:1.11 --- src/tests/usr.bin/xlint/lint1/c23.c:1.10 Tue May 7 21:13:27 2024 +++ src/tests/usr.bin/xlint/lint1/c23.c Thu May 9 11:08:07 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: c23.c,v 1.10 2024/05/07 21:13:27 rillig Exp $ */ +/* $NetBSD: c23.c,v 1.11 2024/05/09 11:08:07 rillig Exp $ */ # 3 "c23.c" // Tests for the option -Ac23, which allows features from C23 and all earlier @@ -28,6 +28,20 @@ c99_bool_is_still_valid_in_c23(void) } +bool +null_pointer_constant(const char *p, double dbl) +{ + /* expect+1: error: operands of '!=' have incompatible types 'double' and 'pointer to void' [107] */ + if (dbl != nullptr) + p++; + if (dbl > 0.0) + p++; + if (*p == '\0') + p = nullptr; + return p == nullptr; +} + + int empty_initializer_braces(void) { Index: src/usr.bin/xlint/lint1/cgram.y diff -u src/usr.bin/xlint/lint1/cgram.y:1.495 src/usr.bin/xlint/lint1/cgram.y:1.496 --- src/usr.bin/xlint/lint1/cgram.y:1.495 Fri May 3 04:04:17 2024 +++ src/usr.bin/xlint/lint1/cgram.y Thu May 9 11:08:07 2024 @@ -1,5 +1,5 @@ %{ -/* $NetBSD: cgram.y,v 1.495 2024/05/03 04:04:17 rillig Exp $ */ +/* $NetBSD: cgram.y,v 1.496 2024/05/09 11:08:07 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: cgram.y,v 1.495 2024/05/03 04:04:17 rillig Exp $"); +__RCSID("$NetBSD: cgram.y,v 1.496 2024/05/09 11:08:07 rillig Exp $"); #endif #include <limits.h> @@ -140,6 +140,7 @@ is_either(const char *s, const char *a, array_size y_array_size; bool y_in_system_header; designation y_designation; + named_constant y_named_constant; }; /* for Bison: @@ -199,6 +200,7 @@ is_either(const char *s, const char *a, fprintf(yyo, "<scalar>"); } } <y_designation> +%printer { fprintf(yyo, "%s", named_constant_name($$)); } <y_named_constant> */ %token T_LBRACE T_RBRACE T_LBRACK T_RBRACK T_LPAREN T_RPAREN @@ -287,6 +289,7 @@ is_either(const char *s, const char *a, %token <y_name> T_NAME %token <y_name> T_TYPENAME %token <y_val> T_CON +%token <y_named_constant> T_NAMED_CONSTANT %token <y_string> T_STRING /* No type for program. */ @@ -484,6 +487,25 @@ primary_expression: | T_CON { $$ = build_constant(gettyp($1->v_tspec), $1); } +| T_NAMED_CONSTANT { + if ($1 == NC_NULLPTR) { + tnode_t *zero = expr_alloc_tnode(); + zero->tn_op = CON; + zero->tn_type = gettyp(INT); + zero->u.value.v_tspec = INT; + + type_t *void_ptr = block_derive_type(gettyp(VOID), PTR); + $$ = convert(CVT, 0, void_ptr, zero); + $$->tn_sys = zero->tn_sys; + } else { + tnode_t *nc = expr_alloc_tnode(); + nc->tn_op = CON; + nc->tn_type = gettyp(BOOL); + nc->u.value.v_tspec = BOOL; + nc->u.value.u.integer = $1 == NC_TRUE ? 1 : 0; + $$ = nc; + } + } | string { $$ = build_string($1); } Index: src/usr.bin/xlint/lint1/debug.c diff -u src/usr.bin/xlint/lint1/debug.c:1.77 src/usr.bin/xlint/lint1/debug.c:1.78 --- src/usr.bin/xlint/lint1/debug.c:1.77 Fri May 3 04:04:17 2024 +++ src/usr.bin/xlint/lint1/debug.c Thu May 9 11:08:07 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: debug.c,v 1.77 2024/05/03 04:04:17 rillig Exp $ */ +/* $NetBSD: debug.c,v 1.78 2024/05/09 11:08:07 rillig Exp $ */ /*- * Copyright (c) 2021 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: debug.c,v 1.77 2024/05/03 04:04:17 rillig Exp $"); +__RCSID("$NetBSD: debug.c,v 1.78 2024/05/09 11:08:07 rillig Exp $"); #endif #include <stdlib.h> @@ -361,6 +361,18 @@ function_specifier_name(function_specifi return name[spec]; } +const char * +named_constant_name(named_constant nc) +{ + static const char *const name[] = { + "false", + "true", + "nullptr", + }; + + return name[nc]; +} + static void debug_word(bool flag, const char *name) { Index: src/usr.bin/xlint/lint1/externs1.h diff -u src/usr.bin/xlint/lint1/externs1.h:1.224 src/usr.bin/xlint/lint1/externs1.h:1.225 --- src/usr.bin/xlint/lint1/externs1.h:1.224 Fri May 3 04:04:18 2024 +++ src/usr.bin/xlint/lint1/externs1.h Thu May 9 11:08:07 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: externs1.h,v 1.224 2024/05/03 04:04:18 rillig Exp $ */ +/* $NetBSD: externs1.h,v 1.225 2024/05/09 11:08:07 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -136,6 +136,7 @@ const char *scl_name(scl_t); const char *symbol_kind_name(symbol_kind); const char *type_qualifiers_string(type_qualifiers); const char *function_specifier_name(function_specifier); +const char *named_constant_name(named_constant); void debug_dcs(void); void debug_dcs_all(void); void debug_node(const tnode_t *); Index: src/usr.bin/xlint/lint1/lex.c diff -u src/usr.bin/xlint/lint1/lex.c:1.224 src/usr.bin/xlint/lint1/lex.c:1.225 --- src/usr.bin/xlint/lint1/lex.c:1.224 Tue May 7 21:13:26 2024 +++ src/usr.bin/xlint/lint1/lex.c Thu May 9 11:08:07 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lex.c,v 1.224 2024/05/07 21:13:26 rillig Exp $ */ +/* $NetBSD: lex.c,v 1.225 2024/05/09 11:08:07 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: lex.c,v 1.224 2024/05/07 21:13:26 rillig Exp $"); +__RCSID("$NetBSD: lex.c,v 1.225 2024/05/09 11:08:07 rillig Exp $"); #endif #include <ctype.h> @@ -97,8 +97,9 @@ bool in_system_header; kwdef(name, T_TYPE, .u.kw_tspec = (tspec), since, 0, 1) #define kwdef_tqual(name, tqual, since, gcc, deco) \ kwdef(name, T_QUAL, .u.kw_tqual = {.tqual = true}, since, gcc, deco) -#define kwdef_const(name, constant, since, gcc, deco) \ - kwdef(name, T_CON, .u.kw_const = (constant), since, gcc, deco) +#define kwdef_const(name, named_constant, since, gcc, deco) \ + kwdef(name, T_NAMED_CONSTANT, \ + .u.kw_named_constant = (named_constant), since, gcc, deco) #define kwdef_keyword(name, token) \ kwdef(name, token, {false}, 78, 0, 1) @@ -114,7 +115,7 @@ static const struct keyword { type_qualifiers kw_tqual; /* if kw_token is T_QUAL */ function_specifier kw_fs; /* if kw_token is * T_FUNCTION_SPECIFIER */ - named_constant kw_const; /* if kw_token is T_CON */ + named_constant kw_named_constant; } u; bool kw_added_in_c90:1; bool kw_added_in_c99_or_c11:1; @@ -165,6 +166,7 @@ static const struct keyword { #endif kwdef_type( "long", LONG, 78), kwdef("_Noreturn", T_FUNCTION_SPECIFIER, .u.kw_fs = FS_NORETURN, 11,0,1), + kwdef_const( "nullptr", NC_NULLPTR, 23,0,1), // XXX: __packed is GCC-specific. kwdef_token( "__packed", T_PACKED, 78,0,1), kwdef_token( "__real__", T_REAL, 78,1,1), @@ -374,8 +376,8 @@ register_keyword(const struct keyword *k sym->u.s_keyword.u.sk_type_qualifier = kw->u.kw_tqual; if (tok == T_FUNCTION_SPECIFIER) sym->u.s_keyword.u.function_specifier = kw->u.kw_fs; - if (tok == T_CON) - sym->u.s_keyword.u.constant = kw->u.kw_const; + if (tok == T_NAMED_CONSTANT) + sym->u.s_keyword.u.named_constant = kw->u.kw_named_constant; symtab_add(sym); } @@ -455,12 +457,8 @@ lex_keyword(sym_t *sym) if (tok == T_FUNCTION_SPECIFIER) yylval.y_function_specifier = sym->u.s_keyword.u.function_specifier; - if (tok == T_CON) { - val_t *v = xcalloc(1, sizeof(*v)); - v->v_tspec = BOOL; - v->u.integer = sym->u.s_keyword.u.constant == NC_TRUE ? 1 : 0; - yylval.y_val = v; - } + if (tok == T_NAMED_CONSTANT) + yylval.y_named_constant = sym->u.s_keyword.u.named_constant; return tok; } Index: src/usr.bin/xlint/lint1/lint1.h diff -u src/usr.bin/xlint/lint1/lint1.h:1.225 src/usr.bin/xlint/lint1/lint1.h:1.226 --- src/usr.bin/xlint/lint1/lint1.h:1.225 Tue May 7 21:13:26 2024 +++ src/usr.bin/xlint/lint1/lint1.h Thu May 9 11:08:07 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lint1.h,v 1.225 2024/05/07 21:13:26 rillig Exp $ */ +/* $NetBSD: lint1.h,v 1.226 2024/05/09 11:08:07 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -190,7 +190,7 @@ typedef enum { typedef enum { NC_FALSE, /* since C23 */ NC_TRUE, /* since C23 */ - // TODO: null_ptr + NC_NULLPTR, /* since C23 */ } named_constant; /* A type, variable, keyword; basically anything that has a name. */ @@ -240,7 +240,7 @@ struct sym { /* if T_FUNCTION_SPECIFIER */ function_specifier function_specifier; /* if T_CON */ - named_constant constant; + named_constant named_constant; } u; } s_keyword; sym_t *s_old_style_params; /* parameters in an old-style