Fix typeinference and checking for borrows/derefs
This commit is contained in:
		
							parent
							
								
									47fa5f342f
								
							
						
					
					
						commit
						550fec2827
					
				| @ -230,9 +230,9 @@ impl Expression { | ||||
|                 Ok((ret_type.0, TypeKind::Borrow(Box::new(ret_type.1)))) | ||||
|             } | ||||
|             Deref(var) => { | ||||
|                 let ret_type = var.return_type()?; | ||||
|                 match ret_type { | ||||
|                     (_, TypeKind::Borrow(type_kind)) => Ok((ret_type.0, *type_kind)), | ||||
|                 let (kind, ret_type) = var.return_type()?; | ||||
|                 match ret_type.resolve_weak(refs) { | ||||
|                     TypeKind::Borrow(type_kind) => Ok((kind, *type_kind)), | ||||
|                     _ => Err(ReturnTypeOther::DerefNonBorrow(var.2)), | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| @ -103,10 +103,10 @@ impl<'map> Pass for LinkerPass<'map> { | ||||
|             modules.insert(module.name.clone(), Rc::new(RefCell::new((module, tokens)))); | ||||
|         } | ||||
| 
 | ||||
|         modules.insert( | ||||
|             "std".to_owned(), | ||||
|             Rc::new(RefCell::new(compile_std(&mut self.module_map)?)), | ||||
|         ); | ||||
|         // modules.insert(
 | ||||
|         //     "std".to_owned(),
 | ||||
|         //     Rc::new(RefCell::new(compile_std(&mut self.module_map)?)),
 | ||||
|         // );
 | ||||
| 
 | ||||
|         let mut modules_to_process: Vec<Rc<RefCell<(Module, Vec<FullToken>)>>> = | ||||
|             modules.values().cloned().collect(); | ||||
|  | ||||
| @ -677,6 +677,8 @@ impl Expression { | ||||
|                     return Err(ErrorKind::AttemptedDerefNonBorrow(var_ref.1.clone())); | ||||
|                 }; | ||||
| 
 | ||||
|                 var_ref.0 = TypeKind::Borrow(inner.clone()); | ||||
| 
 | ||||
|                 Ok(*inner) | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -144,6 +144,8 @@ impl Block { | ||||
|         let mut ret_type_ref = outer_refs.from_type(&ty).unwrap(); | ||||
| 
 | ||||
|         // Narow return type to declared type if hard return
 | ||||
|         dbg!(&kind, ty); | ||||
| 
 | ||||
|         if kind == ReturnKind::Hard { | ||||
|             if let Some(hint) = &state.scope.return_type_hint { | ||||
|                 ret_type_ref.narrow(&mut outer_refs.from_type(&hint).unwrap()); | ||||
| @ -392,10 +394,16 @@ impl Expression { | ||||
|                     var.0 = hint.as_type(); | ||||
|                 } | ||||
| 
 | ||||
|                 match &var.0.resolve_weak(type_refs.types) { | ||||
|                 dbg!(&var.0); | ||||
|                 dbg!(&var.0.resolve_weak(type_refs.types)); | ||||
|                 let a = match &var.0.resolve_weak(type_refs.types) { | ||||
|                     Borrow(type_kind) => Ok(type_refs.from_type(&type_kind).unwrap()), | ||||
|                     _ => Err(ErrorKind::AttemptedDerefNonBorrow(var.1.clone())), | ||||
|                 } | ||||
|                 }; | ||||
| 
 | ||||
|                 dbg!(&a); | ||||
| 
 | ||||
|                 a | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user