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