xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_280.c (revision 7d62b00eb9ad855ffcd7da46b41e23feb5476fac)
1 /*	$NetBSD: msg_280.c,v 1.6 2022/06/22 19:23:18 rillig Exp $	*/
2 # 3 "msg_280.c"
3 
4 // Test for message: comment /* %s */ must be outside function [280]
5 
6 /* VARARGS */
7 void
8 varargs_ok(const char *str, ...)
9 {
10 	(void)str;
11 }
12 
13 /*
14  * In the following example, the comment looks misplaced, but lint does not
15  * warn about it.
16  *
17  * This is due to the implementation of the parser and the C grammar.  When
18  * the parser sees the token T_LPAREN, it has to decide whether the following
19  * tokens will form a parameter type list or an identifier list.  For that,
20  * it needs to look at the next token to see whether it is a T_NAME (in which
21  * case the T_LPAREN belongs to an id_list_lparen) or something else (in
22  * which case the T_LPAREN belongs to an abstract_decl_lparen).  This token
23  * lookahead happens just before either of these grammar rules is reduced.
24  * During that reduction, the current declaration context switches from
25  * 'extern' to 'prototype argument', which makes this exact position the very
26  * last possible.  Everything later would already be in the wrong context.
27  *
28  * As of cgram.y 1.360 from 2021-09-04, the implementation of these grammar
29  * rules is exactly the same, which makes it tempting to join them into a
30  * single rule.
31  */
32 void
33 varargs_bad_param(/* VARARGS */ const char *str, ...)
34 {
35 	(void)str;
36 }
37 
38 void
39 /* expect+1: warning: comment ** VARARGS ** must be outside function [280] */
40 varargs_bad_ellipsis(const char *str, /* VARARGS */ ...)
41 {
42 	(void)str;
43 }
44 
45 void
46 varargs_bad_body(const char *str, ...)
47 {
48 	/* expect+1: warning: comment ** VARARGS ** must be outside function [280] */
49 	/* VARARGS */
50 	(void)str;
51 }
52 
53 void
54 /* expect+1: warning: argument 'str' unused in function 'argsused_bad_body' [231] */
55 argsused_bad_body(const char *str)
56 {
57 	/* expect+1: warning: comment ** ARGSUSED ** must be outside function [280] */
58 	/* ARGSUSED */
59 }
60 
61 void
62 printflike_bad_body(const char *fmt, ...)
63 {
64 	/* expect+1: warning: comment ** PRINTFLIKE ** must be outside function [280] */
65 	/* PRINTFLIKE */
66 	(void)fmt;
67 }
68 
69 void
70 scanflike_bad_body(const char *fmt, ...)
71 {
72 	/* expect+1: warning: comment ** SCANFLIKE ** must be outside function [280] */
73 	/* SCANFLIKE */
74 	(void)fmt;
75 }
76