Fix bug in custom binops where their return types aren't inferred
This commit is contained in:
		
							parent
							
								
									0196fb53ed
								
							
						
					
					
						commit
						c316d94b75
					
				| @ -1,19 +1,9 @@ | |||||||
| 
 | 
 | ||||||
| import std::print; | import std::print; | ||||||
| import std::from_str; | import std::from_str; | ||||||
| import std::concat_strings; |  | ||||||
| import std::free_string; |  | ||||||
| import std::String; | import std::String; | ||||||
| 
 | 
 | ||||||
| fn otus(param: &mut String) { |  | ||||||
|     let b: String = from_str(" bello"); |  | ||||||
|     concat_strings(param, b); |  | ||||||
|     free_string(&b); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| fn main() -> u8 { | fn main() -> u8 { | ||||||
|     let mut otus = from_str("hello"); |     print((from_str("hello") + " beep: ") + 1234u64); | ||||||
|     otus(&mut otus); |  | ||||||
|     print(otus + " beep"); |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
							
								
								
									
										10
									
								
								examples/testmod.reid
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								examples/testmod.reid
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | 
 | ||||||
|  | struct Otus {} | ||||||
|  | 
 | ||||||
|  | impl binop (lhs: Otus) + (rhs: u64) -> Otus { | ||||||
|  |     return lhs; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn make_otus() -> Otus { | ||||||
|  |     return Otus {}; | ||||||
|  | } | ||||||
| @ -16,7 +16,13 @@ impl binop (lhs: String) + (rhs: *char) -> String { | |||||||
|     let added = from_str(rhs); |     let added = from_str(rhs); | ||||||
|     concat_strings(&mut new, added); |     concat_strings(&mut new, added); | ||||||
|     free_string(&added); |     free_string(&added); | ||||||
|     return lhs; |     return new; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl binop (lhs: String) + (rhs: u64) -> String { | ||||||
|  |     let mut new = lhs; | ||||||
|  |     add_num_to_str(&mut new, rhs); | ||||||
|  |     return new; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct div_t { | struct div_t { | ||||||
|  | |||||||
| @ -173,9 +173,9 @@ pub fn perform_all_passes<'map>( | |||||||
|         )); |         )); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let refs = TypeRefs::with_binops(binops); |     let mut refs = TypeRefs::with_binops(binops); | ||||||
| 
 | 
 | ||||||
|     let state = context.pass(&mut TypeInference { refs: &refs })?; |     let state = context.pass(&mut TypeInference { refs: &mut refs })?; | ||||||
| 
 | 
 | ||||||
|     #[cfg(debug_assertions)] |     #[cfg(debug_assertions)] | ||||||
|     println!("{:-^100}", "TYPE INFERRER OUTPUT"); |     println!("{:-^100}", "TYPE INFERRER OUTPUT"); | ||||||
|  | |||||||
| @ -33,7 +33,7 @@ use super::{ | |||||||
| /// TypeRefs-struct is used as a helper to go through the modules and change
 | /// TypeRefs-struct is used as a helper to go through the modules and change
 | ||||||
| /// types while inferring.
 | /// types while inferring.
 | ||||||
| pub struct TypeInference<'t> { | pub struct TypeInference<'t> { | ||||||
|     pub refs: &'t TypeRefs, |     pub refs: &'t mut TypeRefs, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'t> Pass for TypeInference<'t> { | impl<'t> Pass for TypeInference<'t> { | ||||||
| @ -77,7 +77,18 @@ impl<'t> Pass for TypeInference<'t> { | |||||||
|                     binop.signature(), |                     binop.signature(), | ||||||
|                 ); |                 ); | ||||||
|             } else { |             } else { | ||||||
|                 seen_binops.insert(binop_key); |                 seen_binops.insert(binop_key.clone()); | ||||||
|  |                 self.refs | ||||||
|  |                     .binop_types | ||||||
|  |                     .set( | ||||||
|  |                         binop_key, | ||||||
|  |                         crate::mir::pass::ScopeBinopDef { | ||||||
|  |                             hands: (binop.lhs.1.clone(), binop.rhs.1.clone()), | ||||||
|  |                             operator: binop.op, | ||||||
|  |                             return_ty: binop.return_type.clone(), | ||||||
|  |                         }, | ||||||
|  |                     ) | ||||||
|  |                     .ok(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -119,7 +130,6 @@ impl BinopDefinition { | |||||||
|             .fn_kind |             .fn_kind | ||||||
|             .infer_types(state, &scope_hints, Some(self.return_type.clone()))?; |             .infer_types(state, &scope_hints, Some(self.return_type.clone()))?; | ||||||
|         if let Some(mut ret_ty) = ret_ty { |         if let Some(mut ret_ty) = ret_ty { | ||||||
|             dbg!(&ret_ty, &self.return_type); |  | ||||||
|             ret_ty.narrow(&scope_hints.from_type(&self.return_type).unwrap()); |             ret_ty.narrow(&scope_hints.from_type(&self.return_type).unwrap()); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -320,7 +330,7 @@ impl Expression { | |||||||
|                             continue; |                             continue; | ||||||
|                         } |                         } | ||||||
|                         if binop.operator.is_commutative() { |                         if binop.operator.is_commutative() { | ||||||
|                             if let Some(_) = binop.narrow(&lhs_ty, &rhs_ty) { |                             if let Some(_) = binop.narrow(&rhs_ty, &lhs_ty) { | ||||||
|                                 applying_binops.push(binop.clone()); |                                 applying_binops.push(binop.clone()); | ||||||
|                                 continue; |                                 continue; | ||||||
|                             } |                             } | ||||||
| @ -330,7 +340,6 @@ impl Expression { | |||||||
|                 } else { |                 } else { | ||||||
|                     Vec::new() |                     Vec::new() | ||||||
|                 }; |                 }; | ||||||
| 
 |  | ||||||
|                 if binops.len() > 0 { |                 if binops.len() > 0 { | ||||||
|                     let binop = unsafe { binops.get_unchecked(0) }; |                     let binop = unsafe { binops.get_unchecked(0) }; | ||||||
|                     let mut widened_lhs = binop.hands.0.clone(); |                     let mut widened_lhs = binop.hands.0.clone(); | ||||||
|  | |||||||
| @ -80,7 +80,7 @@ impl TypeRefKind { | |||||||
|                     while let Some(other) = binops.next() { |                     while let Some(other) = binops.next() { | ||||||
|                         ty = ty.widen_into(&other); |                         ty = ty.widen_into(&other); | ||||||
|                     } |                     } | ||||||
|                     ty |                     ty.clone() | ||||||
|                 } else { |                 } else { | ||||||
|                     TypeKind::Vague(VagueType::Unknown) |                     TypeKind::Vague(VagueType::Unknown) | ||||||
|                 } |                 } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user