@@ -79,7 +79,7 @@ impl<'tcx> BorrowsGraph<'tcx> {
79
79
for blocked in blocked_nodes {
80
80
if seen. insert ( blocked) {
81
81
let blocked_node = egraph. add ( get_node ( blocked, place_ids) ) ;
82
- add_to_egraph ( blocked_node, blocking_node, edge, egraph) ;
82
+ add_to_egraph ( blocked_node, blocking_node, edge, egraph, repacker ) ;
83
83
collect_nodes_up ( graph, blocked, egraph, seen, place_ids, repacker) ;
84
84
}
85
85
}
@@ -109,22 +109,36 @@ impl<'tcx> BorrowsGraph<'tcx> {
109
109
RPRelType :: Unknown
110
110
}
111
111
112
- fn add_to_egraph (
112
+ fn add_to_egraph < ' mir , ' tcx > (
113
113
blocked_node : Id ,
114
114
blocking_node : Id ,
115
- edge : BorrowPCGEdgeRef < ' _ , ' _ > ,
115
+ edge : BorrowPCGEdgeRef < ' tcx , ' _ > ,
116
116
egraph : & mut EGraph < EggPcgNode , ( ) > ,
117
+ repacker : PlaceRepacker < ' mir , ' tcx > ,
117
118
) {
118
119
match edge. kind ( ) {
120
+ BorrowPCGEdgeKind :: RegionProjectionMember ( member)
121
+ if member. is_toplevel ( repacker) =>
122
+ {
123
+ match member. kind {
124
+ RegionProjectionMemberKind :: BorrowOutlives => {
125
+ record_deref ( blocked_node, blocking_node, egraph) ;
126
+ }
127
+ RegionProjectionMemberKind :: DerefBorrowOutlives => {
128
+ record_deref ( blocking_node, blocked_node, egraph) ;
129
+ }
130
+ _ => unreachable ! ( ) ,
131
+ }
132
+ }
119
133
BorrowPCGEdgeKind :: BorrowPCGExpansion ( expansion) => match expansion {
120
134
BorrowPCGExpansion :: FromOwned ( _) => {
121
- record_deref ( blocked_node, blocking_node, egraph)
135
+ // record_deref(blocked_node, blocking_node, egraph)
122
136
}
123
137
BorrowPCGExpansion :: FromBorrow ( e) => {
124
138
if e. expansion . is_deref ( ) {
125
- record_deref ( blocked_node, blocking_node, egraph) ;
139
+ // record_deref(blocked_node, blocking_node, egraph);
126
140
} else {
127
- egraph. union ( blocked_node, blocking_node) ;
141
+ // egraph.union(blocked_node, blocking_node);
128
142
}
129
143
}
130
144
} ,
@@ -149,7 +163,7 @@ impl<'tcx> BorrowsGraph<'tcx> {
149
163
let node: PCGNode < ' tcx > = blocking. into ( ) ;
150
164
if seen. insert ( node) {
151
165
let blocking_id = egraph. add ( get_node ( node, place_ids) ) ;
152
- add_to_egraph ( blocking_id, blocked_id, edge, egraph) ;
166
+ add_to_egraph ( blocking_id, blocked_id, edge, egraph, repacker ) ;
153
167
collect_nodes_down ( graph, node, egraph, seen, place_ids, repacker) ;
154
168
}
155
169
}
@@ -256,15 +270,15 @@ fn main() {
256
270
let temp: mir:: Place < ' _ > = mir:: Local :: from ( 4 as usize ) . into ( ) ;
257
271
let star_temp = temp. project_deeper ( & [ mir:: ProjectionElem :: Deref ] , tcx) ;
258
272
let repacker = PlaceRepacker :: new ( & body. body , tcx) ;
259
- // check_all_statements(&body.body, &mut pcg, |location, stmt| {
260
- // assert!(
261
- // !stmt
262
- // .aliases(star_temp.into(), repacker)
263
- // .contains(&temp.into()),
264
- // "Bad alias for {:?}",
265
- // location
266
- // );
267
- // });
273
+ check_all_statements ( & body. body , & mut pcg, |location, stmt| {
274
+ assert ! (
275
+ !stmt
276
+ . aliases( star_temp. into( ) , repacker)
277
+ . contains( & temp. into( ) ) ,
278
+ "Bad alias for {:?}" ,
279
+ location
280
+ ) ;
281
+ } ) ;
268
282
} ) ;
269
283
270
284
let input = r#"
0 commit comments