--- /dev/null
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2 -Wall" }
+
+#include <cstdlib>
+#include <vector>
+
+typedef std::vector<int> v1;
+
+static
+void drop_inplace(v1 & c, size_t len)
+{
+ if (len <= c.size())
+ c[len-1] = 0; /* { dg-bogus "outside array bounds" } */
+}
+
+void func()
+{
+ v1 vec1{1,2,3,4,5,6};
+ drop_inplace(vec1, 10);
+}
}
}
}
+ /* Iterate to the single successor of bb2 with only a single executable
+ incoming edge. */
+ else if (EDGE_COUNT (bb2->succs) == 1
+ && EDGE_COUNT (single_succ (bb2)->preds) > 1)
+ {
+ edge prede = NULL;
+ FOR_EACH_EDGE (e, ei, single_succ (bb2)->preds)
+ if ((e->flags & EDGE_EXECUTABLE)
+ || (!allow_back && (e->flags & EDGE_DFS_BACK)))
+ {
+ if (prede)
+ {
+ prede = NULL;
+ break;
+ }
+ prede = e;
+ }
+ /* We might actually get to a query with BB2 not visited yet when
+ we're querying for a predicated value. */
+ if (prede && prede->src == bb2)
+ {
+ bb2 = prede->dest;
+
+ /* Re-do the dominance check with changed bb2. */
+ if (dominated_by_p (CDI_DOMINATORS, bb1, bb2))
+ return true;
+ }
+ }
/* We could now iterate updating bb1 / bb2. */
return false;