From 42c244d8479bf2900995626586b8ec25b9b3eb5a Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Fri, 27 Aug 2004 14:48:12 -0700 Subject: [PATCH] cp-tree.def (OFFSETOF_EXPR): New. * cp-tree.def (OFFSETOF_EXPR): New. * parser.c (cp_parser_builtin_offsetof): Either built an OFFSETOF_EXPR, or call fold_offsetof immediately. * pt.c (tsubst_expr): Handle OFFSETOF_EXPR. From-SVN: r86679 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/cp-tree.def | 3 +++ gcc/cp/parser.c | 18 ++++++------------ gcc/cp/pt.c | 5 +++++ 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a4796a1ec16..afd820fb222 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2004-08-27 Richard Henderson + + * cp-tree.def (OFFSETOF_EXPR): New. + * parser.c (cp_parser_builtin_offsetof): Either built an + OFFSETOF_EXPR, or call fold_offsetof immediately. + * pt.c (tsubst_expr): Handle OFFSETOF_EXPR. + 2004-08-27 Nathan Sidwell * call.c (validate_conversion_obstack): Replace diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def index d3629fd98e2..02afea97a50 100644 --- a/gcc/cp/cp-tree.def +++ b/gcc/cp/cp-tree.def @@ -282,6 +282,9 @@ DEFTREECODE (TAG_DEFN, "tag_defn", 'e', 0) DEFTREECODE (TINST_LEVEL, "TINST_LEVEL", 'x', 0) +/* Represents an 'offsetof' expression during template expansion. */ +DEFTREECODE (OFFSETOF_EXPR, "offsetof_expr", 'e', 1) + /* Local variables: mode:c diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9d5e18b723a..c0d5227a7a1 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5876,18 +5876,12 @@ cp_parser_builtin_offsetof (cp_parser *parser) } success: - /* We've finished the parsing, now finish with the semantics. At present - we're just mirroring the traditional macro implementation. Better - would be to do the lowering of the ADDR_EXPR to flat pointer arithmetic - here rather than in build_x_unary_op. */ - - expr = (build_reinterpret_cast - (build_reference_type (cp_build_qualified_type - (char_type_node, - TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)), - expr)); - expr = build_x_unary_op (ADDR_EXPR, expr); - expr = build_reinterpret_cast (size_type_node, expr); + /* If we're processing a template, we can't finish the semantics yet. + Otherwise we can fold the entire expression now. */ + if (processing_template_decl) + expr = build1 (OFFSETOF_EXPR, size_type_node, expr); + else + expr = fold_offsetof (expr); failure: parser->integral_constant_expression_p = save_ice_p; diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index c198118a855..a979e83896f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8092,6 +8092,11 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) tsubst (TREE_TYPE (t), args, complain, NULL_TREE); break; + case OFFSETOF_EXPR: + t = tsubst_copy_and_build (TREE_OPERAND (t, 0), args, complain, + in_decl, false); + return fold_offsetof (t); + default: if (!STATEMENT_CODE_P (TREE_CODE (t))) return tsubst_copy_and_build (t, args, complain, in_decl, -- 2.30.2