OSDN Git Service

PR c++/11072
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Jul 2003 14:30:53 +0000 (14:30 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Jul 2003 14:30:53 +0000 (14:30 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@68831 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ginclude/stddef.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/offsetof2.C
gcc/testsuite/g++.dg/other/offsetof5.C [new file with mode: 0644]

index c832f24..89afad4 100644 (file)
@@ -1,3 +1,8 @@
+2003-07-02  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/11072
+       * ginclude/stddef.h (offsetof): Remove cast to 'char &'. Explain why.
+
 2003-07-02  Andreas Schwab  <schwab@suse.de>
 
        * dbxout.c (pending_bincls): Only define if DBX_DEBUGGING_INFO.
@@ -6209,6 +6214,7 @@ Fri May 23 21:19:31 CEST 2003  Jan Hubicka  <jh@suse.cz>
 2003-05-18  Neil Booth  <neil@daikokuya.co.uk>
 
        * config/sparc/sparc.h: Define sparc for now.
+
 2003-05-18  Nathanael Nerode  <neroden@gcc.gnu.org>
 
        * config.gcc: Clear xm_file, md_file at the beginning of each pass.
index ad091ea..d19d78a 100644 (file)
@@ -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__
index 7f3678c..78f0f59 100644 (file)
@@ -1,5 +1,9 @@
 2003-07-02  Nathan Sidwell  <nathan@codesourcery.com>
 
+       PR c++/11072
+       * g++.dg/other/offsetof2.C: XFAIL.
+       * g++.dg/other/offsetof5.C: New.
+
        PR c++/10219
        * g++.dg/template/error1.C: New.
        
index 3ab6398..64b4fbd 100644 (file)
@@ -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 <stddef.h>
 
 struct POD1
diff --git a/gcc/testsuite/g++.dg/other/offsetof5.C b/gcc/testsuite/g++.dg/other/offsetof5.C
new file mode 100644 (file)
index 0000000..40a4406
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 30 June 2003 <nathan@codesourcery.com>
+
+// PR c++ 11072, DR 273's solution is broken
+
+#include <stddef.h>
+
+struct F
+{
+  char i;
+  char j;
+};
+
+static int ary[offsetof (F, j)];
+