xref: /netbsd/tests/usr.bin/xlint/lint1/msg_346.c (revision ea649623)
1*ea649623Srillig /*	$NetBSD: msg_346.c,v 1.8 2023/03/28 14:44:35 rillig Exp $	*/
2bb8ca2d9Srillig # 3 "msg_346.c"
3bb8ca2d9Srillig 
4bb8ca2d9Srillig // Test for message: call to '%s' effectively discards 'const' from argument [346]
5bb8ca2d9Srillig 
6*ea649623Srillig /* lint1-extra-flags: -X 351 */
7*ea649623Srillig 
86666a040Srillig typedef unsigned long size_t;
96666a040Srillig 
106666a040Srillig void* memchr(const void *, int, size_t);		/* C99 7.21.5.1 */
116666a040Srillig char *strchr(const char *, int);			/* C99 7.21.5.2 */
126666a040Srillig char* strpbrk(const char *, const char *);		/* C99 7.21.5.4 */
136666a040Srillig char* strrchr(const char *, int);			/* C99 7.21.5.5 */
146666a040Srillig char* strstr(const char *, const char *);		/* C99 7.21.5.7 */
15bb8ca2d9Srillig 
16bb8ca2d9Srillig void take_const_char_ptr(const char *);
17bb8ca2d9Srillig void take_char_ptr(char *);
18bb8ca2d9Srillig 
19bb8ca2d9Srillig void
example(void)20bb8ca2d9Srillig example(void)
21bb8ca2d9Srillig {
22bb8ca2d9Srillig 	const char *ccp = "const char *";
23bb8ca2d9Srillig 	char *cp = "char *";
24bb8ca2d9Srillig 
25bb8ca2d9Srillig 	ccp = strchr(ccp, 'c');
26bb8ca2d9Srillig 	ccp = strchr(cp, 'c');
27bb8ca2d9Srillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
28bb8ca2d9Srillig 	cp = strchr(ccp, 'c');
29bb8ca2d9Srillig 	cp = strchr(cp, 'c');
30bb8ca2d9Srillig 
31bb8ca2d9Srillig 	take_const_char_ptr(strchr(ccp, 'c'));
32bb8ca2d9Srillig 	take_const_char_ptr(strchr(cp, 'c'));
33bb8ca2d9Srillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
34bb8ca2d9Srillig 	take_char_ptr(strchr(ccp, 'c'));
35bb8ca2d9Srillig 	take_char_ptr(strchr(cp, 'c'));
36bb8ca2d9Srillig 
37bb8ca2d9Srillig 	take_const_char_ptr(strchr("literal", 'c'));
38bb8ca2d9Srillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
39bb8ca2d9Srillig 	take_char_ptr(strchr("literal", 'c'));
40bb8ca2d9Srillig }
416666a040Srillig 
426666a040Srillig void
all_functions(void)436666a040Srillig all_functions(void)
446666a040Srillig {
450c33fdedSrillig 	/* expect+1: warning: call to 'memchr' effectively discards 'const' from argument [346] */
466666a040Srillig 	take_char_ptr(memchr("string", 'c', 7));
476666a040Srillig 	/* expect+1: warning: call to 'strchr' effectively discards 'const' from argument [346] */
486666a040Srillig 	take_char_ptr(strchr("string", 'c'));
490c33fdedSrillig 	/* expect+1: warning: call to 'strpbrk' effectively discards 'const' from argument [346] */
506666a040Srillig 	take_char_ptr(strpbrk("string", "c"));
510c33fdedSrillig 	/* expect+1: warning: call to 'strrchr' effectively discards 'const' from argument [346] */
526666a040Srillig 	take_char_ptr(strrchr("string", 'c'));
530c33fdedSrillig 	/* expect+1: warning: call to 'strstr' effectively discards 'const' from argument [346] */
546666a040Srillig 	take_char_ptr(strstr("string", "c"));
556666a040Srillig }
5650c44181Srillig 
5750c44181Srillig void
edge_cases(void)5850c44181Srillig edge_cases(void)
59884b0e6aSrillig {	/* TODO: '0 argument passed' is not correct English */
6050c44181Srillig 	/* No arguments, to cover the 'an == NULL' in is_first_arg_const. */
61884b0e6aSrillig 	/* expect+1: error: argument mismatch: 0 argument passed, 2 expected [150] */
6250c44181Srillig 	take_char_ptr(strchr());
6350c44181Srillig }
64f0dec67fSrillig 
65f0dec67fSrillig /*
66f0dec67fSrillig  * Bsearch is another standard function that effectively discards the 'const'
67f0dec67fSrillig  * modifier, but from the second argument, not the first.
68f0dec67fSrillig  */
69f0dec67fSrillig 
70f0dec67fSrillig void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
71f0dec67fSrillig 	int (*compar) (const void *, const void *));
72f0dec67fSrillig 
73f0dec67fSrillig int cmp(const void *, const void *);
74f0dec67fSrillig 
75f0dec67fSrillig void take_void_ptr(void *);
7653fe1d7eSrillig void take_const_void_ptr(const void *);
77f0dec67fSrillig 
78f0dec67fSrillig void
bsearch_example(void)79f0dec67fSrillig bsearch_example(void)
80f0dec67fSrillig {
8153fe1d7eSrillig 	int arr[] = { 1 };
82f0dec67fSrillig 	const int const_arr[] = { 1 };
83f0dec67fSrillig 
84f0dec67fSrillig 	take_const_void_ptr(bsearch("", const_arr, 4, 1, cmp));
85f0dec67fSrillig 	take_const_void_ptr(bsearch("", arr, 4, 1, cmp));
86f0dec67fSrillig 	take_void_ptr(bsearch("", arr, 4, 1, cmp));
87f0dec67fSrillig 
8853fe1d7eSrillig 	/* expect+1: warning: call to 'bsearch' effectively discards 'const' from argument [346] */
89f0dec67fSrillig 	take_void_ptr(bsearch("", const_arr, 4, 1, cmp));
90f0dec67fSrillig }
91