xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_171.c (revision e6298b924c5ba98f3a22919b56dab04a87cdbb1c)
1*e6298b92Srillig /*	$NetBSD: msg_171.c,v 1.9 2023/07/07 19:45:22 rillig Exp $	*/
2a0a15c14Srillig # 3 "msg_171.c"
3a0a15c14Srillig 
477129994Srillig // Test for message: cannot assign to '%s' from '%s' [171]
5a0a15c14Srillig 
6*e6298b92Srillig /* lint1-extra-flags: -X 351 */
7*e6298b92Srillig 
8fe3677c5Srillig struct s {
9fe3677c5Srillig 	int member;
10fe3677c5Srillig };
11fe3677c5Srillig 
12fe3677c5Srillig /*ARGSUSED*/
13fe3677c5Srillig void
example(int i,void * vp,struct s * s)14fe3677c5Srillig example(int i, void *vp, struct s *s)
15fe3677c5Srillig {
1665e5c21bSrillig 	/* expect+1: error: cannot assign to 'int' from 'struct s' [171] */
1765e5c21bSrillig 	i = *s;
1865e5c21bSrillig 	/* expect+1: error: cannot assign to 'struct s' from 'int' [171] */
1965e5c21bSrillig 	*s = i;
20fe3677c5Srillig 
2165e5c21bSrillig 	/* expect+1: error: cannot assign to 'pointer to void' from 'struct s' [171] */
2265e5c21bSrillig 	vp = *s;
2365e5c21bSrillig 	/* expect+1: error: cannot assign to 'struct s' from 'pointer to void' [171] */
2465e5c21bSrillig 	*s = vp;
25fe3677c5Srillig }
269e1bfe0eSrillig 
279e1bfe0eSrillig /*
289e1bfe0eSrillig  * C99 6.5.2.5 says that a compound literal evaluates to an unnamed object
299e1bfe0eSrillig  * with automatic storage duration, like any normal named object.  It is an
309e1bfe0eSrillig  * lvalue, which means that it is possible to take the address of the object.
319e1bfe0eSrillig  * Seen in external/mpl/bind/dist/lib/dns/rbtdb.c, update_rrsetstats.
32131c7001Srillig  *
33131c7001Srillig  * Before init.c 1.111 from 2021-03-23, lint could not handle these nested
34131c7001Srillig  * initializations (the outer one for the variable 'p', the inner one for the
35131c7001Srillig  * compound literal) and wrongly complained about a type mismatch between
36131c7001Srillig  * 'struct point' and 'pointer to struct point'.
379e1bfe0eSrillig  */
389e1bfe0eSrillig void
pointer_to_compound_literal(void)399e1bfe0eSrillig pointer_to_compound_literal(void)
409e1bfe0eSrillig {
419e1bfe0eSrillig 	struct point {
429e1bfe0eSrillig 		int x;
439e1bfe0eSrillig 		int y;
449e1bfe0eSrillig 	};
459e1bfe0eSrillig 	struct point *p = &(struct point){
469e1bfe0eSrillig 		12, 5,
47131c7001Srillig 	};
48bc7377e5Srillig 
49bc7377e5Srillig 	/*
50bc7377e5Srillig 	 * A sizeof expression is another way to create nested
51bc7377e5Srillig 	 * initializations.
52bc7377e5Srillig 	 */
53bc7377e5Srillig 	struct point p2 = {
54bc7377e5Srillig 		(int)sizeof(struct point){
55bc7377e5Srillig 			(int)sizeof(struct point){
56bc7377e5Srillig 				(int)sizeof(struct point){
57bc7377e5Srillig 					(int)sizeof(struct point){
58bc7377e5Srillig 						0,
59bc7377e5Srillig 						0,
60bc7377e5Srillig 					},
61bc7377e5Srillig 					0,
62bc7377e5Srillig 				},
63bc7377e5Srillig 				0,
64bc7377e5Srillig 			},
65bc7377e5Srillig 			0,
66bc7377e5Srillig 		},
67bc7377e5Srillig 		0,
68bc7377e5Srillig 	};
699e1bfe0eSrillig }
70