Home | History | Annotate | Line # | Download | only in lint1
decl.c revision 1.24
      1  1.24  rillig /*	$NetBSD: decl.c,v 1.24 2023/07/31 20:31:58 rillig Exp $	*/
      2   1.1  rillig # 3 "decl.c"
      3   1.1  rillig 
      4   1.1  rillig /*
      5   1.1  rillig  * Tests for declarations, especially the distinction between the
      6   1.1  rillig  * declaration-specifiers and the declarators.
      7   1.1  rillig  */
      8   1.1  rillig 
      9  1.22  rillig /* lint1-extra-flags: -X 191,351 */
     10  1.21  rillig 
     11   1.1  rillig /*
     12   1.1  rillig  * Even though 'const' comes after 'char' and is therefore quite close to the
     13   1.1  rillig  * first identifier, it applies to both identifiers.
     14   1.1  rillig  */
     15   1.1  rillig void
     16   1.1  rillig specifier_qualifier(void)
     17   1.1  rillig {
     18   1.1  rillig 	char const a = 1, b = 2;
     19   1.1  rillig 
     20   1.1  rillig 	/* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
     21   1.1  rillig 	a = 1;
     22   1.1  rillig 	/* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
     23   1.1  rillig 	b = 2;
     24   1.1  rillig }
     25   1.1  rillig 
     26   1.1  rillig /*
     27   1.1  rillig  * Since 'const' comes before 'char', there is no ambiguity whether the
     28   1.1  rillig  * 'const' applies to all variables or just to the first.
     29   1.1  rillig  */
     30   1.1  rillig void
     31   1.1  rillig qualifier_specifier(void)
     32   1.1  rillig {
     33   1.1  rillig 	const char a = 1, b = 2;
     34   1.1  rillig 
     35   1.1  rillig 	/* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
     36   1.1  rillig 	a = 3;
     37   1.1  rillig 	/* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
     38   1.1  rillig 	b = 5;
     39   1.1  rillig }
     40   1.1  rillig 
     41   1.1  rillig void
     42   1.1  rillig declarator_with_prefix_qualifier(void)
     43   1.1  rillig {
     44  1.17  rillig 	/* expect+1: error: syntax error 'const' [249] */
     45   1.1  rillig 	char a = 1, const b = 2;
     46   1.1  rillig 
     47   1.1  rillig 	a = 1;
     48   1.1  rillig 	/* expect+1: error: 'b' undefined [99] */
     49   1.1  rillig 	b = 2;
     50   1.1  rillig }
     51   1.1  rillig 
     52   1.1  rillig void
     53   1.1  rillig declarator_with_postfix_qualifier(void)
     54   1.1  rillig {
     55  1.17  rillig 	/* expect+1: error: syntax error 'const' [249] */
     56   1.1  rillig 	char a = 1, b const = 2;
     57   1.1  rillig 
     58   1.1  rillig 	a = 1;
     59   1.1  rillig 	b = 2;
     60   1.1  rillig }
     61   1.1  rillig 
     62   1.1  rillig void sink(double *);
     63   1.1  rillig 
     64   1.1  rillig void
     65   1.1  rillig declarators(void)
     66   1.1  rillig {
     67   1.1  rillig 	char *pc = 0, c = 0, **ppc = 0;
     68   1.1  rillig 
     69  1.17  rillig 	/* expect+1: warning: converting 'pointer to char' to incompatible 'pointer to double' for argument 1 [153] */
     70   1.1  rillig 	sink(pc);
     71  1.18  rillig 	/* expect+1: warning: illegal combination of pointer 'pointer to double' and integer 'char', arg #1 [154] */
     72   1.1  rillig 	sink(c);
     73  1.17  rillig 	/* expect+1: warning: converting 'pointer to pointer to char' to incompatible 'pointer to double' for argument 1 [153] */
     74   1.1  rillig 	sink(ppc);
     75   1.1  rillig }
     76   1.2  rillig 
     77   1.2  rillig _Bool
     78   1.2  rillig enum_error_handling(void)
     79   1.2  rillig {
     80   1.2  rillig 	enum {
     81  1.17  rillig 		/* expect+1: error: syntax error '"' [249] */
     82   1.2  rillig 		"error 1"
     83   1.2  rillig 		:		/* still the same error */
     84   1.2  rillig 		,		/* back on track */
     85   1.2  rillig 		A,
     86   1.2  rillig 		B
     87   1.2  rillig 	} x = A;
     88   1.2  rillig 
     89   1.2  rillig 	return x == B;
     90   1.2  rillig }
     91   1.3  rillig 
     92   1.4  rillig /*
     93   1.4  rillig  * An __attribute__ at the beginning of a declaration may become ambiguous
     94   1.4  rillig  * since a GCC fallthrough statement starts with __attribute__ as well.
     95   1.4  rillig  */
     96   1.3  rillig void
     97   1.3  rillig unused_local_variable(void)
     98   1.3  rillig {
     99   1.3  rillig 	__attribute__((unused)) _Bool unused_var;
    100   1.3  rillig 
    101   1.3  rillig 	__attribute__((unused))
    102   1.3  rillig 	__attribute__((unused)) _Bool unused_twice;
    103   1.3  rillig }
    104   1.5  rillig 
    105   1.5  rillig int
    106   1.5  rillig declaration_without_type_specifier(void)
    107   1.5  rillig {
    108   1.5  rillig 	const i = 3;
    109  1.20  rillig 	/* expect-1: error: old-style declaration; add 'int' [1] */
    110   1.5  rillig 	return i;
    111   1.5  rillig }
    112   1.5  rillig 
    113  1.16  rillig 
    114  1.16  rillig /* expect+2: warning: static function 'unused' unused [236] */
    115   1.5  rillig static void
    116   1.5  rillig unused(void)
    117   1.5  rillig {
    118   1.5  rillig }
    119   1.5  rillig 
    120   1.5  rillig /*
    121   1.5  rillig  * The attribute 'used' does not influence static functions, it only
    122   1.5  rillig  * applies to function parameters.
    123   1.5  rillig  */
    124   1.5  rillig /* LINTED */
    125   1.5  rillig static void
    126   1.5  rillig unused_linted(void)
    127   1.5  rillig {
    128   1.5  rillig }
    129   1.6  rillig 
    130   1.6  rillig /* covers 'type_qualifier_list: type_qualifier_list type_qualifier' */
    131   1.6  rillig int *const volatile cover_type_qualifier_list;
    132   1.7  rillig 
    133   1.8  rillig _Bool bool;
    134   1.8  rillig char plain_char;
    135   1.8  rillig signed char signed_char;
    136   1.8  rillig unsigned char unsigned_char;
    137   1.8  rillig short signed_short;
    138   1.8  rillig unsigned short unsigned_short;
    139   1.8  rillig int signed_int;
    140   1.8  rillig unsigned int unsigned_int;
    141   1.8  rillig long signed_long;
    142   1.8  rillig unsigned long unsigned_long;
    143   1.9  rillig struct {
    144   1.9  rillig 	int member;
    145   1.9  rillig } unnamed_struct;
    146   1.8  rillig 
    147   1.8  rillig /*
    148   1.8  rillig  * Before decl.c 1.201 from 2021-07-15, lint crashed with an internal error
    149  1.19  rillig  * in dcs_end_type (named end_type back then).
    150   1.8  rillig  */
    151   1.8  rillig unsigned long sizes =
    152   1.8  rillig     sizeof(const typeof(bool)) +
    153   1.8  rillig     sizeof(const typeof(plain_char)) +
    154   1.8  rillig     sizeof(const typeof(signed_char)) +
    155   1.8  rillig     sizeof(const typeof(unsigned_char)) +
    156   1.8  rillig     sizeof(const typeof(signed_short)) +
    157   1.8  rillig     sizeof(const typeof(unsigned_short)) +
    158   1.8  rillig     sizeof(const typeof(signed_int)) +
    159   1.8  rillig     sizeof(const typeof(unsigned_int)) +
    160   1.8  rillig     sizeof(const typeof(signed_long)) +
    161   1.9  rillig     sizeof(const typeof(unsigned_long)) +
    162   1.9  rillig     sizeof(const typeof(unnamed_struct));
    163  1.10  rillig 
    164  1.20  rillig /* expect+2: error: old-style declaration; add 'int' [1] */
    165  1.17  rillig /* expect+1: error: syntax error 'int' [249] */
    166  1.10  rillig thread int thread_int;
    167  1.10  rillig __thread int thread_int;
    168  1.20  rillig /* expect+2: error: old-style declaration; add 'int' [1] */
    169  1.17  rillig /* expect+1: error: syntax error 'int' [249] */
    170  1.10  rillig __thread__ int thread_int;
    171  1.12  rillig 
    172  1.20  rillig /* expect+4: error: old-style declaration; add 'int' [1] */
    173  1.16  rillig /* expect+2: warning: static function 'cover_func_declarator' unused [236] */
    174  1.12  rillig static
    175  1.12  rillig cover_func_declarator(void)
    176  1.12  rillig {
    177  1.12  rillig }
    178  1.13  rillig 
    179  1.13  rillig /*
    180  1.13  rillig  * Before decl.c 1.268 from 2022-04-03, lint ran into an assertion failure for
    181  1.13  rillig  * "elsz > 0" in 'length'.
    182  1.13  rillig  */
    183  1.13  rillig /* expect+2: error: syntax error 'goto' [249] */
    184  1.18  rillig /* expect+1: warning: empty array declaration for 'void_array_error' [190] */
    185  1.13  rillig void void_array_error[] goto;
    186  1.23  rillig 
    187  1.23  rillig const volatile int
    188  1.23  rillig /* expect+1: warning: duplicate 'const' [10] */
    189  1.23  rillig     *const volatile const
    190  1.23  rillig /* expect+1: warning: duplicate 'volatile' [10] */
    191  1.23  rillig     *volatile const volatile
    192  1.23  rillig     *duplicate_ptr;
    193  1.24  rillig 
    194  1.24  rillig 
    195  1.24  rillig /*
    196  1.24  rillig  * Since tree.c 1.573 from 2023-07-15 and before decl.c 1.370 from 2023-07-31,
    197  1.24  rillig  * lint crashed due to a failed assertion in find_member.  The assertion states
    198  1.24  rillig  * that every member of a struct or union must link back to its containing
    199  1.24  rillig  * type, which had not been the case for unnamed bit-fields.
    200  1.24  rillig  */
    201  1.24  rillig struct bit_and_data {
    202  1.24  rillig 	unsigned int :0;
    203  1.24  rillig 	unsigned int bit:1;
    204  1.24  rillig 	unsigned int :0;
    205  1.24  rillig 
    206  1.24  rillig 	void *data;
    207  1.24  rillig };
    208  1.24  rillig 
    209  1.24  rillig static inline void *
    210  1.24  rillig bit_and_data(struct bit_and_data *node)
    211  1.24  rillig {
    212  1.24  rillig 	return node->data;
    213  1.24  rillig }
    214