mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-26 04:14:06 +08:00
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
This commit is contained in:
parent
a2fddff9be
commit
42c244d847
@ -1,3 +1,10 @@
|
||||
2004-08-27 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* 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 <nathan@codesourcery.com>
|
||||
|
||||
* call.c (validate_conversion_obstack): Replace
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user