Module Name: src Committed By: rillig Date: Wed May 1 12:36:56 UTC 2024
Modified Files: src/tests/usr.bin/xlint/lint1: decl.c decl_enum.c Log Message: tests/lint: test large enum constants and offsetof with array members To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/tests/usr.bin/xlint/lint1/decl.c cvs rdiff -u -r1.4 -r1.5 src/tests/usr.bin/xlint/lint1/decl_enum.c 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/decl.c diff -u src/tests/usr.bin/xlint/lint1/decl.c:1.28 src/tests/usr.bin/xlint/lint1/decl.c:1.29 --- src/tests/usr.bin/xlint/lint1/decl.c:1.28 Sun Jan 28 08:17:27 2024 +++ src/tests/usr.bin/xlint/lint1/decl.c Wed May 1 12:36:56 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: decl.c,v 1.28 2024/01/28 08:17:27 rillig Exp $ */ +/* $NetBSD: decl.c,v 1.29 2024/05/01 12:36:56 rillig Exp $ */ # 3 "decl.c" /* @@ -241,3 +241,24 @@ get_x(struct point3d { struct point3d_nu static struct point3d_number z; return arg.x.v + local.x.v + z.v; } + +// Expressions of the form '(size_t)&null_ptr->member' are used by several +// C implementations to implement the offsetof macro. Dereferencing a null +// pointer invokes undefined behavior, though, even in this form. +void +offsetof_on_array_member(void) +{ + struct s1 { + int padding, plain, arr[2]; + }; + + struct s2 { + unsigned int off_plain:(unsigned long)&((struct s1 *)0)->plain; + // FIXME: offsetof must work for array members as well. + /* expect+1: error: integral constant expression expected [55] */ + unsigned int off_arr:(unsigned long)&((struct s1 *)0)->arr; + // FIXME: offsetof must work for array members as well. + /* expect+1: error: integral constant expression expected [55] */ + unsigned int off_arr_element:(unsigned long)&((struct s1 *)0)->arr[0]; + }; +} Index: src/tests/usr.bin/xlint/lint1/decl_enum.c diff -u src/tests/usr.bin/xlint/lint1/decl_enum.c:1.4 src/tests/usr.bin/xlint/lint1/decl_enum.c:1.5 --- src/tests/usr.bin/xlint/lint1/decl_enum.c:1.4 Fri Jun 30 21:39:54 2023 +++ src/tests/usr.bin/xlint/lint1/decl_enum.c Wed May 1 12:36:56 2024 @@ -1,10 +1,22 @@ -/* $NetBSD: decl_enum.c,v 1.4 2023/06/30 21:39:54 rillig Exp $ */ +/* $NetBSD: decl_enum.c,v 1.5 2024/05/01 12:36:56 rillig Exp $ */ # 3 "decl_enum.c" /* * Tests for enum declarations. */ + +// Initializing an enum from a 64-bit value cuts off the upper bits. +// TIME_MIN thus gets truncated from 0x8000_0000_0000_0000 to 0. +// TIME_MAX thus gets truncated from 0x7fff_ffff_ffff_ffff to -1. +enum { + /* expect+1: warning: integral constant too large [56] */ + TIME_MIN = (long long)(1ULL << 63), + /* expect+1: warning: integral constant too large [56] */ + TIME_MAX = (long long)~(1ULL << 63), +}; + + /* cover 'enumerator_list: error' */ enum { /* expect+1: error: syntax error 'goto' [249] */