Home | History | Annotate | Line # | Download | only in lint1
      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