Skip to content

Commit 1725429

Browse files
committed
Handle typedef'ed anonymous structs
1 parent 2165500 commit 1725429

4 files changed

Lines changed: 136 additions & 0 deletions

File tree

cpp2rust/converter/mapper.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,9 @@ std::string ToString(clang::QualType qual_type) {
733733
std::string ToString(const clang::NamedDecl *decl) {
734734
if (auto *record = clang::dyn_cast<clang::RecordDecl>(decl);
735735
record && !record->getIdentifier()) {
736+
if (auto *typedef_decl = record->getTypedefNameForAnonDecl()) {
737+
return ToString(clang::cast<clang::NamedDecl>(typedef_decl));
738+
}
736739
return synthesizeAnonRecordName(record);
737740
}
738741

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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+
#[derive(Default)]
10+
pub struct Outer_RunInfo {
11+
pub block_idx: Value<i32>,
12+
pub num_extra_zero_runs: Value<i32>,
13+
}
14+
impl Clone for Outer_RunInfo {
15+
fn clone(&self) -> Self {
16+
let mut this = Self {
17+
block_idx: Rc::new(RefCell::new((*self.block_idx.borrow()))),
18+
num_extra_zero_runs: Rc::new(RefCell::new((*self.num_extra_zero_runs.borrow()))),
19+
};
20+
this
21+
}
22+
}
23+
impl ByteRepr for Outer_RunInfo {}
24+
#[derive(Default)]
25+
pub struct Outer {
26+
pub runs: Value<Vec<Outer_RunInfo>>,
27+
}
28+
impl Clone for Outer {
29+
fn clone(&self) -> Self {
30+
let mut this = Self {
31+
runs: Rc::new(RefCell::new((*self.runs.borrow()).clone())),
32+
};
33+
this
34+
}
35+
}
36+
impl ByteRepr for Outer {}
37+
pub fn main() {
38+
std::process::exit(main_0());
39+
}
40+
fn main_0() -> i32 {
41+
let o: Value<Outer> = Rc::new(RefCell::new(<Outer>::default()));
42+
let info: Value<Outer_RunInfo> = Rc::new(RefCell::new(<Outer_RunInfo>::default()));
43+
(*(*info.borrow()).block_idx.borrow_mut()) = 1;
44+
(*(*info.borrow()).num_extra_zero_runs.borrow_mut()) = 2;
45+
{
46+
let a0_clone = (*info.borrow()).clone();
47+
(*(*o.borrow()).runs.borrow_mut()).push(a0_clone)
48+
};
49+
assert!(((*(*o.borrow()).runs.borrow()).len() as u64 == 1_u64));
50+
assert!(
51+
((*(*((*o.borrow()).runs.as_pointer() as Ptr<Outer_RunInfo>)
52+
.offset(0_u64 as isize)
53+
.upgrade()
54+
.deref())
55+
.block_idx
56+
.borrow())
57+
== 1)
58+
);
59+
assert!(
60+
((*(*((*o.borrow()).runs.as_pointer() as Ptr<Outer_RunInfo>)
61+
.offset(0_u64 as isize)
62+
.upgrade()
63+
.deref())
64+
.num_extra_zero_runs
65+
.borrow())
66+
== 2)
67+
);
68+
return 0;
69+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
#[repr(C)]
10+
#[derive(Copy, Clone, Default)]
11+
pub struct Outer_RunInfo {
12+
pub block_idx: i32,
13+
pub num_extra_zero_runs: i32,
14+
}
15+
#[repr(C)]
16+
#[derive(Clone, Default)]
17+
pub struct Outer {
18+
pub runs: Vec<Outer_RunInfo>,
19+
}
20+
pub fn main() {
21+
unsafe {
22+
std::process::exit(main_0() as i32);
23+
}
24+
}
25+
unsafe fn main_0() -> i32 {
26+
let mut o: Outer = <Outer>::default();
27+
let mut info: Outer_RunInfo = <Outer_RunInfo>::default();
28+
info.block_idx = 1;
29+
info.num_extra_zero_runs = 2;
30+
{
31+
let a0_clone = info.clone();
32+
o.runs.push(a0_clone)
33+
};
34+
assert!(((o.runs.len() as u64) == (1_u64)));
35+
assert!(((o.runs[(0_u64) as usize].block_idx) == (1)));
36+
assert!(((o.runs[(0_u64) as usize].num_extra_zero_runs) == (2)));
37+
return 0;
38+
}

tests/unit/typedef-anon-struct.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include <cassert>
2+
#include <vector>
3+
4+
struct Outer {
5+
typedef struct {
6+
int block_idx;
7+
int num_extra_zero_runs;
8+
} RunInfo;
9+
10+
std::vector<RunInfo> runs;
11+
};
12+
13+
int main() {
14+
Outer o;
15+
16+
Outer::RunInfo info;
17+
info.block_idx = 1;
18+
info.num_extra_zero_runs = 2;
19+
o.runs.push_back(info);
20+
21+
assert(o.runs.size() == 1);
22+
assert(o.runs[0].block_idx == 1);
23+
assert(o.runs[0].num_extra_zero_runs == 2);
24+
25+
return 0;
26+
}

0 commit comments

Comments
 (0)