Skip to content

Commit d11f8f5

Browse files
committed
Add test for implicit conversion in vector ctor
1 parent dd39718 commit d11f8f5

3 files changed

Lines changed: 154 additions & 0 deletions

File tree

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
extern crate libcc2rs;
2+
use libcc2rs::*;
3+
use std::cell::RefCell;
4+
use std::collections::BTreeMap;
5+
use std::io::prelude::*;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::AsFd;
8+
use std::rc::{Rc, Weak};
9+
pub fn main() {
10+
std::process::exit(main_0());
11+
}
12+
fn main_0() -> i32 {
13+
let src: Value<Box<[u32]>> = Rc::new(RefCell::new(Box::new([1_u32, 2_u32, 3_u32])));
14+
let v1: Value<Vec<u32>> = Rc::new(RefCell::new({
15+
let mut __a0 = (src.as_pointer() as Ptr<u32>).clone();
16+
let mut __out = Vec::with_capacity(
17+
(src.as_pointer() as Ptr<u32>)
18+
.offset((3) as isize)
19+
.get_offset()
20+
- __a0.get_offset(),
21+
);
22+
while __a0 != (src.as_pointer() as Ptr<u32>).offset((3) as isize) {
23+
__out.push(u32::try_from(__a0.read()).ok().unwrap());
24+
__a0 += 1;
25+
}
26+
__out
27+
}));
28+
assert!(((*v1.borrow()).len() as u64 == 3_u64));
29+
assert!(
30+
((((v1.as_pointer() as Ptr<u32>).offset(0_u64 as isize).read()) == 1_u32)
31+
&& (((v1.as_pointer() as Ptr<u32>).offset(1_u64 as isize).read()) == 2_u32))
32+
&& (((v1.as_pointer() as Ptr<u32>).offset(2_u64 as isize).read()) == 3_u32)
33+
);
34+
let v2: Value<Vec<u64>> = Rc::new(RefCell::new({
35+
let mut __a0 = (src.as_pointer() as Ptr<u32>).clone();
36+
let mut __out = Vec::with_capacity(
37+
(src.as_pointer() as Ptr<u32>)
38+
.offset((3) as isize)
39+
.get_offset()
40+
- __a0.get_offset(),
41+
);
42+
while __a0 != (src.as_pointer() as Ptr<u32>).offset((3) as isize) {
43+
__out.push(u64::try_from(__a0.read()).ok().unwrap());
44+
__a0 += 1;
45+
}
46+
__out
47+
}));
48+
assert!(((*v2.borrow()).len() as u64 == 3_u64));
49+
assert!(
50+
((((v2.as_pointer() as Ptr<u64>).offset(0_u64 as isize).read()) == 1_u64)
51+
&& (((v2.as_pointer() as Ptr<u64>).offset(1_u64 as isize).read()) == 2_u64))
52+
&& (((v2.as_pointer() as Ptr<u64>).offset(2_u64 as isize).read()) == 3_u64)
53+
);
54+
let v3: Value<Vec<i32>> = Rc::new(RefCell::new({
55+
let mut __a0 = (src.as_pointer() as Ptr<u32>).clone();
56+
let mut __out = Vec::with_capacity(
57+
(src.as_pointer() as Ptr<u32>)
58+
.offset((3) as isize)
59+
.get_offset()
60+
- __a0.get_offset(),
61+
);
62+
while __a0 != (src.as_pointer() as Ptr<u32>).offset((3) as isize) {
63+
__out.push(i32::try_from(__a0.read()).ok().unwrap());
64+
__a0 += 1;
65+
}
66+
__out
67+
}));
68+
assert!(((*v3.borrow()).len() as u64 == 3_u64));
69+
assert!(
70+
((((v3.as_pointer() as Ptr<i32>).offset(0_u64 as isize).read()) == 1)
71+
&& (((v3.as_pointer() as Ptr<i32>).offset(1_u64 as isize).read()) == 2))
72+
&& (((v3.as_pointer() as Ptr<i32>).offset(2_u64 as isize).read()) == 3)
73+
);
74+
return 0;
75+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
extern crate libc;
2+
use libc::*;
3+
extern crate libcc2rs;
4+
use libcc2rs::*;
5+
use std::collections::BTreeMap;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::{AsFd, FromRawFd, IntoRawFd};
8+
use std::rc::Rc;
9+
pub fn main() {
10+
unsafe {
11+
std::process::exit(main_0() as i32);
12+
}
13+
}
14+
unsafe fn main_0() -> i32 {
15+
let mut src: [u32; 3] = [1_u32, 2_u32, 3_u32];
16+
let mut v1: Vec<u32> = core::slice::from_raw_parts(
17+
src.as_mut_ptr(),
18+
(src.as_mut_ptr().offset((3) as isize)).offset_from(src.as_mut_ptr()) as usize,
19+
)
20+
.iter()
21+
.map(|x| u32::try_from(x.clone()).ok().unwrap())
22+
.collect();
23+
assert!(((v1.len() as u64) == (3_u64)));
24+
assert!(
25+
(((v1[(0_u64) as usize]) == (1_u32)) && ((v1[(1_u64) as usize]) == (2_u32)))
26+
&& ((v1[(2_u64) as usize]) == (3_u32))
27+
);
28+
let mut v2: Vec<u64> = core::slice::from_raw_parts(
29+
src.as_mut_ptr(),
30+
(src.as_mut_ptr().offset((3) as isize)).offset_from(src.as_mut_ptr()) as usize,
31+
)
32+
.iter()
33+
.map(|x| u64::try_from(x.clone()).ok().unwrap())
34+
.collect();
35+
assert!(((v2.len() as u64) == (3_u64)));
36+
assert!(
37+
(((v2[(0_u64) as usize]) == (1_u64)) && ((v2[(1_u64) as usize]) == (2_u64)))
38+
&& ((v2[(2_u64) as usize]) == (3_u64))
39+
);
40+
let mut v3: Vec<i32> = core::slice::from_raw_parts(
41+
src.as_mut_ptr(),
42+
(src.as_mut_ptr().offset((3) as isize)).offset_from(src.as_mut_ptr()) as usize,
43+
)
44+
.iter()
45+
.map(|x| i32::try_from(x.clone()).ok().unwrap())
46+
.collect();
47+
assert!(((v3.len() as u64) == (3_u64)));
48+
assert!(
49+
(((v3[(0_u64) as usize]) == (1)) && ((v3[(1_u64) as usize]) == (2)))
50+
&& ((v3[(2_u64) as usize]) == (3))
51+
);
52+
return 0;
53+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include <assert.h>
2+
3+
#include <cstddef>
4+
#include <cstdint>
5+
#include <vector>
6+
7+
int main() {
8+
uint32_t src[3] = {1, 2, 3};
9+
10+
// Same-type iterator-range constructor.
11+
std::vector<uint32_t> v1(src, src + 3);
12+
assert(v1.size() == 3);
13+
assert(v1[0] == 1 && v1[1] == 2 && v1[2] == 3);
14+
15+
// Cross-type widening (uint32_t -> size_t).
16+
std::vector<size_t> v2(src, src + 3);
17+
assert(v2.size() == 3);
18+
assert(v2[0] == 1 && v2[1] == 2 && v2[2] == 3);
19+
20+
// Cross-type sign-flip (uint32_t -> int).
21+
std::vector<int> v3(src, src + 3);
22+
assert(v3.size() == 3);
23+
assert(v3[0] == 1 && v3[1] == 2 && v3[2] == 3);
24+
25+
return 0;
26+
}

0 commit comments

Comments
 (0)