Skip to content

Commit

Permalink
Split dummy in region inference graph into distinct source and sink n…
Browse files Browse the repository at this point in the history
…odes.

Why do this: The RegionGraph representation previously conflated all
of the non-variable regions (i.e. the concrete regions such as
lifetime parameters to the current function) into a single dummy node.

A single dummy node leads DFS on a graph `'a -> '_#1 -> '_#0 -> 'b` to
claim that `'_#1` is reachable from `'_#0` (due to `'a` and `'b` being
conflated in the graph representation), which is incorrect (and can
lead to soundness bugs later on in compilation, see rust-lang#30438).

Splitting the dummy node ensures that DFS will never introduce new
ancestor relationships between nodes for variable regions in the
graph.
  • Loading branch information
pnkfelix committed Feb 18, 2016
1 parent 36237fc commit d15ca96
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions src/librustc/middle/infer/region_inference/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1105,7 +1105,14 @@ impl<'a, 'tcx> RegionVarBindings<'a, 'tcx> {
for _ in 0..num_vars {
graph.add_node(());
}
let dummy_idx = graph.add_node(());

// Issue #30438: two distinct dummy nodes, one for incoming
// edges (dummy_source) and another for outgoing edges
// (dummy_sink). In `dummy -> a -> b -> dummy`, using one
// dummy node leads one to think (erroneously) there exists a
// path from `b` to `a`. Two dummy nodes sidesteps the issue.
let dummy_source = graph.add_node(());
let dummy_sink = graph.add_node(());

for (constraint, _) in constraints.iter() {
match *constraint {
Expand All @@ -1115,10 +1122,10 @@ impl<'a, 'tcx> RegionVarBindings<'a, 'tcx> {
*constraint);
}
ConstrainRegSubVar(_, b_id) => {
graph.add_edge(dummy_idx, NodeIndex(b_id.index as usize), *constraint);
graph.add_edge(dummy_source, NodeIndex(b_id.index as usize), *constraint);
}
ConstrainVarSubReg(a_id, _) => {
graph.add_edge(NodeIndex(a_id.index as usize), dummy_idx, *constraint);
graph.add_edge(NodeIndex(a_id.index as usize), dummy_sink, *constraint);
}
}
}
Expand Down

0 comments on commit d15ca96

Please sign in to comment.