]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/11530 ([unit-at-a-time] inline static function not emitted with -O3)
authorMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 29 Jul 2003 01:57:47 +0000 (01:57 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 29 Jul 2003 01:57:47 +0000 (01:57 +0000)
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.

PR c++/11530
* g++.dg/opt/call1.C: New test.

From-SVN: r69911

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/call1.C [new file with mode: 0644]

index 64068a2cab5ae210f242e579a0c7ff608d7c678f..583d13ff584cc684f0c6e726a0eea1e6c0f29669 100644 (file)
@@ -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
index 1b7b3def8b792e91d835e56087ba0fa57103e4e3..00f1c6eda4fe3a2d7ff14aa6a56cfd46b968dfa6 100644 (file)
@@ -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)
     {
index abfe08633d6f9b90812f86f548015ae4ca79a9d0..bf30ca08b8f1045e91ef9751eaed9e0f8e009fa8 100644 (file)
@@ -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);
        }
index f0171688fcbc55b358e7edd7df790b33185744bc..6b59e6a9b0c4c478b6cdc01996803722319efe79 100644 (file)
@@ -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 (file)
index 0000000..642e024
--- /dev/null
@@ -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;
+}