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