diff options
Diffstat (limited to 'gcc/ginclude')
-rw-r--r-- | gcc/ginclude/stddef.h | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/gcc/ginclude/stddef.h b/gcc/ginclude/stddef.h index ad091ea1383..d19d78a3140 100644 --- a/gcc/ginclude/stddef.h +++ b/gcc/ginclude/stddef.h @@ -409,16 +409,26 @@ typedef __WINT_TYPE__ wint_t; #ifdef _STDDEF_H -/* Offset of member MEMBER in a struct of type TYPE. */ +/* Offset of member MEMBER in a struct of type TYPE. */ #ifndef __cplusplus #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) -#else /* C++ */ -/* The reference cast is necessary to thwart an operator& that might - be applicable to MEMBER's type. See DR 273 for details. */ +#else +/* In C++ a POD type can have a user defined address-of operator, and + that will break offsetof. C++ core defect 273 addresses this and + claims that reinterpret_casts to char & type are sufficient to + overcome this problem. + + (reinterpret_cast <size_t> + (&reinterpret_cast <char &>(static_cast <TYPE *> (0)->MEMBER))) + + But, such casts are not permitted in integral constant expressions, + which offsetof is supposed to be. + + It appears that offsetof is unimplementable in C++ without a + compiler extension. */ #define offsetof(TYPE, MEMBER) (reinterpret_cast <size_t> \ - (&reinterpret_cast <char &>(static_cast <TYPE *> (0)->MEMBER))) + (&static_cast<TYPE *> (0)->MEMBER)) #endif /* C++ */ - #endif /* _STDDEF_H was defined this time */ #endif /* !_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__ |