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