1/* $NetBSD: opt_bad.c,v 1.13 2023/10/22 21:03:08 rillig Exp $ */
2
3/*
4 * Tests for the options '-bad' and '-nbad'.
5 *
6 * The option '-bad' forces a blank line after every block of declarations.
7 * It only affects declarations of local variables.  It does not affect
8 * file-scoped declarations or definitions.
9 *
10 * The option '-nbad' leaves everything as is.
11 */
12
13/* Test global declarations. */
14//indent input
15int		global_variable;
16void		function_declaration(void);
17#if 0
18#endif
19/* comment */
20//indent end
21
22//indent run-equals-input -bad
23
24//indent run-equals-input -nbad
25
26
27/* See FreeBSD r303599. */
28//indent input
29#if defined(__i386__)
30int a;
31#elif defined(__amd64__)
32int b;
33#else
34#error "Port me"
35#endif
36//indent end
37
38//indent run -bad
39#if defined(__i386__)
40int		a;
41#elif defined(__amd64__)
42int		b;
43#else
44#error "Port me"
45#endif
46//indent end
47
48
49/* Test local declarations. */
50//indent input
51void function_definition(void) {
52    int local_variable;
53    function_call();
54    int local_variable_after_statement;
55    function_call();
56}
57//indent end
58
59//indent run -bad
60void
61function_definition(void)
62{
63	int		local_variable;
64
65	function_call();
66	int		local_variable_after_statement;
67
68	function_call();
69}
70//indent end
71
72//indent run -nbad
73void
74function_definition(void)
75{
76	int		local_variable;
77	/* $ No blank line here. */
78	function_call();
79	int		local_variable_after_statement;
80	/* $ No blank line here. */
81	function_call();
82}
83//indent end
84
85
86/*
87 * A comment after a declaration does not change whether there should be a
88 * blank line below the declaration.
89 */
90//indent input
91void
92comments(void)
93{
94	int local_var_1;	/* comment */
95	int local_var_2;	/* comment */
96	/* comment line */
97	function_call();
98}
99//indent end
100
101//indent run -ldi0 -bad
102void
103comments(void)
104{
105	int local_var_1;	/* comment */
106	int local_var_2;	/* comment */
107// $ Indent does not look ahead much, so it doesn't know whether this comment
108// $ will be followed by a declaration or a statement.
109	/* comment line */
110
111	function_call();
112}
113//indent end
114
115//indent run-equals-input -ldi0 -nbad
116
117
118/*
119 * A declaration that has a braced initializer is still a declaration and
120 * therefore needs a blank line below.
121 */
122//indent input
123void
124initializer(void)
125{
126	int local_var_init_1[] = {1};
127	int local_var_init_2[] = {1};
128	function_call();
129}
130
131void
132initializer_with_blank(void)
133{
134	int local_var_init_1[] = {1};
135
136	int local_var_init_2[] = {1};
137
138	function_call();
139}
140//indent end
141
142//indent run -ldi0 -bad
143void
144initializer(void)
145{
146	int local_var_init_1[] = {1};
147	int local_var_init_2[] = {1};
148
149	function_call();
150}
151
152void
153initializer_with_blank(void)
154{
155	int local_var_init_1[] = {1};
156
157	int local_var_init_2[] = {1};
158
159	function_call();
160}
161//indent end
162
163//indent run-equals-input -ldi0 -nbad
164
165
166//indent input
167{
168	// $ The '}' in an initializer does not finish a declaration,
169	// $ only a semicolon does.
170	int decl1[2][2] = {
171		{1, 2},
172		{3, 4},
173	};
174	/* comment */
175	int decl2;
176	// $ If the declaration is followed by a '}' that terminates the block
177	// $ statement, there is no need for a blank line before the '}'.
178}
179//indent end
180
181//indent run-equals-input -bad -di0
182