C++ PATCH: PR 13529
Mark Mitchell
mark@codesourcery.com
Mon Jan 5 01:53:00 GMT 2004
This patch fixes a buglet in my much-maligned implementation of
"offsetof".
Tested on i686-pc-linux-gnu, applied on the mainline.
--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com
2004-01-04 Mark Mitchell <mark@codesourcery.com>
PR c++/13529
* parser.c (cp_parser_postfix_expression): Allow "." to appear in
an offsetof expression.
2004-01-04 Mark Mitchell <mark@codesourcery.com>
PR c++/13529
* g++.dg/parse/offsetof3.C: New test.
Index: parser.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/parser.c,v
retrieving revision 1.144
retrieving revision 1.145
diff -c -5 -p -r1.144 -r1.145
*** parser.c 4 Jan 2004 22:42:16 -0000 1.144
--- parser.c 5 Jan 2004 01:30:10 -0000 1.145
*************** cp_parser_postfix_expression (cp_parser
*** 3907,3918 ****
operator. */
parser->context->object_type = NULL_TREE;
/* These operators may not appear in constant-expressions. */
if (parser->integral_constant_expression_p
/* The "->" operator is allowed in the implementation
! of "offsetof". */
! && !(parser->in_offsetof_p && token_type == CPP_DEREF))
{
if (!parser->allow_non_integral_constant_expression_p)
postfix_expression
= (cp_parser_non_integral_constant_expression
(token_type == CPP_DEREF ? "'->'" : "`.'"));
--- 3907,3919 ----
operator. */
parser->context->object_type = NULL_TREE;
/* These operators may not appear in constant-expressions. */
if (parser->integral_constant_expression_p
/* The "->" operator is allowed in the implementation
! of "offsetof". The "." operator may appear in the
! name of the member. */
! && !parser->in_offsetof_p)
{
if (!parser->allow_non_integral_constant_expression_p)
postfix_expression
= (cp_parser_non_integral_constant_expression
(token_type == CPP_DEREF ? "'->'" : "`.'"));
Index: testsuite/g++.dg/parse/offsetof3.C
===================================================================
RCS file: testsuite/g++.dg/parse/offsetof3.C
diff -N testsuite/g++.dg/parse/offsetof3.C
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/g++.dg/parse/offsetof3.C 5 Jan 2004 01:49:35 -0000
***************
*** 0 ****
--- 1,11 ----
+ // PR c++/13529
+
+ #include <cstddef>
+
+ struct A { int i; };
+ struct B { A a; };
+
+ int main()
+ {
+ return offsetof(B,a.i) != 0;
+ }
More information about the Gcc-patches
mailing list