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