diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 64068a2cab5ae210f242e579a0c7ff608d7c678f..583d13ff584cc684f0c6e726a0eea1e6c0f29669 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2003-07-28 Mark Mitchell <mark@codesourcery.com> + + PR c++/11530 + * parser.c (cp_parser_postfix_expression): Do not call mark_used. + * semantics.c (finish_id_expression): Call mark_used for all + declarations. + 2003-07-28 Mark Mitchell <mark@codesourcery.com> PR c++/11667 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 1b7b3def8b792e91d835e56087ba0fa57103e4e3..00f1c6eda4fe3a2d7ff14aa6a56cfd46b968dfa6 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -3428,10 +3428,6 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p) return postfix_expression; } - /* Remember that there was a reference to this entity. */ - if (DECL_P (postfix_expression)) - mark_used (postfix_expression); - /* Keep looping until the postfix-expression is complete. */ while (true) { diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index abfe08633d6f9b90812f86f548015ae4ca79a9d0..bf30ca08b8f1045e91ef9751eaed9e0f8e009fa8 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2486,19 +2486,8 @@ finish_id_expression (tree id_expression, *non_constant_expression_p = true; } } - - if (scope) - { - decl = (adjust_result_of_qualified_name_lookup - (decl, scope, current_class_type)); - if (TREE_CODE (decl) == FIELD_DECL || BASELINK_P (decl)) - *qualifying_class = scope; - else if (!processing_template_decl) - decl = convert_from_reference (decl); - else if (TYPE_P (scope)) - decl = build (SCOPE_REF, TREE_TYPE (decl), scope, decl); - } - else if (TREE_CODE (decl) == NAMESPACE_DECL) + + if (TREE_CODE (decl) == NAMESPACE_DECL) { error ("use of namespace `%D' as expression", decl); return error_mark_node; @@ -2516,6 +2505,25 @@ finish_id_expression (tree id_expression, print_candidates (decl); return error_mark_node; } + + /* Mark variable-like entities as used. Functions are similarly + marked either below or after overload resolution. */ + if (TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == PARM_DECL + || TREE_CODE (decl) == RESULT_DECL) + mark_used (decl); + + if (scope) + { + decl = (adjust_result_of_qualified_name_lookup + (decl, scope, current_class_type)); + if (TREE_CODE (decl) == FIELD_DECL || BASELINK_P (decl)) + *qualifying_class = scope; + else if (!processing_template_decl) + decl = convert_from_reference (decl); + else if (TYPE_P (scope)) + decl = build (SCOPE_REF, TREE_TYPE (decl), scope, decl); + } else if (TREE_CODE (decl) == FIELD_DECL) decl = finish_non_static_data_member (decl, current_class_ref, /*qualifying_scope=*/NULL_TREE); @@ -2525,7 +2533,10 @@ finish_id_expression (tree id_expression, if (TREE_CODE (first_fn) == TEMPLATE_DECL) first_fn = DECL_TEMPLATE_RESULT (first_fn); - + + if (!really_overloaded_fn (decl)) + mark_used (first_fn); + if (TREE_CODE (first_fn) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (first_fn)) { @@ -2533,9 +2544,6 @@ finish_id_expression (tree id_expression, decl = maybe_dummy_object (DECL_CONTEXT (first_fn), 0); return finish_class_member_access_expr (decl, id_expression); } - else if (!really_overloaded_fn (decl)) - /* not really overloaded function */ - mark_used (first_fn); } else { @@ -2566,8 +2574,6 @@ finish_id_expression (tree id_expression, perform_or_defer_access_check (TYPE_BINFO (path), decl); } - mark_used (decl); - if (! processing_template_decl) decl = convert_from_reference (decl); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f0171688fcbc55b358e7edd7df790b33185744bc..6b59e6a9b0c4c478b6cdc01996803722319efe79 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-07-28 Jan Hubicka <jh@suse.cz> + + PR c++/11530 + * g++.dg/opt/call1.C: New test. + 2003-07-28 Alexandre Oliva <aoliva@redhat.com> PR c++/11667 diff --git a/gcc/testsuite/g++.dg/opt/call1.C b/gcc/testsuite/g++.dg/opt/call1.C new file mode 100644 index 0000000000000000000000000000000000000000..642e024084927a7dd7ac4cfbbf969bbd2cccb33a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/call1.C @@ -0,0 +1,21 @@ +// { dg-options "-O2" } + +void a (void (*f)()) +{ + f(); +} + +struct RunState +{ + static void runcallback() { } + static void wait() + { + a (runcallback); + } +}; + +int main() +{ + RunState::wait(); + return 0; +}