From: Volker Reichelt Date: Wed, 7 Jun 2006 16:18:06 +0000 (+0000) Subject: re PR c++/27601 (ICE (in fold_offsetof_1, at c-common.c:5998) on strange offsetof) X-Git-Tag: releases/gcc-4.0.4~632 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a90bf3ce4b0223c08ad4472d3b5c54e1bad6ff3b;p=thirdparty%2Fgcc.git 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: r114471 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2adc98979760..9b2715c199aa 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2006-06-07 Volker Reichelt + + 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 PR c++/27713 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index e867d913f788..47db45f797e5 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4215,6 +4215,7 @@ extern tree finish_id_expression (tree, tree, tree, 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); diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 7035645c3594..7eb05e8316c1 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5911,7 +5911,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; diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e4b2d70add85..18c345383cec 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8941,7 +8941,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: { diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 6006621c97a5..e873e4425f96 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2784,6 +2784,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 % 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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b65d909a810a..55f39720f424 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-06-07 Volker Reichelt + + PR c++/27601 + * g++.dg/ext/offsetof1.C: Test member functions. + 2006-06-06 Roger Sayle PR target/26223 diff --git a/gcc/testsuite/g++.dg/ext/offsetof1.C b/gcc/testsuite/g++.dg/ext/offsetof1.C index 5d6552f78787..0cfabf8033c9 100644 --- a/gcc/testsuite/g++.dg/ext/offsetof1.C +++ b/gcc/testsuite/g++.dg/ext/offsetof1.C @@ -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" }