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