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