Home | History | Annotate | Line # | Download | only in lint1
decl.c revision 1.9
      1  1.9  rillig /*	$NetBSD: decl.c,v 1.9 2021/07/15 23:07:05 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.1  rillig /*
     10  1.1  rillig  * Even though 'const' comes after 'char' and is therefore quite close to the
     11  1.1  rillig  * first identifier, it applies to both identifiers.
     12  1.1  rillig  */
     13  1.1  rillig void
     14  1.1  rillig specifier_qualifier(void)
     15  1.1  rillig {
     16  1.1  rillig 	char const a = 1, b = 2;
     17  1.1  rillig 
     18  1.1  rillig 	/* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
     19  1.1  rillig 	a = 1;
     20  1.1  rillig 	/* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
     21  1.1  rillig 	b = 2;
     22  1.1  rillig }
     23  1.1  rillig 
     24  1.1  rillig /*
     25  1.1  rillig  * Since 'const' comes before 'char', there is no ambiguity whether the
     26  1.1  rillig  * 'const' applies to all variables or just to the first.
     27  1.1  rillig  */
     28  1.1  rillig void
     29  1.1  rillig qualifier_specifier(void)
     30  1.1  rillig {
     31  1.1  rillig 	const char a = 1, b = 2;
     32  1.1  rillig 
     33  1.1  rillig 	/* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
     34  1.1  rillig 	a = 3;
     35  1.1  rillig 	/* expect+1: warning: left operand of '=' must be modifiable lvalue [115] */
     36  1.1  rillig 	b = 5;
     37  1.1  rillig }
     38  1.1  rillig 
     39  1.1  rillig void
     40  1.1  rillig declarator_with_prefix_qualifier(void)
     41  1.1  rillig {
     42  1.1  rillig 	/* expect+1: syntax error 'const' [249] */
     43  1.1  rillig 	char a = 1, const b = 2;
     44  1.1  rillig 
     45  1.1  rillig 	a = 1;
     46  1.1  rillig 	/* expect+1: error: 'b' undefined [99] */
     47  1.1  rillig 	b = 2;
     48  1.1  rillig }
     49  1.1  rillig 
     50  1.1  rillig void
     51  1.1  rillig declarator_with_postfix_qualifier(void)
     52  1.1  rillig {
     53  1.1  rillig 	/* expect+1: syntax error 'const' [249] */
     54  1.1  rillig 	char a = 1, b const = 2;
     55  1.1  rillig 
     56  1.1  rillig 	a = 1;
     57  1.1  rillig 	b = 2;
     58  1.1  rillig }
     59  1.1  rillig 
     60  1.1  rillig void sink(double *);
     61  1.1  rillig 
     62  1.1  rillig void
     63  1.1  rillig declarators(void)
     64  1.1  rillig {
     65  1.1  rillig 	char *pc = 0, c = 0, **ppc = 0;
     66  1.1  rillig 
     67  1.1  rillig 	/* expect+1: warning: converting 'pointer to char' to incompatible 'pointer to double' */
     68  1.1  rillig 	sink(pc);
     69  1.1  rillig 	/* expect+1: warning: illegal combination of pointer (pointer to double) and integer (char) */
     70  1.1  rillig 	sink(c);
     71  1.1  rillig 	/* expect+1: converting 'pointer to pointer to char' to incompatible 'pointer to double' */
     72  1.1  rillig 	sink(ppc);
     73  1.1  rillig }
     74  1.2  rillig 
     75  1.2  rillig _Bool
     76  1.2  rillig enum_error_handling(void)
     77  1.2  rillig {
     78  1.2  rillig 	enum {
     79  1.2  rillig 		/* expect+1: syntax error '"' [249] */
     80  1.2  rillig 		"error 1"
     81  1.2  rillig 		:		/* still the same error */
     82  1.2  rillig 		,		/* back on track */
     83  1.2  rillig 		A,
     84  1.2  rillig 		B
     85  1.2  rillig 	} x = A;
     86  1.2  rillig 
     87  1.2  rillig 	return x == B;
     88  1.2  rillig }
     89  1.3  rillig 
     90  1.4  rillig /*
     91  1.4  rillig  * An __attribute__ at the beginning of a declaration may become ambiguous
     92  1.4  rillig  * since a GCC fallthrough statement starts with __attribute__ as well.
     93  1.4  rillig  */
     94  1.3  rillig void
     95  1.3  rillig unused_local_variable(void)
     96  1.3  rillig {
     97  1.3  rillig 	__attribute__((unused)) _Bool unused_var;
     98  1.3  rillig 
     99  1.3  rillig 	__attribute__((unused))
    100  1.3  rillig 	__attribute__((unused)) _Bool unused_twice;
    101  1.3  rillig }
    102  1.5  rillig 
    103  1.5  rillig int
    104  1.5  rillig declaration_without_type_specifier(void)
    105  1.5  rillig {
    106  1.5  rillig 	const i = 3;
    107  1.5  rillig 
    108  1.5  rillig 	return i;
    109  1.5  rillig }
    110  1.5  rillig 
    111  1.5  rillig /* TODO: add quotes around %s */
    112  1.5  rillig /* expect+2: warning: static function unused unused [236] */
    113  1.5  rillig static void
    114  1.5  rillig unused(void)
    115  1.5  rillig {
    116  1.5  rillig }
    117  1.5  rillig 
    118  1.5  rillig /*
    119  1.5  rillig  * The attribute 'used' does not influence static functions, it only
    120  1.5  rillig  * applies to function parameters.
    121  1.5  rillig  */
    122  1.5  rillig /* LINTED */
    123  1.5  rillig static void
    124  1.5  rillig unused_linted(void)
    125  1.5  rillig {
    126  1.5  rillig }
    127  1.6  rillig 
    128  1.6  rillig /* covers 'type_qualifier_list: type_qualifier_list type_qualifier' */
    129  1.6  rillig int *const volatile cover_type_qualifier_list;
    130  1.7  rillig 
    131  1.7  rillig unsigned long cover_abstract_declaration_declmods = sizeof(const);
    132  1.7  rillig unsigned long cover_abstract_declaration_declmods_abstract_declarator =
    133  1.7  rillig     sizeof(const *);
    134  1.8  rillig 
    135  1.8  rillig unsigned long cover_abstract_declarator_typeof =
    136  1.8  rillig     sizeof(const typeof(cover_abstract_declaration_declmods));
    137  1.8  rillig 
    138  1.8  rillig _Bool bool;
    139  1.8  rillig char plain_char;
    140  1.8  rillig signed char signed_char;
    141  1.8  rillig unsigned char unsigned_char;
    142  1.8  rillig short signed_short;
    143  1.8  rillig unsigned short unsigned_short;
    144  1.8  rillig int signed_int;
    145  1.8  rillig unsigned int unsigned_int;
    146  1.8  rillig long signed_long;
    147  1.8  rillig unsigned long unsigned_long;
    148  1.9  rillig struct {
    149  1.9  rillig 	int member;
    150  1.9  rillig } unnamed_struct;
    151  1.8  rillig 
    152  1.8  rillig /*
    153  1.8  rillig  * Before decl.c 1.201 from 2021-07-15, lint crashed with an internal error
    154  1.8  rillig  * in end_type.
    155  1.8  rillig  */
    156  1.8  rillig unsigned long sizes =
    157  1.8  rillig     sizeof(const typeof(bool)) +
    158  1.8  rillig     sizeof(const typeof(plain_char)) +
    159  1.8  rillig     sizeof(const typeof(signed_char)) +
    160  1.8  rillig     sizeof(const typeof(unsigned_char)) +
    161  1.8  rillig     sizeof(const typeof(signed_short)) +
    162  1.8  rillig     sizeof(const typeof(unsigned_short)) +
    163  1.8  rillig     sizeof(const typeof(signed_int)) +
    164  1.8  rillig     sizeof(const typeof(unsigned_int)) +
    165  1.8  rillig     sizeof(const typeof(signed_long)) +
    166  1.9  rillig     sizeof(const typeof(unsigned_long)) +
    167  1.9  rillig     sizeof(const typeof(unnamed_struct));
    168