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:
Volker Reichelt 2006-06-07 16:08:30 +00:00 committed by Volker Reichelt
parent 1af3e54d50
commit c291f8b146
7 changed files with 37 additions and 2 deletions

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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:
{

View File

@ -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. */

View File

@ -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.

View File

@ -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" }