From eac5ce6c93ebae62a03b741975086d5b09151334 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Thu, 15 Aug 2002 10:34:05 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/typeck.c | 18 ++++++++++++++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/other/offsetof1.C | 14 ++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 gcc/testsuite/g++.dg/other/offsetof1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0ab00f6c2b9..27e5bc72e8a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2002-08-15 Nathan Sidwell + + 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 * decl.c (pushdecl_class_level): Honor requests to bind names to diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index f8bc3786358..de3c0596e3c 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 69a99ff071f..d0694f380cb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-08-15 Nathan Sidwell + + * g++.dg/other/offsetof1.C: New test. + 2002-08-14 Richard Henderson * gcc.dg/tls/diag-3.c: Fix expected message strings. diff --git a/gcc/testsuite/g++.dg/other/offsetof1.C b/gcc/testsuite/g++.dg/other/offsetof1.C new file mode 100644 index 00000000000..1051cd28cfe --- /dev/null +++ b/gcc/testsuite/g++.dg/other/offsetof1.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Aug 2002 + +// PR c++ 7598, offsetof broke + +struct F +{ + char i; + char j; +}; + +static int ary[((unsigned) &((struct F *)0)->j)]; -- 2.30.2