* cp-tree.def (OFFSETOF_EXPR): New.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Aug 2004 21:48:12 +0000 (21:48 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Aug 2004 21:48:12 +0000 (21:48 +0000)
        * parser.c (cp_parser_builtin_offsetof): Either built an
        OFFSETOF_EXPR, or call fold_offsetof immediately.
        * pt.c (tsubst_expr): Handle OFFSETOF_EXPR.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86679 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.def
gcc/cp/parser.c
gcc/cp/pt.c

index a4796a1..afd820f 100644 (file)
@@ -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
index d3629fd..02afea9 100644 (file)
@@ -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
index 9d5e18b..c0d5227 100644 (file)
@@ -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;
index c198118..a979e83 100644 (file)
@@ -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,