diff options
author | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-12-16 16:09:23 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-12-16 16:09:23 +0000 |
commit | 263ee052390366c2476124b43a53cec7e5540187 (patch) | |
tree | 2b4a4284864e77f0905c40d1a718bb9eb360f8ac /gcc/ginclude | |
parent | ff5034c5be89c496e39b79b52cd496130c51fdb2 (diff) | |
download | gcc-263ee052390366c2476124b43a53cec7e5540187.tar.gz |
re PR c++/13275 (Implementation of offsetof macro)
PR c++/13275
* c-common.h (enum rid): Add RID_OFFSETOF.
* c-parser.in (rid_to_yy): Ignore RID_OFFSETOF.
* ginclude/stddef.h (offsetof): Reimplement for C++, using
__offsetof__.
* doc/extend.texi: Document __offsetof__.
PR c++/13275
* lex.c (reswords): Add "__offsetof" and "__offsetof__".
* parser.c (cp_parser): Add in_offsetof_p.
(cp_parser_new): Initialize it.
(cp_parser_primary_expression): Handle __offsetof__ (...).
(cp_parser_postfix_expression): Allow casts to pointer type and
uses of "->" in a constant expression if implementing offsetof.
(cp_parser_unary_expression): Allow the use of "&" in a constant
expression if implementing offsetof.
PR c++/13275
* g++.dg/other/offsetof2.C: Remove XFAIL.
* g++.dg/parse/offsetof1.C: New test.
* g++.gd/parse/offsetof2.C: Likewise.
From-SVN: r74702
Diffstat (limited to 'gcc/ginclude')
-rw-r--r-- | gcc/ginclude/stddef.h | 21 |
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 */ |