+2006-06-07 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/27601
+ * cp-tree.h (finish_offsetof): Add prototype.
+ * semantics.c (finish_offsetof): New function.
+ * parser.c (cp_parser_builtin_offsetof): Call it instead of
+ fold_offsetof.
+ * pt.c (tsubst_copy_and_build): Likewise.
+
2006-05-29 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/27713
bool, bool, bool *,
const char **);
extern tree finish_typeof (tree);
+extern tree finish_offsetof (tree);
extern void finish_decl_cleanup (tree, tree);
extern void finish_eh_cleanup (tree);
extern void expand_body (tree);
if (processing_template_decl)
expr = build1 (OFFSETOF_EXPR, size_type_node, expr);
else
- expr = fold_offsetof (expr);
+ expr = finish_offsetof (expr);
failure:
parser->integral_constant_expression_p = save_ice_p;
in_decl));
case OFFSETOF_EXPR:
- return fold_offsetof (RECUR (TREE_OPERAND (t, 0)));
+ return finish_offsetof (RECUR (TREE_OPERAND (t, 0)));
case STMT_EXPR:
{
return type;
}
+/* Perform C++-specific checks for __builtin_offsetof before calling
+ fold_offsetof. */
+
+tree
+finish_offsetof (tree expr)
+{
+ if (TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE
+ || TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE
+ || TREE_CODE (TREE_TYPE (expr)) == UNKNOWN_TYPE)
+ {
+ error ("cannot apply %<offsetof%> to member function %qD",
+ TREE_OPERAND (expr, 1));
+ return error_mark_node;
+ }
+ return fold_offsetof (expr);
+}
+
/* Called from expand_body via walk_tree. Replace all AGGR_INIT_EXPRs
with equivalent CALL_EXPRs. */
+2006-06-07 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/27601
+ * g++.dg/ext/offsetof1.C: Test member functions.
+
2006-06-06 Roger Sayle <roger@eyesopen.com>
PR target/26223
struct bar {
static int foo;
+ static int baz();
};
int a = __builtin_offsetof(bar, foo); // { dg-error "static data member" }
+int b = __builtin_offsetof(bar, baz); // { dg-error "member function" }
+int c = __builtin_offsetof(bar, ~bar); // { dg-error "member function" }