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