Skip to content

Commit 9edd605

Browse files
committed
Use explicit enum default value instead of Default trait
1 parent 1da8edc commit 9edd605

4 files changed

Lines changed: 122 additions & 0 deletions

File tree

cpp2rust/converter/converter.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3190,6 +3190,13 @@ std::string Converter::GetDefaultAsStringFallback(clang::QualType qual_type) {
31903190
}
31913191
}
31923192

3193+
if (qual_type->isEnumeralType()) {
3194+
auto enum_decl = qual_type->castAs<clang::EnumType>()->getDecl();
3195+
return std::format(
3196+
"{}::{}", GetRecordName(enum_decl),
3197+
std::string_view(enum_decl->enumerator_begin()->getName()));
3198+
}
3199+
31933200
return std::format("<{}>::default()", ToString(qual_type));
31943201
}
31953202

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#include <assert.h>
2+
3+
enum Mode {
4+
MODE_NONE,
5+
MODE_ONE,
6+
MODE_TWO,
7+
};
8+
9+
struct Config {
10+
int count;
11+
enum Mode mode;
12+
};
13+
14+
static struct Config config;
15+
16+
int main(void) {
17+
assert(config.count == 0);
18+
assert(config.mode == MODE_NONE);
19+
return 0;
20+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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(Clone, Copy, PartialEq, Debug, Default)]
10+
enum Mode {
11+
#[default]
12+
MODE_NONE = 0,
13+
MODE_ONE = 1,
14+
MODE_TWO = 2,
15+
}
16+
impl From<i32> for Mode {
17+
fn from(n: i32) -> Mode {
18+
match n {
19+
0 => Mode::MODE_NONE,
20+
1 => Mode::MODE_ONE,
21+
2 => Mode::MODE_TWO,
22+
_ => panic!("invalid Mode value: {}", n),
23+
}
24+
}
25+
}
26+
libcc2rs::impl_enum_inc_dec!(Mode);
27+
#[derive(Default)]
28+
pub struct Config {
29+
pub count: Value<i32>,
30+
pub mode: Value<Mode>,
31+
}
32+
impl ByteRepr for Config {}
33+
thread_local!(
34+
pub static config_0: Value<Config> = <Value<Config>>::default();
35+
);
36+
pub fn main() {
37+
std::process::exit(main_0());
38+
}
39+
fn main_0() -> i32 {
40+
assert!(((((*(*config_0.with(Value::clone).borrow()).count.borrow()) == 0) as i32) != 0));
41+
assert!(
42+
(((((*(*config_0.with(Value::clone).borrow()).mode.borrow()) as u32)
43+
== ((Mode::MODE_NONE as i32) as u32)) as i32)
44+
!= 0)
45+
);
46+
return 0;
47+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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+
#[derive(Clone, Copy, PartialEq, Debug, Default)]
10+
enum Mode {
11+
#[default]
12+
MODE_NONE = 0,
13+
MODE_ONE = 1,
14+
MODE_TWO = 2,
15+
}
16+
impl From<i32> for Mode {
17+
fn from(n: i32) -> Mode {
18+
match n {
19+
0 => Mode::MODE_NONE,
20+
1 => Mode::MODE_ONE,
21+
2 => Mode::MODE_TWO,
22+
_ => panic!("invalid Mode value: {}", n),
23+
}
24+
}
25+
}
26+
libcc2rs::impl_enum_inc_dec!(Mode);
27+
#[repr(C)]
28+
#[derive(Copy, Clone, Default)]
29+
pub struct Config {
30+
pub count: i32,
31+
pub mode: Mode,
32+
}
33+
pub static mut config_0: Config = unsafe {
34+
Config {
35+
count: 0_i32,
36+
mode: Mode::MODE_NONE,
37+
}
38+
};
39+
pub fn main() {
40+
unsafe {
41+
std::process::exit(main_0() as i32);
42+
}
43+
}
44+
unsafe fn main_0() -> i32 {
45+
assert!(((((config_0.count) == (0)) as i32) != 0));
46+
assert!(((((config_0.mode as u32) == ((Mode::MODE_NONE as i32) as u32)) as i32) != 0));
47+
return 0;
48+
}

0 commit comments

Comments
 (0)