Home | History | Annotate | Line # | Download | only in lint1
decl.c revision 1.13
      1  1.13  rillig /*	$NetBSD: decl.c,v 1.13 2022/04/03 10:05:23 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.8  rillig _Bool bool;
    132   1.8  rillig char plain_char;
    133   1.8  rillig signed char signed_char;
    134   1.8  rillig unsigned char unsigned_char;
    135   1.8  rillig short signed_short;
    136   1.8  rillig unsigned short unsigned_short;
    137   1.8  rillig int signed_int;
    138   1.8  rillig unsigned int unsigned_int;
    139   1.8  rillig long signed_long;
    140   1.8  rillig unsigned long unsigned_long;
    141   1.9  rillig struct {
    142   1.9  rillig 	int member;
    143   1.9  rillig } unnamed_struct;
    144   1.8  rillig 
    145   1.8  rillig /*
    146   1.8  rillig  * Before decl.c 1.201 from 2021-07-15, lint crashed with an internal error
    147   1.8  rillig  * in end_type.
    148   1.8  rillig  */
    149   1.8  rillig unsigned long sizes =
    150   1.8  rillig     sizeof(const typeof(bool)) +
    151   1.8  rillig     sizeof(const typeof(plain_char)) +
    152   1.8  rillig     sizeof(const typeof(signed_char)) +
    153   1.8  rillig     sizeof(const typeof(unsigned_char)) +
    154   1.8  rillig     sizeof(const typeof(signed_short)) +
    155   1.8  rillig     sizeof(const typeof(unsigned_short)) +
    156   1.8  rillig     sizeof(const typeof(signed_int)) +
    157   1.8  rillig     sizeof(const typeof(unsigned_int)) +
    158   1.8  rillig     sizeof(const typeof(signed_long)) +
    159   1.9  rillig     sizeof(const typeof(unsigned_long)) +
    160   1.9  rillig     sizeof(const typeof(unnamed_struct));
    161  1.10  rillig 
    162  1.10  rillig /* expect+1: syntax error 'int' [249] */
    163  1.10  rillig thread int thread_int;
    164  1.10  rillig __thread int thread_int;
    165  1.10  rillig /* expect+1: syntax error 'int' [249] */
    166  1.10  rillig __thread__ int thread_int;
    167  1.12  rillig 
    168  1.12  rillig /* expect+2: warning: static function cover_func_declarator unused [236] */
    169  1.12  rillig static
    170  1.12  rillig cover_func_declarator(void)
    171  1.12  rillig {
    172  1.12  rillig }
    173  1.13  rillig 
    174  1.13  rillig /*
    175  1.13  rillig  * Before decl.c 1.268 from 2022-04-03, lint ran into an assertion failure for
    176  1.13  rillig  * "elsz > 0" in 'length'.
    177  1.13  rillig  */
    178  1.13  rillig /* expect+2: error: syntax error 'goto' [249] */
    179  1.13  rillig /* expect+1: warning: empty array declaration: void_array_error [190] */
    180  1.13  rillig void void_array_error[] goto;
    181