mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-12-12 05:13:50 +08:00
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
This commit is contained in:
parent
eaac6968d6
commit
300e89a2b6
@ -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.
|
||||
|
@ -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. */
|
||||
#define offsetof(TYPE, MEMBER) (reinterpret_cast <size_t> \
|
||||
(&reinterpret_cast <char &>(static_cast <TYPE *> (0)->MEMBER)))
|
||||
#endif /* C++ */
|
||||
#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))
|
||||
#endif /* C++ */
|
||||
#endif /* _STDDEF_H was defined this time */
|
||||
|
||||
#endif /* !_STDDEF_H && !_STDDEF_H_ && !_ANSI_STDDEF_H && !__STDDEF_H__
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
17
gcc/testsuite/g++.dg/other/offsetof5.C
Normal file
17
gcc/testsuite/g++.dg/other/offsetof5.C
Normal file
@ -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)];
|
||||
|
Loading…
Reference in New Issue
Block a user