re PR c++/27601 (ICE (in fold_offsetof_1, at c-common.c:5998) on strange offsetof)
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. * g++.dg/ext/offsetof1.C: Test member functions. From-SVN: r114469
This commit is contained in:
parent
1af3e54d50
commit
c291f8b146
@ -1,3 +1,12 @@
|
||||
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-06-06 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/27177
|
||||
|
@ -4252,6 +4252,7 @@ extern tree finish_id_expression (tree, tree, tree,
|
||||
bool, 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);
|
||||
|
@ -6036,7 +6036,7 @@ cp_parser_builtin_offsetof (cp_parser *parser)
|
||||
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;
|
||||
|
@ -9126,7 +9126,7 @@ tsubst_copy_and_build (tree t,
|
||||
in_decl));
|
||||
|
||||
case OFFSETOF_EXPR:
|
||||
return fold_offsetof (RECUR (TREE_OPERAND (t, 0)));
|
||||
return finish_offsetof (RECUR (TREE_OPERAND (t, 0)));
|
||||
|
||||
case STMT_EXPR:
|
||||
{
|
||||
|
@ -2881,6 +2881,23 @@ finish_typeof (tree 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. */
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2006-06-07 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
||||
|
||||
PR c++/27601
|
||||
* g++.dg/ext/offsetof1.C: Test member functions.
|
||||
|
||||
2006-06-07 Steve Ellcey <sje@cup.hp.com>
|
||||
|
||||
* gcc.dg/pr27095.c: Improve scanning.
|
||||
|
@ -4,6 +4,9 @@
|
||||
|
||||
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" }
|
||||
|
Loading…
Reference in New Issue
Block a user