From: Nathan Sidwell Date: Wed, 2 Jul 2003 14:30:53 +0000 (+0000) Subject: re PR c++/11072 (Implementation of offsetof macro) X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=300e89a2b66eb8d9d9467168251927525d5c4fe8;p=platform%2Fupstream%2Fgcc.git re PR c++/11072 (Implementation of offsetof macro) PR c++/11072 * ginclude/stddef.h (offsetof): Remove cast to 'char &'. Explain why. testsuite: PR c++/11072 * g++.dg/other/offsetof2.C: XFAIL. * g++.dg/other/offsetof5.C: New. From-SVN: r68831 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c832f24..89afad4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-07-02 Nathan Sidwell + + PR c++/11072 + * ginclude/stddef.h (offsetof): Remove cast to 'char &'. Explain why. + 2003-07-02 Andreas Schwab * dbxout.c (pending_bincls): Only define if DBX_DEBUGGING_INFO. @@ -6209,6 +6214,7 @@ Fri May 23 21:19:31 CEST 2003 Jan Hubicka 2003-05-18 Neil Booth * config/sparc/sparc.h: Define sparc for now. + 2003-05-18 Nathanael Nerode * config.gcc: Clear xm_file, md_file at the beginning of each pass. diff --git a/gcc/ginclude/stddef.h b/gcc/ginclude/stddef.h index ad091ea..d19d78a 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 + (&reinterpret_cast (static_cast (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 \ - (&reinterpret_cast (static_cast (0)->MEMBER))) + (&static_cast (0)->MEMBER)) #endif /* C++ */ - #endif /* _STDDEF_H was defined this time */ #endif /* !_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7f3678c..78f0f59 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2003-07-02 Nathan Sidwell + PR c++/11072 + * g++.dg/other/offsetof2.C: XFAIL. + * g++.dg/other/offsetof5.C: New. + PR c++/10219 * g++.dg/template/error1.C: New. diff --git a/gcc/testsuite/g++.dg/other/offsetof2.C b/gcc/testsuite/g++.dg/other/offsetof2.C index 3ab6398..64b4fbd 100644 --- a/gcc/testsuite/g++.dg/other/offsetof2.C +++ b/gcc/testsuite/g++.dg/other/offsetof2.C @@ -1,4 +1,4 @@ -// { dg-do run } +// { dg-do run { xfail *-*-* } } // { dg-options -Wold-style-cast } // Copyright (C) 2003 Free Software Foundation, Inc. @@ -6,6 +6,8 @@ // DR273 POD can have an operator&, offsetof is still required to work +// XFAILED - you can't write offsetof without an extension + #include struct POD1 diff --git a/gcc/testsuite/g++.dg/other/offsetof5.C b/gcc/testsuite/g++.dg/other/offsetof5.C new file mode 100644 index 0000000..40a4406 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/offsetof5.C @@ -0,0 +1,17 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 June 2003 + +// PR c++ 11072, DR 273's solution is broken + +#include + +struct F +{ + char i; + char j; +}; + +static int ary[offsetof (F, j)]; +