===================================================================
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+class SnmpSyntax
+{
+public:
+ virtual SnmpSyntax *m_fn1 () const;
+ ~SnmpSyntax () {}
+ virtual SnmpSyntax &operator=(const SnmpSyntax &);
+};
+
+class A : public SnmpSyntax
+{
+public:
+ A (int);
+ SnmpSyntax *m_fn1 () const {}
+ SnmpSyntax &operator=(const SnmpSyntax &);
+};
+int a;
+void fn1 ()
+{
+ for (;; a++)
+ switch (0)
+ case 0:
+ {
+ A b (0);
+ SnmpSyntax &c = b;
+ c.m_fn1 ();
+ }
+}
+// Devirtualization to A::m_fn1 would be possible, but we can not do it at the moment
===================================================================
@@ -2658,8 +2658,6 @@ walk_aliased_vdefs_1 (ao_ref *ref, tree
bitmap *visited, unsigned int cnt,
bool *function_entry_reached)
{
- if (function_entry_reached)
- *function_entry_reached = false;
do
{
gimple def_stmt = SSA_NAME_DEF_STMT (vdef);
@@ -2709,6 +2707,9 @@ walk_aliased_vdefs (ao_ref *ref, tree vd
timevar_push (TV_ALIAS_STMT_WALK);
+ if (function_entry_reached)
+ *function_entry_reached = false;
+
ret = walk_aliased_vdefs_1 (ref, vdef, walker, data,
visited ? visited : &local_visited, 0,
function_entry_reached);
===================================================================
@@ -2777,6 +2777,8 @@ check_stmt_for_type_change (ao_ref *ao A
* BITS_PER_UNIT;
op = TREE_OPERAND (op, 0);
}
+ else if (DECL_P (op))
+ ;
else
{
tci->speculative = true;