===================================================================
@@ -92,9 +92,7 @@ can_remove_node_now_p_1 (struct cgraph_n
those only after all devirtualizable virtual calls are processed.
Lacking may edges in callgraph we just preserve them post
inlining. */
- && (!DECL_VIRTUAL_P (node->symbol.decl)
- || (!DECL_COMDAT (node->symbol.decl)
- && !DECL_EXTERNAL (node->symbol.decl)))
+ && !DECL_VIRTUAL_P (node->symbol.decl)
/* During early inlining some unanalyzed cgraph nodes might be in the
callgraph and they might reffer the function in question. */
&& !cgraph_new_nodes);
===================================================================
@@ -241,8 +241,7 @@ symtab_remove_unreachable_nodes (bool be
&& (!cgraph_can_remove_if_no_direct_calls_and_refs_p (node)
/* Keep around virtual functions for possible devirtualization. */
|| (before_inlining_p
- && DECL_VIRTUAL_P (node->symbol.decl)
- && (DECL_COMDAT (node->symbol.decl) || DECL_EXTERNAL (node->symbol.decl)))))
+ && DECL_VIRTUAL_P (node->symbol.decl))))
{
gcc_assert (!node->global.inlined_to);
pointer_set_insert (reachable, node);
===================================================================
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-early-inlining -fno-weak" } */
+
+struct S
+{
+ S();
+ virtual inline void foo ()
+ {
+ foo();
+ }
+};
+
+void
+B ()
+{
+ S().foo ();
+}
===================================================================
@@ -1164,6 +1164,7 @@ cgraph_only_called_directly_or_aliased_p
gcc_assert (!node->global.inlined_to);
return (!node->symbol.force_output && !node->symbol.address_taken
&& !node->symbol.used_from_other_partition
+ && !DECL_VIRTUAL_P (node->symbol.decl)
&& !DECL_STATIC_CONSTRUCTOR (node->symbol.decl)
&& !DECL_STATIC_DESTRUCTOR (node->symbol.decl)
&& !node->symbol.externally_visible);
===================================================================
@@ -319,6 +319,7 @@ cgraph_create_virtual_clone (struct cgra
TREE_PUBLIC (new_node->symbol.decl) = 0;
DECL_COMDAT (new_node->symbol.decl) = 0;
DECL_WEAK (new_node->symbol.decl) = 0;
+ DECL_VIRTUAL_P (new_node->symbol.decl) = 0;
DECL_STATIC_CONSTRUCTOR (new_node->symbol.decl) = 0;
DECL_STATIC_DESTRUCTOR (new_node->symbol.decl) = 0;
new_node->clone.tree_map = tree_map;