Fix default for arrays
This commit is contained in:
		
							parent
							
								
									f6ed39d4e5
								
							
						
					
					
						commit
						7027ee3645
					
				| @ -596,15 +596,25 @@ impl TypeKind { | ||||
|     /// Try to collapse a type on itself producing a default type if one exists,
 | ||||
|     /// Error if not.
 | ||||
|     pub fn or_default(&self) -> Result<TypeKind, ErrorKind> { | ||||
|         match self { | ||||
|         Ok(match self { | ||||
|             TypeKind::Vague(vague_type) => match &vague_type { | ||||
|                 Vague::Unknown => Err(ErrorKind::TypeIsVague(*vague_type)), | ||||
|                 Vague::Integer => Ok(TypeKind::I32), | ||||
|                 Vague::Unknown => Err(ErrorKind::TypeIsVague(*vague_type))?, | ||||
|                 Vague::Integer => TypeKind::I32, | ||||
|                 Vague::TypeRef(_) => panic!("Hinted default!"), | ||||
|                 VagueType::Decimal => Ok(TypeKind::F32), | ||||
|                 VagueType::Decimal => TypeKind::F32, | ||||
|             }, | ||||
|             _ => Ok(self.clone()), | ||||
|         } | ||||
|             TypeKind::Array(type_kind, len) => { | ||||
|                 TypeKind::Array(Box::new(type_kind.or_default()?), *len) | ||||
|             } | ||||
|             TypeKind::Borrow(type_kind, mutable) => { | ||||
|                 TypeKind::Borrow(Box::new(type_kind.or_default()?), *mutable) | ||||
|             } | ||||
|             TypeKind::UserPtr(type_kind) => TypeKind::UserPtr(Box::new(type_kind.or_default()?)), | ||||
|             TypeKind::CodegenPtr(type_kind) => { | ||||
|                 TypeKind::CodegenPtr(Box::new(type_kind.or_default()?)) | ||||
|             } | ||||
|             _ => self.clone(), | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     pub fn resolve_weak(&self, refs: &TypeRefs) -> TypeKind { | ||||
|  | ||||
| @ -222,7 +222,11 @@ impl Block { | ||||
|             let ret = match &mut statement.0 { | ||||
|                 StmtKind::Let(variable_reference, mutable, expression) => { | ||||
|                     // Resolve possible hint in var reference
 | ||||
|                     let var_t_resolved = variable_reference.0.resolve_ref(&typerefs); | ||||
|                     let var_t_resolved = state.or_else( | ||||
|                         variable_reference.0.resolve_ref(&typerefs).or_default(), | ||||
|                         TypeKind::Vague(VagueType::Unknown), | ||||
|                         variable_reference.2, | ||||
|                     ); | ||||
| 
 | ||||
|                     // Typecheck (and coerce) expression with said type
 | ||||
|                     let res = expression.typecheck(&mut state, &typerefs, Some(&var_t_resolved)); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user