cp-tree.def (OFFSETOF_EXPR): New.
authorRichard Henderson <rth@redhat.com>
Fri, 27 Aug 2004 21:48:12 +0000 (14:48 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 27 Aug 2004 21:48:12 +0000 (14:48 -0700)
        * 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
gcc/cp/cp-tree.def
gcc/cp/parser.c
gcc/cp/pt.c

index a4796a1ec16db70cea37ef73d29111002f7b496e..afd820fb222444e670cf93a18f474dcd40db5452 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 d3629fd98e2c4f6424b577124692d3475cf8a38c..02afea97a50245e9669eeb50e2fe19f5abeef0ff 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 9d5e18b723a3709aedabb4767b6ab5e3b6f71209..c0d5227a7a163baef243ca4781e4835c175c8219 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 c198118a855a5515b547152bcd3dfe5eca3a5d47..a979e83896f27846183aa3529c53228f7569b979 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,