Skip to content

Commit 090919c

Browse files
committed
Fixed issue with helper expressions resolving too early, and started creating usize/isize types for interfacing with C size_t/ssize_t types
1 parent f168151 commit 090919c

File tree

17 files changed

+79
-87
lines changed

17 files changed

+79
-87
lines changed

src/asg/datatype/kind/mod.rs

+23-16
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pub enum TypeKind {
2424
Boolean,
2525
Integer(IntegerBits, IntegerSign),
2626
CInteger(CInteger, Option<IntegerSign>),
27+
SizeInteger(IntegerSign),
2728
IntegerLiteral(BigInt),
2829
FloatLiteral(Option<NotNan<f64>>),
2930
Floating(FloatSize),
@@ -55,6 +56,7 @@ impl TypeKind {
5556
TypeKind::Boolean
5657
| TypeKind::Integer(_, _)
5758
| TypeKind::CInteger(_, _)
59+
| TypeKind::SizeInteger(_)
5860
| TypeKind::IntegerLiteral(_)
5961
| TypeKind::FloatLiteral(_)
6062
| TypeKind::Floating(_) => false,
@@ -87,6 +89,7 @@ impl TypeKind {
8789
TypeKind::CInteger(integer, sign) => {
8890
sign.or_else(|| target.map(|target| target.default_c_integer_sign(*integer)))
8991
}
92+
TypeKind::SizeInteger(sign) => Some(*sign),
9093
TypeKind::TypeAlias(_, _, _) => panic!("sign of type alias"),
9194
TypeKind::Unresolved => panic!(),
9295
TypeKind::AnonymousEnum(enumeration) => enumeration.backing_type.kind.sign(target),
@@ -125,6 +128,7 @@ impl TypeKind {
125128
TypeKind::Boolean
126129
| TypeKind::Integer(_, _)
127130
| TypeKind::CInteger(_, _)
131+
| TypeKind::SizeInteger(_)
128132
| TypeKind::IntegerLiteral(_)
129133
| TypeKind::FloatLiteral(_)
130134
| TypeKind::Floating(_) => (),
@@ -165,6 +169,7 @@ impl TypeKind {
165169
| TypeKind::Boolean
166170
| TypeKind::Integer(_, _)
167171
| TypeKind::CInteger(_, _)
172+
| TypeKind::SizeInteger(_)
168173
| TypeKind::IntegerLiteral(_)
169174
| TypeKind::FloatLiteral(_)
170175
| TypeKind::Floating(_) => Ok(Cow::Borrowed(self)),
@@ -307,28 +312,30 @@ impl Display for TypeKind {
307312
write_parameters(f, type_args)?;
308313
}
309314
TypeKind::Boolean => write!(f, "bool")?,
310-
TypeKind::Integer(bits, sign) => {
311-
f.write_str(match (bits, sign) {
312-
(IntegerBits::Bits8, IntegerSign::Signed) => "i8",
313-
(IntegerBits::Bits8, IntegerSign::Unsigned) => "u8",
314-
(IntegerBits::Bits16, IntegerSign::Signed) => "i16",
315-
(IntegerBits::Bits16, IntegerSign::Unsigned) => "u16",
316-
(IntegerBits::Bits32, IntegerSign::Signed) => "i32",
317-
(IntegerBits::Bits32, IntegerSign::Unsigned) => "u32",
318-
(IntegerBits::Bits64, IntegerSign::Signed) => "i64",
319-
(IntegerBits::Bits64, IntegerSign::Unsigned) => "u64",
320-
})?;
321-
}
315+
TypeKind::Integer(bits, sign) => f.write_str(match (bits, sign) {
316+
(IntegerBits::Bits8, IntegerSign::Signed) => "i8",
317+
(IntegerBits::Bits8, IntegerSign::Unsigned) => "u8",
318+
(IntegerBits::Bits16, IntegerSign::Signed) => "i16",
319+
(IntegerBits::Bits16, IntegerSign::Unsigned) => "u16",
320+
(IntegerBits::Bits32, IntegerSign::Signed) => "i32",
321+
(IntegerBits::Bits32, IntegerSign::Unsigned) => "u32",
322+
(IntegerBits::Bits64, IntegerSign::Signed) => "i64",
323+
(IntegerBits::Bits64, IntegerSign::Unsigned) => "u64",
324+
})?,
322325
TypeKind::CInteger(integer, sign) => {
323326
fmt_c_integer(f, *integer, *sign)?;
324327
}
328+
TypeKind::SizeInteger(sign) => f.write_str(match sign {
329+
IntegerSign::Signed => "isize",
330+
IntegerSign::Unsigned => "usize",
331+
})?,
325332
TypeKind::IntegerLiteral(value) => {
326333
write!(f, "integer {}", value)?;
327334
}
328-
TypeKind::Floating(size) => match size {
329-
FloatSize::Bits32 => f.write_str("f32")?,
330-
FloatSize::Bits64 => f.write_str("f64")?,
331-
},
335+
TypeKind::Floating(size) => f.write_str(match size {
336+
FloatSize::Bits32 => "f32",
337+
FloatSize::Bits64 => "f64",
338+
})?,
332339
TypeKind::FloatLiteral(value) => {
333340
if let Some(value) = value {
334341
write!(f, "float {}", value)?

src/asg/helper_expr.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
use super::TypedExpr;
2-
use crate::ast::Privacy;
1+
use crate::ast::{self, Privacy};
32

43
#[derive(Clone, Debug)]
54
pub struct HelperExprDecl {
6-
pub value: TypedExpr,
5+
pub value: ast::Expr,
76
pub privacy: Privacy,
87
}

src/ast/datatype/kind/common.rs

+8
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,12 @@ impl TypeKind {
8989
pub fn ulonglong() -> Self {
9090
Self::CInteger(CInteger::LongLong, Some(IntegerSign::Unsigned))
9191
}
92+
93+
pub fn isize() -> Self {
94+
Self::SizeInteger(IntegerSign::Signed)
95+
}
96+
97+
pub fn usize() -> Self {
98+
Self::SizeInteger(IntegerSign::Unsigned)
99+
}
92100
}

src/ast/datatype/kind/display.rs

+14-12
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,23 @@ impl Display for &TypeKind {
1111
TypeKind::Boolean => {
1212
write!(f, "bool")?;
1313
}
14-
TypeKind::Integer(bits, sign) => {
15-
f.write_str(match (bits, sign) {
16-
(IntegerBits::Bits8, IntegerSign::Signed) => "i8",
17-
(IntegerBits::Bits8, IntegerSign::Unsigned) => "u8",
18-
(IntegerBits::Bits16, IntegerSign::Signed) => "i16",
19-
(IntegerBits::Bits16, IntegerSign::Unsigned) => "u16",
20-
(IntegerBits::Bits32, IntegerSign::Signed) => "i32",
21-
(IntegerBits::Bits32, IntegerSign::Unsigned) => "u32",
22-
(IntegerBits::Bits64, IntegerSign::Signed) => "i64",
23-
(IntegerBits::Bits64, IntegerSign::Unsigned) => "u64",
24-
})?;
25-
}
14+
TypeKind::Integer(bits, sign) => f.write_str(match (bits, sign) {
15+
(IntegerBits::Bits8, IntegerSign::Signed) => "i8",
16+
(IntegerBits::Bits8, IntegerSign::Unsigned) => "u8",
17+
(IntegerBits::Bits16, IntegerSign::Signed) => "i16",
18+
(IntegerBits::Bits16, IntegerSign::Unsigned) => "u16",
19+
(IntegerBits::Bits32, IntegerSign::Signed) => "i32",
20+
(IntegerBits::Bits32, IntegerSign::Unsigned) => "u32",
21+
(IntegerBits::Bits64, IntegerSign::Signed) => "i64",
22+
(IntegerBits::Bits64, IntegerSign::Unsigned) => "u64",
23+
})?,
2624
TypeKind::CInteger(integer, sign) => {
2725
fmt_c_integer(f, *integer, *sign)?;
2826
}
27+
TypeKind::SizeInteger(sign) => f.write_str(match sign {
28+
IntegerSign::Signed => "isize",
29+
IntegerSign::Unsigned => "usize",
30+
})?,
2931
TypeKind::Ptr(inner) => {
3032
write!(f, "ptr<{inner}>")?;
3133
}

src/ast/datatype/kind/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub enum TypeKind {
1212
Boolean,
1313
Integer(IntegerBits, IntegerSign),
1414
CInteger(CInteger, Option<IntegerSign>),
15+
SizeInteger(IntegerSign),
1516
Floating(FloatSize),
1617
Ptr(Box<Type>),
1718
FixedArray(Box<FixedArray>),

src/ast/datatype/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ impl Type {
4141
TypeKind::Boolean
4242
| TypeKind::Integer(_, _)
4343
| TypeKind::CInteger(_, _)
44+
| TypeKind::SizeInteger(_)
4445
| TypeKind::Floating(_) => None,
4546
TypeKind::Ptr(inner) => inner.contains_polymorph(),
4647
TypeKind::FixedArray(fixed_array) => fixed_array.ast_type.contains_polymorph(),

src/lower/datatype.rs

+4
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ pub fn lower_type(
4343
(Bits::Bits64, Sign::Unsigned) => ir::Type::U64,
4444
}),
4545
asg::TypeKind::CInteger(integer, sign) => Ok(lower_c_integer(target, *integer, *sign)),
46+
asg::TypeKind::SizeInteger(sign) => Ok(match sign {
47+
Sign::Signed => ir::Type::S64,
48+
Sign::Unsigned => ir::Type::U64,
49+
}),
4650
asg::TypeKind::IntegerLiteral(value) => {
4751
Err(LowerErrorKind::CannotLowerUnspecializedIntegerLiteral {
4852
value: value.to_string(),

src/parser/parse_type.rs

+2
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ impl<'a, I: Inflow<Token>> Parser<'a, I> {
101101
Some("u32") => Ok(TypeKind::u32()),
102102
Some("i64") => Ok(TypeKind::i64()),
103103
Some("u64") => Ok(TypeKind::u64()),
104+
Some("usize") => Ok(TypeKind::usize()),
105+
Some("isize") => Ok(TypeKind::isize()),
104106
Some("f32" | "float") => Ok(TypeKind::f32()),
105107
Some("f64" | "double") => Ok(TypeKind::f64()),
106108
Some("void") => Ok(TypeKind::Void),

src/resolve/collect_polymorphs.rs

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub fn collect_polymorphs(map: &mut IndexSet<String>, ty: &Type) {
77
TypeKind::Boolean
88
| TypeKind::Integer(_, _)
99
| TypeKind::CInteger(_, _)
10+
| TypeKind::SizeInteger(_)
1011
| TypeKind::IntegerLiteral(_)
1112
| TypeKind::FloatLiteral(_)
1213
| TypeKind::Floating(_) => (),

src/resolve/expr/mod.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use super::{
2525
Initialized, ResolveTypeCtx,
2626
};
2727
use crate::{
28-
asg::{self, Asg, Expr, ExprKind, FuncRef, IntegerBits, StructRef, TypeKind, TypedExpr},
28+
asg::{self, Asg, Expr, ExprKind, FuncRef, StructRef, TypeKind, TypedExpr},
2929
ast::{
3030
self, CInteger, CIntegerAssumptions, ConformBehavior, IntegerKnown, Language, Settings,
3131
UnaryOperator,
@@ -148,7 +148,7 @@ pub fn resolve_expr(
148148

149149
let resolved_expr = match &ast_expr.kind {
150150
ast::ExprKind::Variable(name) => {
151-
resolve_variable_expr(ctx, name, preferred_type, initialized, source)
151+
resolve_variable_expr(ctx, name, preferred_type, initialized, mode, source)
152152
}
153153
ast::ExprKind::Char(content) => {
154154
if content.len() == 1 {
@@ -378,7 +378,9 @@ pub fn resolve_expr(
378378
.resolve(ast_type, ResolveTypeOptions::Unalias)?;
379379

380380
Ok(TypedExpr::new(
381-
asg::TypeKind::Integer(IntegerBits::Bits64, IntegerSign::Unsigned).at(source),
381+
// NOTE: This will used the unsigned size integer type in the future
382+
// asg::TypeKind::SizeInteger(IntegerSign::Unsigned).at(source),
383+
asg::TypeKind::Integer(asg::IntegerBits::Bits64, IntegerSign::Unsigned).at(source),
382384
asg::ExprKind::SizeOf(Box::new(ty)).at(source),
383385
))
384386
}
@@ -393,7 +395,9 @@ pub fn resolve_expr(
393395
.ty;
394396

395397
Ok(TypedExpr::new(
396-
asg::TypeKind::Integer(IntegerBits::Bits64, IntegerSign::Unsigned).at(source),
398+
// NOTE: This will used the unsigned size integer type in the future
399+
// asg::TypeKind::SizeInteger(IntegerSign::Unsigned).at(source),
400+
asg::TypeKind::Integer(asg::IntegerBits::Bits64, IntegerSign::Unsigned).at(source),
397401
asg::ExprKind::SizeOf(Box::new(ty)).at(source),
398402
))
399403
}

src/resolve/expr/variable.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ use crate::{
1515
pub fn resolve_variable_expr(
1616
ctx: &mut ResolveExprCtx,
1717
name: &Name,
18-
_preferred_type: Option<PreferredType>,
19-
_initialized: Initialized,
18+
preferred_type: Option<PreferredType>,
19+
initialized: Initialized,
20+
mode: ResolveExprMode,
2021
source: Source,
2122
) -> Result<TypedExpr, ResolveError> {
2223
if let Some(variable) = name
@@ -71,7 +72,7 @@ pub fn resolve_variable_expr(
7172
}
7273

7374
if let Some(found) = maybe_helper_expr {
74-
return Ok(found.value.clone());
75+
return resolve_expr(ctx, &found.value, preferred_type, initialized, mode);
7576
}
7677
}
7778

@@ -136,7 +137,7 @@ pub fn resolve_variable_expr(
136137
.at(source));
137138
}
138139

139-
return Ok(found.value.clone());
140+
return resolve_expr(ctx, &found.value, preferred_type, initialized, mode);
140141
}
141142
}
142143

src/resolve/helper_expr.rs

+3-45
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,14 @@
1-
use super::{
2-
ctx::ResolveCtx,
3-
error::ResolveError,
4-
expr::{resolve_expr, ResolveExprCtx, ResolveExprMode},
5-
initialized::Initialized,
6-
variable_haystack::VariableHaystack,
7-
};
8-
use crate::{
9-
asg::{Asg, HelperExprDecl},
10-
ast::AstWorkspace,
11-
};
1+
use super::{ctx::ResolveCtx, error::ResolveError};
2+
use crate::{asg::HelperExprDecl, ast::AstWorkspace};
123

134
pub fn resolve_helper_expressions(
145
ctx: &mut ResolveCtx,
15-
asg: &mut Asg,
166
ast_workspace: &AstWorkspace,
177
) -> Result<(), ResolveError> {
188
for (physical_file_id, file) in ast_workspace.files.iter() {
199
let module_folder_id = ast_workspace.get_owning_module_or_self(*physical_file_id);
20-
let settings = &ast_workspace.settings[file.settings.unwrap_or_default().0];
21-
22-
let func_haystack = ctx
23-
.func_haystacks
24-
.get(&module_folder_id)
25-
.expect("function haystack to exist for module");
2610

2711
for helper_expr in file.helper_exprs.iter() {
28-
let value = {
29-
let variable_haystack = VariableHaystack::new();
30-
let mut ctx = ResolveExprCtx {
31-
asg,
32-
func_haystack: &func_haystack,
33-
variable_haystack,
34-
func_ref: None,
35-
settings,
36-
public_funcs: &ctx.public_funcs,
37-
types_in_modules: &ctx.types_in_modules,
38-
globals_in_modules: &ctx.globals_in_modules,
39-
helper_exprs_in_modules: &ctx.helper_exprs_in_modules,
40-
impls_in_modules: &ctx.impls_in_modules,
41-
module_fs_node_id: module_folder_id,
42-
physical_fs_node_id: *physical_file_id,
43-
};
44-
45-
resolve_expr(
46-
&mut ctx,
47-
&helper_expr.value,
48-
None,
49-
Initialized::Require,
50-
ResolveExprMode::RequireValue,
51-
)?
52-
};
53-
5412
let helper_exprs = ctx
5513
.helper_exprs_in_modules
5614
.entry(module_folder_id)
@@ -59,7 +17,7 @@ pub fn resolve_helper_expressions(
5917
helper_exprs.insert(
6018
helper_expr.name.clone(),
6119
HelperExprDecl {
62-
value,
20+
value: helper_expr.value.clone(),
6321
privacy: helper_expr.privacy,
6422
},
6523
);

src/resolve/impl_head/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,10 @@ fn matches(
186186
| asg::TypeKind::Boolean
187187
| asg::TypeKind::Integer(_, _)
188188
| asg::TypeKind::CInteger(_, _)
189+
| asg::TypeKind::SizeInteger(_)
189190
| asg::TypeKind::IntegerLiteral(_)
190191
| asg::TypeKind::FloatLiteral(_)
191-
| asg::TypeKind::Floating(_) => (ty_in_impl == ty_in_trait)
192+
| asg::TypeKind::Floating(_) => (ty_in_impl.kind == ty_in_trait.kind)
192193
.then_some(Ok(()))
193194
.unwrap_or_else(|| Err(mismatch(ty_in_impl.source))),
194195
asg::TypeKind::Ptr(trait_inner) => match &ty_in_impl.kind {

src/resolve/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ pub fn resolve<'a>(
4444
resolve_type_definitions(&mut ctx, &mut asg, workspace)?;
4545
resolve_global_variables(&mut ctx, &mut asg, workspace)?;
4646
create_func_heads(&mut ctx, &mut asg, workspace, options)?;
47-
resolve_helper_expressions(&mut ctx, &mut asg, workspace)?;
47+
resolve_helper_expressions(&mut ctx, workspace)?;
4848
resolve_func_bodies(&mut ctx, &mut asg, workspace)?;
4949

5050
Ok(asg)

src/resolve/polymorph/matcher.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,14 @@ impl<'local, 'ast, 'root_ctx> TypeMatcher<'local, 'ast, 'root_ctx> {
6666
TypeKind::Boolean
6767
| TypeKind::Integer(_, _)
6868
| TypeKind::CInteger(_, _)
69+
| TypeKind::SizeInteger(_)
6970
| TypeKind::IntegerLiteral(_)
7071
| TypeKind::FloatLiteral(_)
7172
| TypeKind::Floating(_)
7273
| TypeKind::Void
7374
| TypeKind::Never
7475
| TypeKind::Enum(_, _) => {
75-
if *pattern == *concrete {
76+
if pattern.kind == concrete.kind {
7677
Ok(())
7778
} else {
7879
no_match()

src/resolve/polymorph/resolver.rs

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ impl<'a> PolyRecipeResolver<'a> {
4848
asg::TypeKind::Boolean
4949
| asg::TypeKind::Integer(_, _)
5050
| asg::TypeKind::CInteger(_, _)
51+
| asg::TypeKind::SizeInteger(_)
5152
| asg::TypeKind::IntegerLiteral(_)
5253
| asg::TypeKind::FloatLiteral(_)
5354
| asg::TypeKind::Void

src/resolve/type_ctx/resolve_type.rs

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ impl<'a> ResolveTypeCtx<'a> {
5555
ast::TypeKind::Boolean => Ok(asg::TypeKind::Boolean),
5656
ast::TypeKind::Integer(bits, sign) => Ok(asg::TypeKind::Integer(*bits, *sign)),
5757
ast::TypeKind::CInteger(integer, sign) => Ok(asg::TypeKind::CInteger(*integer, *sign)),
58+
ast::TypeKind::SizeInteger(sign) => Ok(asg::TypeKind::SizeInteger(*sign)),
5859
ast::TypeKind::Ptr(inner) => {
5960
let inner = self.resolve_or_undeclared(inner, options)?;
6061
Ok(asg::TypeKind::Ptr(Box::new(inner)))

0 commit comments

Comments
 (0)