xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_105.c (revision a89419496ccb82ce1bff984f79f626ab7d0ff245)
1 /*	$NetBSD: msg_105.c,v 1.4 2022/06/19 12:14:34 rillig Exp $	*/
2 # 3 "msg_105.c"
3 
4 /* Test for message: non-unique member requires struct/union %s [105] */
5 
6 /* lint1-flags: -tw */
7 
8 /*
9  * In traditional C, the expression 'x->y' did not only allow struct or union
10  * pointers for 'x', but in fact any scalar expression, which would then be
11  * dereferenced as if it were a struct or union.
12  *
13  * This led to ambiguities if several structs had a member of the same name
14  * but with different offsets.  In such a case, that member name could only
15  * be used with one of its actual struct types.
16  */
17 
18 struct one {
19 	int member;
20 };
21 
22 struct two {
23 	int before_member;	/* make the offset of 'member' different */
24 	int member;
25 };
26 
27 struct three {
28 	int x;
29 	int y;
30 };
31 
32 int
example(x)33 example(x)
34 	int *x;
35 {
36 	/* expect+1: error: non-unique member requires struct/union pointer [105] */
37 	return x->member;
38 }
39 
40 int
member_of_wrong_struct(t)41 member_of_wrong_struct(t)
42 	struct three *t;
43 {
44 	/* expect+1: error: illegal use of member 'member' [102] */
45 	return t->member;
46 }
47