summaryrefslogtreecommitdiff
path: root/gcc/ginclude
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ginclude')
-rw-r--r--gcc/ginclude/stddef.h21
1 files changed, 6 insertions, 15 deletions
diff --git a/gcc/ginclude/stddef.h b/gcc/ginclude/stddef.h
index d19d78a3140..1bb3e90bc9b 100644
--- a/gcc/ginclude/stddef.h
+++ b/gcc/ginclude/stddef.h
@@ -413,21 +413,12 @@ typedef __WINT_TYPE__ wint_t;
#ifndef __cplusplus
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#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> \
- (&static_cast<TYPE *> (0)->MEMBER))
+/* The cast to "char &" below avoids problems with user-defined
+ "operator &", which can appear in a POD type. */
+#define offsetof(TYPE, MEMBER) \
+ (__offsetof__ (reinterpret_cast <size_t> \
+ (&reinterpret_cast <char &> \
+ (static_cast<TYPE *> (0)->MEMBER))))
#endif /* C++ */
#endif /* _STDDEF_H was defined this time */