Skip to content

Commit a849172

Browse files
committed
hmmm broken
1 parent 4417a73 commit a849172

File tree

4 files changed

+104
-37
lines changed

4 files changed

+104
-37
lines changed

Diff for: src/adjuster.rs

+59-21
Original file line numberDiff line numberDiff line change
@@ -94,29 +94,67 @@ fn line_rearrangement_mut_const_overlap(
9494
let mut mut_ptr_usages = mut_ptr.usages.iter();
9595
let mut const_ptr_usages = const_ptr.usages.iter();
9696

97-
let first_mut_ptr_usage_in_reference = mut_ptr_usages
98-
.find(|mut_usage| {
99-
const_reference
100-
.borrow()
101-
.contained_within_current_range(mut_usage.get_line_number())
102-
})
103-
.unwrap();
97+
let const_range = const_reference.borrow().get_range();
98+
let mut_range = mut_reference.borrow().get_range();
10499

105-
let last_const_usage_in_reference = const_ptr_usages
106-
.find(|const_usage| {
107-
mut_reference
108-
.borrow()
109-
.contained_within_current_range(const_usage.get_line_number())
110-
})
111-
.unwrap();
100+
match const_range.start > mut_range.start {
101+
true => {
102+
let first_mut_usage_in_reference = mut_ptr_usages
103+
.find(|mut_usage| {
104+
const_reference
105+
.borrow()
106+
.contained_within_current_range(mut_usage.get_line_number())
107+
})
108+
.unwrap();
112109

113-
if first_mut_ptr_usage_in_reference.get_line_number()
114-
> last_const_usage_in_reference.get_line_number()
115-
{
116-
// rearrange_lines(first_line, second_line, root);
117-
true
118-
} else {
119-
false
110+
let last_const_usage_in_reference = const_ptr_usages
111+
.filter(|const_usage| {
112+
mut_reference
113+
.borrow()
114+
.contained_within_current_range(const_usage.get_line_number())
115+
})
116+
.last()
117+
.unwrap();
118+
119+
// if first_mut_usage_in_reference.get_line_number()
120+
// > last_const_usage_in_reference.get_line_number()
121+
// {
122+
// // TODO Iteratively move all overlapped lines
123+
// rearrange_lines(mut_range.start, const_range.end, root);
124+
// true
125+
// } else {
126+
// false
127+
// }
128+
false
129+
}
130+
false => {
131+
let last_mut_usage_in_reference = mut_ptr_usages
132+
.filter(|mut_usage| {
133+
mut_reference
134+
.borrow()
135+
.contained_within_current_range(mut_usage.get_line_number())
136+
})
137+
.last()
138+
.unwrap();
139+
140+
let first_const_usage_in_reference = const_ptr_usages
141+
.find(|const_usage| {
142+
mut_reference
143+
.borrow()
144+
.contained_within_current_range(const_usage.get_line_number())
145+
})
146+
.unwrap();
147+
148+
if first_const_usage_in_reference.get_line_number()
149+
> last_mut_usage_in_reference.get_line_number()
150+
{
151+
// TODO Iteratively move all overlapped lines
152+
rearrange_lines(mut_range.start, const_range.end, root);
153+
true
154+
} else {
155+
false
156+
}
157+
}
120158
}
121159
}
122160

Diff for: src/test.rs

+31-16
Original file line numberDiff line numberDiff line change
@@ -29,34 +29,24 @@ fn three_mut_layered() {
2929
);
3030
}
3131

32-
/// Invalid rust code if directly translated
33-
/// Should be caught by the checker and a safe solution should be applied
34-
/// We can only ever use `*t.borrow()` or `*t.borrow_mut()` when using t
35-
/// Because it has to act exactly like the value t would in C.
36-
/// eg.
3732
/// ```rust
3833
/// fn main() -> () {
39-
/// let t: Rc<RefCell<i32>> = Rc::new(RefCell::new(0));
40-
/// let g: Rc<RefCell<i32>> = t.clone();
41-
/// *t.borrow_mut() = 1;
42-
/// *g.borrow_mut() = 2;
43-
/// // When function calls come about
44-
/// f(*t.borrow())
45-
/// f(g)
46-
/// f(g, t.borrow_mut()) // this is fine
47-
/// f(*g.borrow(), *t.borrow_mut) // this is not ok
34+
/// let t = 0;
35+
/// t = 1;
36+
/// let g = &mut t;
37+
/// *g = 2;
4838
/// }
4939
/// ```
5040
#[test]
51-
fn value_overlap() {
41+
fn value_mut_ptr_overlap() {
5242
validate(
5343
"int main() {
5444
int t = 0;
5545
int* g = &t;
5646
t = 1;
5747
*g = 2;
5848
}",
59-
"value_overlap",
49+
"value_mut_ptr_overlap",
6050
);
6151
}
6252

@@ -102,6 +92,31 @@ fn value_const_ptr_overlap() {
10292
// "deref_value_assignment",
10393
// );
10494
// }
95+
//
96+
97+
/// ```rust
98+
/// fn main() {
99+
/// let n = 0;
100+
/// let g = &n;
101+
/// let t = *g;
102+
/// let m = &mut n;
103+
/// *m = 4;
104+
/// }
105+
#[test]
106+
fn const_mut_ptr_overlap() {
107+
validate(
108+
"int main() {
109+
int n = 0;
110+
int* g = &n;
111+
int* m = &n;
112+
*m = 9;
113+
int t = *g;
114+
g;
115+
*m = 4;
116+
}",
117+
"const_mut_ptr_overlap",
118+
);
119+
}
105120

106121
/// ```rust
107122
/// fn main() {

Diff for: translated/const_mut_ptr_overlap_test.rs

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
use std::{cell::RefCell, rc::Rc};
2+
fn main() -> () {
3+
let n: Rc<RefCell<i32>> = Rc::new(RefCell::new(0));
4+
let g: Rc<RefCell<i32>> = n.clone();
5+
let m: Rc<RefCell<i32>> = n.clone();
6+
let _t: i32 = *g.borrow();
7+
*m.borrow_mut() = 4;
8+
}

Diff for: translated/value_mut_ptr_overlap_test.rs

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
fn main() -> () {
2+
let mut t: i32 = 0;
3+
t = 1;
4+
let mut g: &mut i32 = &mut t;
5+
*g = 2;
6+
}

0 commit comments

Comments
 (0)