Home | History | Annotate | Line # | Download | only in lint1
      1  1.9  rillig /*	$NetBSD: msg_171.c,v 1.9 2023/07/07 19:45:22 rillig Exp $	*/
      2  1.1  rillig # 3 "msg_171.c"
      3  1.1  rillig 
      4  1.4  rillig // Test for message: cannot assign to '%s' from '%s' [171]
      5  1.1  rillig 
      6  1.9  rillig /* lint1-extra-flags: -X 351 */
      7  1.9  rillig 
      8  1.2  rillig struct s {
      9  1.2  rillig 	int member;
     10  1.2  rillig };
     11  1.2  rillig 
     12  1.2  rillig /*ARGSUSED*/
     13  1.2  rillig void
     14  1.2  rillig example(int i, void *vp, struct s *s)
     15  1.2  rillig {
     16  1.8  rillig 	/* expect+1: error: cannot assign to 'int' from 'struct s' [171] */
     17  1.8  rillig 	i = *s;
     18  1.8  rillig 	/* expect+1: error: cannot assign to 'struct s' from 'int' [171] */
     19  1.8  rillig 	*s = i;
     20  1.8  rillig 
     21  1.8  rillig 	/* expect+1: error: cannot assign to 'pointer to void' from 'struct s' [171] */
     22  1.8  rillig 	vp = *s;
     23  1.8  rillig 	/* expect+1: error: cannot assign to 'struct s' from 'pointer to void' [171] */
     24  1.8  rillig 	*s = vp;
     25  1.2  rillig }
     26  1.3  rillig 
     27  1.3  rillig /*
     28  1.3  rillig  * C99 6.5.2.5 says that a compound literal evaluates to an unnamed object
     29  1.3  rillig  * with automatic storage duration, like any normal named object.  It is an
     30  1.3  rillig  * lvalue, which means that it is possible to take the address of the object.
     31  1.3  rillig  * Seen in external/mpl/bind/dist/lib/dns/rbtdb.c, update_rrsetstats.
     32  1.6  rillig  *
     33  1.6  rillig  * Before init.c 1.111 from 2021-03-23, lint could not handle these nested
     34  1.6  rillig  * initializations (the outer one for the variable 'p', the inner one for the
     35  1.6  rillig  * compound literal) and wrongly complained about a type mismatch between
     36  1.6  rillig  * 'struct point' and 'pointer to struct point'.
     37  1.3  rillig  */
     38  1.3  rillig void
     39  1.3  rillig pointer_to_compound_literal(void)
     40  1.3  rillig {
     41  1.3  rillig 	struct point {
     42  1.3  rillig 		int x;
     43  1.3  rillig 		int y;
     44  1.3  rillig 	};
     45  1.3  rillig 	struct point *p = &(struct point){
     46  1.7  rillig 		12, 5,
     47  1.7  rillig 	};
     48  1.7  rillig 
     49  1.7  rillig 	/*
     50  1.7  rillig 	 * A sizeof expression is another way to create nested
     51  1.7  rillig 	 * initializations.
     52  1.7  rillig 	 */
     53  1.7  rillig 	struct point p2 = {
     54  1.7  rillig 		(int)sizeof(struct point){
     55  1.7  rillig 			(int)sizeof(struct point){
     56  1.7  rillig 				(int)sizeof(struct point){
     57  1.7  rillig 					(int)sizeof(struct point){
     58  1.7  rillig 						0,
     59  1.7  rillig 						0,
     60  1.7  rillig 					},
     61  1.7  rillig 					0,
     62  1.7  rillig 				},
     63  1.7  rillig 				0,
     64  1.7  rillig 			},
     65  1.7  rillig 			0,
     66  1.7  rillig 		},
     67  1.7  rillig 		0,
     68  1.6  rillig 	};
     69  1.3  rillig }
     70