Home | History | Annotate | Line # | Download | only in lint1
decl_arg.c revision 1.17
      1  1.17  rillig /*	$NetBSD: decl_arg.c,v 1.17 2025/01/03 03:14:47 rillig Exp $	*/
      2   1.1  rillig # 3 "decl_arg.c"
      3   1.1  rillig 
      4   1.1  rillig /*
      5  1.12  rillig  * Tests for declarations of function parameters.
      6   1.1  rillig  *
      7   1.1  rillig  * See arg_declaration in cgram.y.
      8   1.1  rillig  */
      9   1.1  rillig 
     10   1.8  rillig /* lint1-extra-flags: -X 351 */
     11   1.8  rillig 
     12   1.1  rillig typedef double number;
     13   1.1  rillig 
     14   1.1  rillig void no_args(void);
     15   1.1  rillig void type_unnamed(double );
     16   1.1  rillig void type_named(double arg);
     17   1.1  rillig void typedef_unnamed_prototype(number);
     18   1.1  rillig void typedef_named(number arg);
     19   1.1  rillig 
     20   1.1  rillig void type_qualifier(const number);
     21   1.1  rillig void type_qualifier_pointer(const number *const);
     22   1.1  rillig 
     23   1.1  rillig /*
     24   1.1  rillig  * Just some unrealistic coverage for the grammar rule 'arg_declaration'.
     25   1.1  rillig  */
     26   1.1  rillig extern void
     27  1.17  rillig /* expect+6: warning: function definition for 'old_style' with identifier list is obsolete in C23 [384] */
     28  1.16  rillig /* expect+5: warning: parameter 'an_int' unused in function 'old_style' [231] */
     29  1.16  rillig /* expect+4: warning: parameter 'a_const_int' unused in function 'old_style' [231] */
     30  1.16  rillig /* expect+3: warning: parameter 'a_number' unused in function 'old_style' [231] */
     31  1.16  rillig /* expect+2: warning: parameter 'a_function' unused in function 'old_style' [231] */
     32  1.16  rillig /* expect+1: warning: parameter 'a_struct' unused in function 'old_style' [231] */
     33   1.1  rillig old_style(an_int, a_const_int, a_number, a_function, a_struct)
     34  1.13  rillig /* expect+2: error: only 'register' is valid as storage class in parameter [9] */
     35  1.13  rillig /* expect+1: warning: empty declaration [2] */
     36   1.1  rillig static;
     37   1.1  rillig /* expect+1: error: syntax error '"' [249] */
     38   1.1  rillig static "error";
     39   1.1  rillig /* expect+1: warning: empty declaration [2] */
     40   1.1  rillig const;
     41  1.12  rillig /* expect+1: error: declared parameter 'undeclared' is missing [53] */
     42   1.1  rillig const undeclared;
     43  1.12  rillig /* expect+2: error: declared parameter 'undeclared_initialized' is missing [53] */
     44   1.7  rillig /* expect+1: error: cannot initialize parameter 'undeclared_initialized' [52] */
     45   1.1  rillig const undeclared_initialized = 12345;
     46   1.1  rillig /* expect+1: warning: empty declaration [2] */
     47   1.1  rillig int;
     48  1.12  rillig /* expect+1: warning: 'struct arg_struct' declared in parameter declaration list [3] */
     49   1.1  rillig struct arg_struct { int member; };
     50   1.7  rillig /* expect+1: error: cannot initialize parameter 'an_int' [52] */
     51   1.1  rillig int an_int = 12345;
     52   1.1  rillig const int a_const_int;
     53   1.1  rillig number a_number;
     54   1.1  rillig void (a_function) (number);
     55  1.12  rillig /* expect+1: warning: 'struct a_struct' declared in parameter declaration list [3] */
     56   1.1  rillig struct a_struct { int member; } a_struct;
     57   1.1  rillig {
     58   1.1  rillig }
     59   1.1  rillig 
     60   1.1  rillig /*
     61   1.6  rillig  * Just some unrealistic coverage for the grammar rule
     62   1.6  rillig  * 'notype_direct_declarator'.
     63   1.1  rillig  */
     64   1.1  rillig extern int
     65  1.17  rillig /* expect+1: warning: function definition for 'cover_notype_direct_decl' with identifier list is obsolete in C23 [384] */
     66   1.1  rillig cover_notype_direct_decl(arg)
     67   1.1  rillig int arg;
     68  1.12  rillig /* expect+1: error: declared parameter 'name' is missing [53] */
     69   1.1  rillig const name;
     70  1.12  rillig /* expect+1: error: declared parameter 'parenthesized_name' is missing [53] */
     71   1.1  rillig const (parenthesized_name);
     72  1.12  rillig /* expect+1: error: declared parameter 'array' is missing [53] */
     73   1.1  rillig const array[];
     74  1.12  rillig /* expect+1: error: declared parameter 'array_size' is missing [53] */
     75   1.1  rillig const array_size[1+1+1];
     76  1.13  rillig /* expect+2: error: null dimension [17] */
     77  1.13  rillig /* expect+1: error: declared parameter 'multi_array' is missing [53] */
     78   1.1  rillig const multi_array[][][][][][];
     79  1.12  rillig /* expect+1: error: declared parameter 'function' is missing [53] */
     80   1.1  rillig const function(void);
     81  1.12  rillig /* expect+1: error: declared parameter 'prefix_attribute' is missing [53] */
     82   1.1  rillig const __attribute__((deprecated)) prefix_attribute;
     83  1.12  rillig /* expect+1: error: declared parameter 'postfix_attribute' is missing [53] */
     84   1.1  rillig const postfix_attribute __attribute__((deprecated));
     85  1.12  rillig /* expect+1: error: declared parameter 'infix_attribute' is missing [53] */
     86   1.1  rillig const __attribute__((deprecated)) infix_attribute __attribute__((deprecated));
     87   1.1  rillig /* The __attribute__ before the '*' is consumed by some other grammar rule. */
     88  1.12  rillig /* expect+7: error: declared parameter 'pointer_prefix_attribute' is missing [53] */
     89   1.1  rillig const
     90   1.1  rillig     __attribute__((deprecated))
     91   1.1  rillig     *
     92   1.1  rillig     __attribute__((deprecated))
     93   1.1  rillig     __attribute__((deprecated))
     94   1.1  rillig     __attribute__((deprecated))
     95   1.1  rillig     pointer_prefix_attribute;
     96   1.1  rillig {
     97   1.1  rillig 	return arg;
     98   1.1  rillig }
     99   1.2  rillig 
    100  1.14  rillig // The attribute 'unused' belongs to the parameter.
    101  1.14  rillig // The attribute 'format' belongs to the function type.
    102  1.14  rillig void
    103  1.14  rillig param_func_attr_unused(
    104   1.2  rillig     void (*pr)(const char *, ...)
    105  1.14  rillig 	__attribute__((__unused__))
    106   1.2  rillig 	__attribute__((__format__(__printf__, 1, 2)))
    107  1.14  rillig )
    108  1.14  rillig {
    109  1.14  rillig }
    110  1.14  rillig 
    111  1.14  rillig // The attribute 'unused' belongs to the parameter.
    112  1.14  rillig // The attribute 'format' belongs to the function type.
    113  1.14  rillig void
    114  1.14  rillig param_func_attr_printf(
    115  1.14  rillig     void (*pr)(const char *, ...)
    116  1.14  rillig 	__attribute__((__unused__))
    117  1.14  rillig 	__attribute__((__format__(__printf__, 1, 2)))
    118  1.14  rillig )
    119  1.14  rillig {
    120  1.14  rillig 	// GCC and Clang already warn about the malformed format string,
    121  1.14  rillig 	// so there is nothing left to do for lint.
    122  1.14  rillig 	pr("%");
    123  1.14  rillig }
    124   1.3  rillig 
    125   1.3  rillig /*
    126   1.3  rillig  * XXX: To cover the grammar rule 'direct_notype_param_decl', the parameters
    127   1.3  rillig  *  need to be enclosed by one more pair of parentheses than usual.
    128   1.3  rillig  */
    129   1.3  rillig void cover_direct_notype_param_decl(
    130   1.4  rillig     double (identifier),
    131   1.3  rillig     double ((parenthesized)),
    132   1.3  rillig     double (array[]),
    133   1.3  rillig     double (array_size[3]),
    134   1.3  rillig     double (*)(void (function()))
    135   1.3  rillig );
    136   1.4  rillig 
    137   1.4  rillig /*
    138   1.4  rillig  * Just some unrealistic code to cover the grammar rule parameter_declaration.
    139   1.4  rillig  */
    140   1.9  rillig /* expect+4: error: only 'register' is valid as storage class in parameter [9] */
    141   1.4  rillig void cover_parameter_declaration(
    142   1.4  rillig     volatile,			/* 1 */
    143   1.4  rillig     double,			/* 2 */
    144   1.4  rillig     static storage_class,	/* 3.1 */
    145   1.4  rillig     const type_qualifier,	/* 3.2 */
    146   1.4  rillig     double (identifier),	/* 4 */
    147   1.4  rillig     const (*),			/* 5 */
    148   1.4  rillig     double *const,		/* 6 */
    149   1.4  rillig     ...
    150   1.4  rillig );
    151   1.5  rillig 
    152   1.5  rillig void cover_asm_or_symbolrename_asm(void)
    153   1.5  rillig     __asm("assembly code");
    154   1.5  rillig 
    155   1.5  rillig void cover_asm_or_symbolrename_symbolrename(void)
    156   1.5  rillig     __symbolrename(alternate_name);
    157   1.6  rillig 
    158  1.11  rillig 
    159  1.11  rillig double
    160  1.17  rillig /* expect+1: warning: function definition for 'f' with identifier list is obsolete in C23 [384] */
    161  1.11  rillig f(e, s, r, a, t, n)
    162  1.11  rillig 	/* expect+1: error: only 'register' is valid as storage class in parameter [9] */
    163  1.11  rillig 	extern double e;
    164  1.11  rillig 	/* expect+1: error: only 'register' is valid as storage class in parameter [9] */
    165  1.11  rillig 	static double s;
    166  1.11  rillig 	register double r;
    167  1.11  rillig 	/* expect+1: error: only 'register' is valid as storage class in parameter [9] */
    168  1.11  rillig 	auto double a;
    169  1.11  rillig 	/* expect+1: error: only 'register' is valid as storage class in parameter [9] */
    170  1.11  rillig 	typedef double t;
    171  1.11  rillig 	double n;
    172  1.11  rillig {
    173  1.11  rillig 	return e + s + r + a + t + n;
    174  1.11  rillig }
    175  1.11  rillig 
    176  1.11  rillig 
    177   1.6  rillig // FIXME: internal error in decl.c:906 near decl_arg.c:134: length(0)
    178   1.6  rillig //void cover_abstract_declarator_typeof(void (*)(typeof(no_args)));
    179