39 lines
1.2 KiB
C
39 lines
1.2 KiB
C
/* $NetBSD: msg_329.c,v 1.4 2022/06/17 06:59:16 rillig Exp $ */
|
|
# 3 "msg_329.c"
|
|
|
|
// Test for message: type '%s' is not a member of '%s' [329]
|
|
|
|
union u {
|
|
int i1;
|
|
int i2;
|
|
void *vp;
|
|
};
|
|
|
|
void
|
|
example(void)
|
|
{
|
|
/*
|
|
* A type cast to a union type is valid if the source type is any
|
|
* member type of the union. Since all union members with the same
|
|
* type have the same representation, the name of the union member
|
|
* doesn't matter.
|
|
*
|
|
* XXX: could there be padding bits or other tricky details that are
|
|
* settable per-member? These could make the type alone insufficient
|
|
* for determining the exact representation.
|
|
*
|
|
* C99 6.5.4 "Cast operators" does not mention a union cast. On the
|
|
* contrary, it says that the type name shall specify a scalar type.
|
|
*
|
|
* C11 6.5.4 "Cast operators" differs from C99 but still requires
|
|
* scalar types for both the target type and the source value.
|
|
*
|
|
* This is a GCC extension.
|
|
* See https://gcc.gnu.org/onlinedocs/gcc/Cast-to-Union.html.
|
|
*/
|
|
union u u_i1 = (union u)3;
|
|
union u u_vp = (union u)(void *)0;
|
|
/* expect+1: error: type 'pointer to char' is not a member of 'union u' [329] */
|
|
union u u_cp = (union u)(char *)0;
|
|
}
|