Fix struct field ordering mattering
This commit is contained in:
parent
4c9633132f
commit
bf878c02a7
@ -7,8 +7,8 @@ struct Test {
|
|||||||
|
|
||||||
fn main() -> u32 {
|
fn main() -> u32 {
|
||||||
let mut value = Test {
|
let mut value = Test {
|
||||||
second: 3,
|
|
||||||
field: 5,
|
field: 5,
|
||||||
|
second: 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ use scope::*;
|
|||||||
use crate::{
|
use crate::{
|
||||||
mir::{
|
mir::{
|
||||||
self, implement::TypeCategory, pass::ScopeBinopKey, CustomTypeKey, FunctionDefinitionKind, NamedVariableRef,
|
self, implement::TypeCategory, pass::ScopeBinopKey, CustomTypeKey, FunctionDefinitionKind, NamedVariableRef,
|
||||||
SourceModuleId, StructField, StructType, TypeDefinitionKind, TypeKind, WhileStatement,
|
SourceModuleId, StructField, StructType, TypeDefinition, TypeDefinitionKind, TypeKind, WhileStatement,
|
||||||
},
|
},
|
||||||
util::try_all,
|
util::try_all,
|
||||||
};
|
};
|
||||||
@ -1042,24 +1042,32 @@ impl mir::Expression {
|
|||||||
}
|
}
|
||||||
mir::ExprKind::Struct(name, items) => {
|
mir::ExprKind::Struct(name, items) => {
|
||||||
let type_key = CustomTypeKey(name.clone(), scope.module_id);
|
let type_key = CustomTypeKey(name.clone(), scope.module_id);
|
||||||
let struct_ty = Type::CustomType({
|
let ty = Type::CustomType({
|
||||||
let Some(a) = scope.type_values.get(&type_key) else {
|
let Some(a) = scope.type_values.get(&type_key) else {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
};
|
};
|
||||||
*a
|
*a
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let TypeDefinition {
|
||||||
|
kind: TypeDefinitionKind::Struct(struct_ty),
|
||||||
|
..
|
||||||
|
} = scope.types.get(scope.type_values.get(&type_key).unwrap()).unwrap();
|
||||||
|
|
||||||
|
let indices = struct_ty.0.iter().enumerate();
|
||||||
|
|
||||||
let load_n = format!("{}.load", name);
|
let load_n = format!("{}.load", name);
|
||||||
|
|
||||||
let struct_ptr = scope
|
let struct_ptr = scope
|
||||||
.block
|
.block
|
||||||
.build_named(name, Instr::Alloca(struct_ty.clone()))
|
.build_named(name, Instr::Alloca(ty.clone()))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
|
|
||||||
for (i, (field_n, exp)) in items.iter().enumerate() {
|
for (field_n, exp) in items {
|
||||||
let gep_n = format!("{}.{}.gep", name, field_n);
|
let gep_n = format!("{}.{}.gep", name, field_n);
|
||||||
let store_n = format!("{}.{}.store", name, field_n);
|
let store_n = format!("{}.{}.store", name, field_n);
|
||||||
|
let i = indices.clone().find(|(_, f)| f.0 == *field_n).unwrap().0;
|
||||||
|
|
||||||
let elem_ptr = scope
|
let elem_ptr = scope
|
||||||
.block
|
.block
|
||||||
@ -1075,10 +1083,7 @@ impl mir::Expression {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let struct_val = scope
|
let struct_val = scope.block.build_named(load_n, Instr::Load(struct_ptr, ty)).unwrap();
|
||||||
.block
|
|
||||||
.build_named(load_n, Instr::Load(struct_ptr, struct_ty))
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
Some(StackValue(
|
Some(StackValue(
|
||||||
StackValueKind::Literal(struct_val),
|
StackValueKind::Literal(struct_val),
|
||||||
|
Loading…
Reference in New Issue
Block a user