On 2022-09-18 07:14, Bruno Haible via cfarm-users wrote: > On the gcc119 (AIX 7.2) machine, there are two problems:
Should I be porting anythnig to AIX? Does anyone use it any more? Simple code like this doesn't compile: #include <netinet/in.h> // ... void foo(struct in6_addr *addr) { return bar(addr->s6_addr, 16); } gcc complains: error: 'union <anonymous>' has no member named 's6_addr'; did you mean 's6_addr8'? Getting stuff working on this platform seems like make-work, for the benefit of approximately zero users. Look what they have in the header: #ifndef _IN6_ADDR_STRUCT struct in6_addr { union { uint32_t s6_addr32[4]; #ifdef notyet uint64_t s6_addr64[2]; #endif /* notyet */ uint16_t s6_addr16[8]; uint8_t s6_addr8[16]; } s6_addr; }; #define s6_addr32 s6_addr.s6_addr32 #ifdef notyet #define s6_addr64 s6_addr.s6_addr64 #endif /* notyet */ #define s6_addr16 s6_addr.s6_addr16 #define s6_addr8 s6_addr.s6_addr8 // macro B #define s6_addr s6_addr.s6_addr8 // macro A #define INET6_ADDRSTRLEN 46 #define _IN6_ADDR_STRUCT #endif /* _IN6_ADDR_STRUCT */ Given foo->s6_addr, we get this expansion foo->s6_addr.s6_addr8 // via macro A foo->s6_addr.s6_addr.s8_addr // via macro B They have a bunch of the same identifiers unhygienically both sides of the macro definitions, and also called the internal union s6_addr, instead of taking advantage of the implementation reserved namespace: ifndef _IN6_ADDR_STRUCT struct in6_addr { union { /* ... */ uint8_t __s6_addr8[16]; } __s6_addr_u; }; #define s6_addr8 __s6_addr_u.__s6_addr8 // actually, don't even expose this!!! #define s6_addr __s6_addr_u.__s6_addr8 #define _IN6_ADDR_STRUCT #endif /* _IN6_ADDR_STRUCT */ _______________________________________________ cfarm-users mailing list cfarm-users@lists.tetaneutral.net https://lists.tetaneutral.net/listinfo/cfarm-users