re PR c++/7598 (offsetof broken)

cp:
	PR c++/7598
	* typeck.c (build_unary_op): Fold offsetof idiom. Fixes
	regression caused by my 2002-08-08 patch.
testsuite:
	* g++.dg/other/offsetof1.C: New test

From-SVN: r56346
This commit is contained in:
Nathan Sidwell 2002-08-15 10:34:05 +00:00 committed by Nathan Sidwell
parent 61f02ff548
commit eac5ce6c93
4 changed files with 42 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2002-08-15 Nathan Sidwell <nathan@codesourcery.com>
PR c++/7598
* typeck.c (build_unary_op): Fold offsetof idiom. Fixes
regression caused by my 2002-08-08 patch.
2002-08-13 Mark Mitchell <mark@codesourcery.com>
* decl.c (pushdecl_class_level): Honor requests to bind names to

View File

@ -4256,6 +4256,24 @@ build_unary_op (code, xarg, noconvert)
TREE_OPERAND (arg, 1));
return error_mark_node;
}
else if (TREE_CODE (arg) == COMPONENT_REF
&& TREE_CODE (TREE_OPERAND (arg, 0)) == INDIRECT_REF
&& (TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg, 0), 0))
== INTEGER_CST))
{
/* offsetof idiom, fold it. */
tree field = TREE_OPERAND (arg, 1);
tree rval = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), 0);
tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (rval)),
decl_type_context (field),
ba_check, NULL);
rval = build_base_path (PLUS_EXPR, rval, binfo, 1);
rval = build1 (NOP_EXPR, argtype, rval);
TREE_CONSTANT (rval) = TREE_CONSTANT (TREE_OPERAND (rval, 0));
addr = fold (build (PLUS_EXPR, argtype, rval,
cp_convert (argtype, byte_position (field))));
}
else
addr = build1 (ADDR_EXPR, argtype, arg);

View File

@ -1,3 +1,7 @@
2002-08-15 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/other/offsetof1.C: New test.
2002-08-14 Richard Henderson <rth@redhat.com>
* gcc.dg/tls/diag-3.c: Fix expected message strings.

View File

@ -0,0 +1,14 @@
// { dg-do compile }
// Copyright (C) 2002 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 14 Aug 2002 <nathan@codesourcery.com>
// PR c++ 7598, offsetof broke
struct F
{
char i;
char j;
};
static int ary[((unsigned) &((struct F *)0)->j)];