Skip to content

Commit 3ad235f

Browse files
committed
Started working on implicit integer conversions for C enum values
1 parent 77e0c70 commit 3ad235f

File tree

6 files changed

+49
-3
lines changed

6 files changed

+49
-3
lines changed

Diff for: src/asg/datatype/kind/anonymous_enum.rs

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use indexmap::IndexMap;
66
pub struct AnonymousEnum {
77
pub backing_type: Type,
88
pub members: IndexMap<String, EnumMember>,
9+
pub allow_implicit_integer_conversions: bool,
910
pub source: Source,
1011
}
1112

Diff for: src/ast/datatype/nameless_enumeration.rs

+1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ use indexmap::IndexMap;
66
pub struct AnonymousEnum {
77
pub members: IndexMap<String, EnumMember>,
88
pub backing_type: Option<Box<Type>>,
9+
pub allow_implicit_integer_conversions: bool,
910
}

Diff for: src/c/translation/types/enumeration.rs

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ pub fn make_anonymous_enum(
8484
Ok(TypeKind::AnonymousEnum(AnonymousEnum {
8585
members,
8686
backing_type,
87+
allow_implicit_integer_conversions: true,
8788
}))
8889
}
8990
Enumeration::Named(named) => {

Diff for: src/resolve/conform/from_anonymous_enum.rs

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use super::{ConformMode, Objective, ObjectiveResult};
2+
use crate::{
3+
asg::{AnonymousEnum, Expr, Type, TypeKind},
4+
source_files::Source,
5+
};
6+
7+
pub fn from_anonymous_enum<O: Objective>(
8+
_expr: &Expr,
9+
_from_type: &Type,
10+
_mode: ConformMode,
11+
to_type: &Type,
12+
enumeration: &AnonymousEnum,
13+
_source: Source,
14+
) -> ObjectiveResult<O> {
15+
match &to_type.kind {
16+
TypeKind::Integer(_to_bits, _to_sign) => {
17+
if !enumeration.allow_implicit_integer_conversions {
18+
return O::fail();
19+
}
20+
21+
todo!("convert from anonymous enum to fixed integer")
22+
}
23+
TypeKind::CInteger(_to_c_integer, _to_sign) => {
24+
if !enumeration.allow_implicit_integer_conversions {
25+
return O::fail();
26+
}
27+
28+
todo!("convert from anonymous enum to flexible integer")
29+
}
30+
_ => O::fail(),
31+
}
32+
}

Diff for: src/resolve/conform/mod.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
mod from_anonymous_enum;
12
mod from_c_integer;
23
mod from_float;
34
mod from_float_literal;
@@ -8,9 +9,9 @@ mod mode;
89
pub mod to_default;
910

1011
use self::{
11-
from_c_integer::from_c_integer, from_float::from_float, from_float_literal::from_float_literal,
12-
from_integer::from_integer, from_integer_literal::from_integer_literal,
13-
from_pointer::from_pointer,
12+
from_anonymous_enum::from_anonymous_enum, from_c_integer::from_c_integer,
13+
from_float::from_float, from_float_literal::from_float_literal, from_integer::from_integer,
14+
from_integer_literal::from_integer_literal, from_pointer::from_pointer,
1415
};
1516
use super::{
1617
error::{ResolveError, ResolveErrorKind},
@@ -115,6 +116,14 @@ pub fn conform_expr<O: Objective>(
115116
to_type,
116117
conform_source,
117118
),
119+
TypeKind::AnonymousEnum(enumeration) => from_anonymous_enum::<O>(
120+
&expr.expr,
121+
from_type,
122+
mode,
123+
to_type,
124+
enumeration.as_ref(),
125+
conform_source,
126+
),
118127
_ => O::fail(),
119128
}
120129
}

Diff for: src/resolve/type_ctx/resolve_type.rs

+2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ impl<'a> ResolveTypeCtx<'a> {
111111
Ok(asg::TypeKind::AnonymousEnum(Box::new(AnonymousEnum {
112112
members: enumeration.members.clone(),
113113
backing_type,
114+
allow_implicit_integer_conversions: enumeration
115+
.allow_implicit_integer_conversions,
114116
source: ast_type.source,
115117
})))
116118
}

0 commit comments

Comments
 (0)