Module Name: src Committed By: rillig Date: Sun Aug 6 19:31:06 UTC 2023
Modified Files: src/distrib/sets/lists/tests: mi Added Files: src/tests/usr.bin/xlint/lint1: lang_level_c99.c Log Message: tests/lint: document how much of C99 lint already implements To generate a diff of this commit: cvs rdiff -u -r1.1285 -r1.1286 src/distrib/sets/lists/tests/mi cvs rdiff -u -r0 -r1.1 src/tests/usr.bin/xlint/lint1/lang_level_c99.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/sets/lists/tests/mi diff -u src/distrib/sets/lists/tests/mi:1.1285 src/distrib/sets/lists/tests/mi:1.1286 --- src/distrib/sets/lists/tests/mi:1.1285 Fri Aug 4 20:56:08 2023 +++ src/distrib/sets/lists/tests/mi Sun Aug 6 19:31:06 2023 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1285 2023/08/04 20:56:08 riastradh Exp $ +# $NetBSD: mi,v 1.1286 2023/08/06 19:31:06 rillig Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -6697,6 +6697,7 @@ ./usr/tests/usr.bin/xlint/lint1/init_braces.exp tests-obsolete obsolete,atf ./usr/tests/usr.bin/xlint/lint1/init_c90.c tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/xlint/lint1/init_c90.exp tests-obsolete obsolete,atf +./usr/tests/usr.bin/xlint/lint1/lang_level_c99.c tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/xlint/lint1/lex_char.c tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/xlint/lint1/lex_char.exp tests-obsolete obsolete,atf ./usr/tests/usr.bin/xlint/lint1/lex_char_uchar.c tests-usr.bin-tests compattestfile,atf Added files: Index: src/tests/usr.bin/xlint/lint1/lang_level_c99.c diff -u /dev/null src/tests/usr.bin/xlint/lint1/lang_level_c99.c:1.1 --- /dev/null Sun Aug 6 19:31:06 2023 +++ src/tests/usr.bin/xlint/lint1/lang_level_c99.c Sun Aug 6 19:31:06 2023 @@ -0,0 +1,317 @@ +/* $NetBSD: lang_level_c99.c,v 1.1 2023/08/06 19:31:06 rillig Exp $ */ +# 3 "lang_level_c99.c" + +/* + * Tests that are specific to the C99 language level, in particular, features + * that were added in C99. + * + * In the below comments, [-] means unsupported and [x] means supported. + */ + +/* lint1-flags: -S -w -X 351 */ + +/* C99 Foreword */ + +// [-] restricted character set support via digraphs and <iso646.h> +// +// Lint neither parses digraphs nor trigraphs. + +// [x] wide character library support in <wchar.h> and <wctype.h> +// +// On all supported platforms, 'wchar_t' == 'int'. + +const int wide_string[] = L"wide"; + +// [x] more precise aliasing rules via effective type +// +// Irrelevant, as lint does not check the runtime behavior. + +// [x] restricted pointers +// +// Can be parsed, are otherwise ignored. + +// [-] variable length arrays +// +// Variable length arrays are handled as if the number of elements in the array +// were always 1. + +/* FIXME: Parameter 'n' _is_ actually used. */ +/* expect+2: warning: parameter 'n' unused in function 'variable_length_arrays' [231] */ +unsigned long long +variable_length_arrays(int n) +{ + int vla[n]; + /* FIXME: The array dimension is not constant, but still negative. */ + /* expect+1: error: negative array dimension (-4) [20] */ + typedef int sizeof_vla[-(int)sizeof(vla)]; + return sizeof(vla); +} + +// [x] flexible array members +// +// Flexible array members are parsed but not validated thoroughly. + +void +flexible_array_members(void) +{ + struct { + int regular; + int flexible[]; + } s = { + 0, + // Flexible array member must not be initialized. Lint does + // not detect this, leaving the job to the C99 compiler. + { 1, 3, 4, } + }; + /* expect+1: error: negative array dimension (-4) [20] */ + typedef int sizeof_s[-(int)sizeof(s)]; +} + +// [x] static and type qualifiers in parameter array declarators +// +// Can be parsed, are otherwise ignored. + +// [-] complex (and imaginary) support in <complex.h> +// +// Lint does not keep track of which parts of a complex object are initialized. +// +// Lint does not support '_Imaginary'. + +// [x] type-generic math macros in <tgmath.h> +// +// Irrelevant, as lint only sees the preprocessed source code. + +// [x] the long long int type and library functions +// +// On all platforms supported by lint, 'long long' is 64 bits wide. The other +// fixed-width types are 'char', 'short', 'int' and (only on 64-bit platforms) +// '__int128_t'. +// +// The lint standard libraries -lstdc and -lposix do not contain the +// functions added in C99. + +/* expect+1: error: negative array dimension (-1) [20] */ +typedef int sizeof_char[-(int)sizeof(char)]; +/* expect+1: error: negative array dimension (-2) [20] */ +typedef int sizeof_short[-(int)sizeof(short)]; +/* expect+1: error: negative array dimension (-4) [20] */ +typedef int sizeof_int[-(int)sizeof(int)]; +/* expect+1: error: negative array dimension (-8) [20] */ +typedef int sizeof_long_long[-(int)sizeof(long long)]; + +// [x] increased minimum translation limits +// +// Irrelevant, as lint does not have any hard-coded limits. + +// [x] additional floating-point characteristics in <float.h> +// +// Lint has very limited support for floating point numbers, as it fully relies +// on the host platform. This is noticeable when cross-compiling between +// platforms with different size or representation of 'long double'. + +// [x] remove implicit int +// +// Lint parses old-style declarations and marks them as errors. + +// [x] reliable integer division +// +// The lint source code requires a C99 compiler, so when mapping the integer +// operations to those from the host platform, lint uses these. + +// [-] universal character names (\u and \U) +// +// No, as nothing in the NetBSD source tree uses this feature. + +// [-] extended identifiers +// +// No, as nothing in the NetBSD source tree uses this feature. + +// [x] hexadecimal floating-point constants and %a and %A printf/scanf +// conversion specifiers + +void pf(); /* no prototype parameters */ + +void +hexadecimal_floating_point_constants(void) +{ + double hex = 0x1.0p34; + pf("%s %a\n", "hex", hex); +} + +// [x] compound literals +// +// See d_c99_compound_literal_comma.c. + +// [x] designated initializers +// +// See d_c99_init.c. + +// [x] // comments +// +// Also supported in GCC mode. + +// [?] extended integer types and library functions in <inttypes.h> and +// <stdint.h> +// +// TODO + +// [x] remove implicit function declaration + +void +call_implicitly_declared_function(void) +{ + /* expect+1: error: function 'implicitly_declared_function' implicitly declared to return int [215] */ + implicitly_declared_function(0); +} + +// [x] preprocessor arithmetic done in intmax_t/uintmax_t +// +// Irrelevant, as lint only sees the preprocessed source code. + +// [x] mixed declarations and code + +// [x] new block scopes for selection and iteration statements + +// [?] integer constant type rules +// +// TODO + +// [?] integer promotion rules +// +// TODO + +// [x] macros with a variable number of arguments +// +// Irrelevant, as lint only sees the preprocessed source code. + +// [x] the vscanf family of functions in <stdio.h> and <wchar.h> +// +// Irrelevant, as typical C99 compilers already check these. + +// [x] additional math library functions in <math.h> +// +// Irrelevant, as lint does not check arithmetic expressions. +// +// Lint also does not generate its own standard library definition for libm. + +// [x] treatment of error conditions by math library functions +// (math_errhandling) +// +// Irrelevant, as lint does not check for error handling. + +// [x] floating-point environment access in <fenv.h> +// +// TODO + +// [x] IEC 60559 (also known as IEC 559 or IEEE arithmetic) support +// +// On platforms that conform to IEC 60559, lint performs the arithmetic +// operations accordingly. When cross-compiling on a vax host for other target +// platforms, no such support is available. + +// [x] trailing comma allowed in enum declaration +// +// Yes, see the grammar rule 'enums_with_opt_comma'. + +// [-] %lf conversion specifier allowed in printf +// +// TODO: see tests/lint2/msg_013.exp. + +// [x] inline functions +// +// Yes, also allowed in GCC mode. + +// [x] the snprintf family of functions in <stdio.h> +// +// The snprintf functions are treated like all other functions. The checks for +// matching format strings targets traditional C only and thus does not apply +// to these functions, as they have a prototype definition. + +// [x] boolean type in <stdbool.h> +// +// Yes. Conversion to and from boolean follows 6.3.1.2. See also the -T flag, +// which enables 'strict bool mode'. + +// [x] idempotent type qualifiers +// +// Lint warns about duplicate type qualifiers but accepts them otherwise. + +/* expect+1: warning: duplicate 'const' [10] */ +const const int duplicate_type_qualifier = 2; + +// [x] empty macro arguments +// +// Irrelevant, as lint only sees the preprocessed source code. + +// [?] new structure type compatibility rules (tag compatibility) +// +// TODO + +// [x] additional predefined macro names +// +// Irrelevant, as lint only sees the preprocessed source code. + +// [-] _Pragma preprocessing operator +// +// No, not yet asked for. + +// [-] standard pragmas +// +// No, not yet asked for. + +// [x] __func__ predefined identifier +// +// Yes, see 'fallback_symbol'. + +// [x] va_copy macro +// +// Irrelevant, as lint only sees the preprocessed source code. + +// [x] additional strftime conversion specifiers +// +// Irrelevant, as lint does not check strftime in depth. + +// [?] LIA compatibility annex +// +// TODO + +// [x] deprecate ungetc at the beginning of a binary file +// +// Irrelevant, as lint's analysis is not that deep into the runtime behavior. + +// [x] remove deprecation of aliased array parameters +// +// Irrelevant, as lint does not check for aliasing. + +// [?] conversion of array to pointer not limited to lvalues +// +// TODO + +// [x] relaxed constraints on aggregate and union initialization +// +// Yes, struct and union members can be initialized with non-constant +// expressions. Members that have struct or union type can be initialized with +// an expression of the same type. + +// [x] relaxed restrictions on portable header names +// +// Irrelevant, as lint only sees the preprocessed source code. + +// [-] return without expression not permitted in function that returns a value +// (and vice versa) + +void +return_no_expr(int x) +{ + x++; + /* expect+1: error: void function 'return_no_expr' cannot return value [213] */ + return x; +} + +int +return_expr(void) +{ + // FIXME: Make this an error in C99 and later. + /* expect+1: warning: function 'return_expr' expects to return value [214] */ + return; +}