Home | History | Annotate | Line # | Download | only in lint1
decl.c revision 1.5
      1  1.5  rillig /*	$NetBSD: decl.c,v 1.5 2021/07/14 20:39:13 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