Fix error reporting on No-Main-Function and add fp compilation
This commit is contained in:
		
							parent
							
								
									bcc93dd60c
								
							
						
					
					
						commit
						7c7dde03f9
					
				| @ -41,6 +41,7 @@ Currently missing big features (TODOs) are: | |||||||
| - ~~Pointers~~ (DONE) | - ~~Pointers~~ (DONE) | ||||||
| - ~~Unary operators~~ | - ~~Unary operators~~ | ||||||
| - Floats | - Floats | ||||||
|  | - Type casting | ||||||
| - Loops | - Loops | ||||||
| - Debug Information (PARTIALLY DONE) | - Debug Information (PARTIALLY DONE) | ||||||
| - Ability to specify types in literals and variable definitions | - Ability to specify types in literals and variable definitions | ||||||
|  | |||||||
| @ -1034,6 +1034,13 @@ impl ConstValue { | |||||||
|                     into_cstring(val).as_ptr(), |                     into_cstring(val).as_ptr(), | ||||||
|                     c"string".as_ptr(), |                     c"string".as_ptr(), | ||||||
|                 ), |                 ), | ||||||
|  |                 ConstValue::F16(val) => LLVMConstReal(t, *val as f64), | ||||||
|  |                 ConstValue::F32B(val) => LLVMConstReal(t, *val as f64), | ||||||
|  |                 ConstValue::F32(val) => LLVMConstReal(t, *val as f64), | ||||||
|  |                 ConstValue::F64(val) => LLVMConstReal(t, *val as f64), | ||||||
|  |                 ConstValue::F80(val) => LLVMConstReal(t, *val as f64), | ||||||
|  |                 ConstValue::F128(val) => LLVMConstReal(t, *val as f64), | ||||||
|  |                 ConstValue::F128PPC(val) => LLVMConstReal(t, *val as f64), | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -1058,6 +1065,13 @@ impl Type { | |||||||
|                 Ptr(ty) => LLVMPointerType(ty.as_llvm(context, typemap), 0), |                 Ptr(ty) => LLVMPointerType(ty.as_llvm(context, typemap), 0), | ||||||
|                 CustomType(struct_ty) => *typemap.get(struct_ty).unwrap(), |                 CustomType(struct_ty) => *typemap.get(struct_ty).unwrap(), | ||||||
|                 Array(r#type, len) => LLVMArrayType2(r#type.as_llvm(context, typemap), *len), |                 Array(r#type, len) => LLVMArrayType2(r#type.as_llvm(context, typemap), *len), | ||||||
|  |                 F16 => LLVMHalfTypeInContext(context), | ||||||
|  |                 F32 => LLVMFloatTypeInContext(context), | ||||||
|  |                 F32B => LLVMBFloatTypeInContext(context), | ||||||
|  |                 F64 => LLVMDoubleTypeInContext(context), | ||||||
|  |                 F80 => LLVMX86FP80TypeInContext(context), | ||||||
|  |                 F128 => LLVMFP128TypeInContext(context), | ||||||
|  |                 F128PPC => LLVMPPCFP128TypeInContext(context), | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -307,7 +307,7 @@ pub enum CmpPredicate { | |||||||
|     NE, |     NE, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Clone, Hash)] | #[derive(Clone)] | ||||||
| pub enum Instr { | pub enum Instr { | ||||||
|     Param(usize), |     Param(usize), | ||||||
|     Constant(ConstValue), |     Constant(ConstValue), | ||||||
| @ -344,6 +344,13 @@ pub enum Type { | |||||||
|     U32, |     U32, | ||||||
|     U64, |     U64, | ||||||
|     U128, |     U128, | ||||||
|  |     F16, | ||||||
|  |     F32B, | ||||||
|  |     F32, | ||||||
|  |     F64, | ||||||
|  |     F80, | ||||||
|  |     F128, | ||||||
|  |     F128PPC, | ||||||
|     Bool, |     Bool, | ||||||
|     Void, |     Void, | ||||||
|     CustomType(TypeValue), |     CustomType(TypeValue), | ||||||
| @ -351,7 +358,7 @@ pub enum Type { | |||||||
|     Ptr(Box<Type>), |     Ptr(Box<Type>), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone, Hash)] | #[derive(Debug, Clone)] | ||||||
| pub enum ConstValue { | pub enum ConstValue { | ||||||
|     I8(i8), |     I8(i8), | ||||||
|     I16(i16), |     I16(i16), | ||||||
| @ -365,6 +372,13 @@ pub enum ConstValue { | |||||||
|     U128(u128), |     U128(u128), | ||||||
|     Bool(bool), |     Bool(bool), | ||||||
|     StringPtr(String), |     StringPtr(String), | ||||||
|  |     F16(f32), | ||||||
|  |     F32B(f32), | ||||||
|  |     F32(f32), | ||||||
|  |     F64(f64), | ||||||
|  |     F80(f64), | ||||||
|  |     F128(f64), | ||||||
|  |     F128PPC(f64), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Clone, Hash)] | #[derive(Clone, Hash)] | ||||||
| @ -473,6 +487,13 @@ impl ConstValue { | |||||||
|             ConstValue::U128(_) => U128, |             ConstValue::U128(_) => U128, | ||||||
|             ConstValue::StringPtr(_) => Ptr(Box::new(I8)), |             ConstValue::StringPtr(_) => Ptr(Box::new(I8)), | ||||||
|             ConstValue::Bool(_) => Bool, |             ConstValue::Bool(_) => Bool, | ||||||
|  |             ConstValue::F16(_) => todo!(), | ||||||
|  |             ConstValue::F32B(_) => todo!(), | ||||||
|  |             ConstValue::F32(_) => todo!(), | ||||||
|  |             ConstValue::F64(_) => todo!(), | ||||||
|  |             ConstValue::F80(_) => todo!(), | ||||||
|  |             ConstValue::F128(_) => todo!(), | ||||||
|  |             ConstValue::F128PPC(_) => todo!(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -495,6 +516,13 @@ impl Type { | |||||||
|             Type::Ptr(_) => false, |             Type::Ptr(_) => false, | ||||||
|             Type::CustomType(_) => false, |             Type::CustomType(_) => false, | ||||||
|             Type::Array(_, _) => false, |             Type::Array(_, _) => false, | ||||||
|  |             Type::F16 => true, | ||||||
|  |             Type::F32B => true, | ||||||
|  |             Type::F32 => true, | ||||||
|  |             Type::F64 => true, | ||||||
|  |             Type::F80 => true, | ||||||
|  |             Type::F128 => true, | ||||||
|  |             Type::F128PPC => true, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -515,6 +543,13 @@ impl Type { | |||||||
|             Type::Ptr(_) => false, |             Type::Ptr(_) => false, | ||||||
|             Type::CustomType(_) => false, |             Type::CustomType(_) => false, | ||||||
|             Type::Array(_, _) => false, |             Type::Array(_, _) => false, | ||||||
|  |             Type::F16 => true, | ||||||
|  |             Type::F32B => true, | ||||||
|  |             Type::F32 => true, | ||||||
|  |             Type::F64 => true, | ||||||
|  |             Type::F80 => true, | ||||||
|  |             Type::F128 => true, | ||||||
|  |             Type::F128PPC => true, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -25,7 +25,7 @@ pub enum TypeKind { | |||||||
|     U64, |     U64, | ||||||
|     U128, |     U128, | ||||||
|     F16, |     F16, | ||||||
|     F16B, |     F32B, | ||||||
|     F32, |     F32, | ||||||
|     F64, |     F64, | ||||||
|     F128, |     F128, | ||||||
|  | |||||||
| @ -54,7 +54,7 @@ impl Parse for Type { | |||||||
|                     "u64" => TypeKind::U64, |                     "u64" => TypeKind::U64, | ||||||
|                     "u128" => TypeKind::U128, |                     "u128" => TypeKind::U128, | ||||||
|                     "f16" => TypeKind::F16, |                     "f16" => TypeKind::F16, | ||||||
|                     "f16b" => TypeKind::F16B, |                     "f32b" => TypeKind::F32B, | ||||||
|                     "f32" => TypeKind::F32, |                     "f32" => TypeKind::F32, | ||||||
|                     "f64" => TypeKind::F64, |                     "f64" => TypeKind::F64, | ||||||
|                     "f80" => TypeKind::F80, |                     "f80" => TypeKind::F80, | ||||||
|  | |||||||
| @ -285,7 +285,7 @@ impl ast::Literal { | |||||||
|             ast::Literal::Integer(v) => mir::Literal::Vague(mir::VagueLiteral::Number(*v)), |             ast::Literal::Integer(v) => mir::Literal::Vague(mir::VagueLiteral::Number(*v)), | ||||||
|             ast::Literal::Bool(v) => mir::Literal::Bool(*v), |             ast::Literal::Bool(v) => mir::Literal::Bool(*v), | ||||||
|             ast::Literal::String(val) => mir::Literal::String(val.clone()), |             ast::Literal::String(val) => mir::Literal::String(val.clone()), | ||||||
|             ast::Literal::Decimal(_) => todo!(), |             ast::Literal::Decimal(v) => mir::Literal::Vague(mir::VagueLiteral::Decimal(*v)), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -315,13 +315,13 @@ impl From<ast::TypeKind> for mir::TypeKind { | |||||||
|             ast::TypeKind::Ptr(type_kind) => { |             ast::TypeKind::Ptr(type_kind) => { | ||||||
|                 mir::TypeKind::UserPtr(Box::new(mir::TypeKind::from(*type_kind.clone()))) |                 mir::TypeKind::UserPtr(Box::new(mir::TypeKind::from(*type_kind.clone()))) | ||||||
|             } |             } | ||||||
|             ast::TypeKind::F16 => todo!(), |             ast::TypeKind::F16 => mir::TypeKind::F16, | ||||||
|             ast::TypeKind::F16B => todo!(), |             ast::TypeKind::F32B => mir::TypeKind::F32B, | ||||||
|             ast::TypeKind::F32 => todo!(), |             ast::TypeKind::F32 => mir::TypeKind::F32, | ||||||
|             ast::TypeKind::F64 => todo!(), |             ast::TypeKind::F64 => mir::TypeKind::F64, | ||||||
|             ast::TypeKind::F128 => todo!(), |             ast::TypeKind::F80 => mir::TypeKind::F80, | ||||||
|             ast::TypeKind::F80 => todo!(), |             ast::TypeKind::F128 => mir::TypeKind::F128, | ||||||
|             ast::TypeKind::F128PPC => todo!(), |             ast::TypeKind::F128PPC => mir::TypeKind::F128PPC, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1172,6 +1172,14 @@ impl mir::Literal { | |||||||
|             mir::Literal::Bool(val) => ConstValue::Bool(val), |             mir::Literal::Bool(val) => ConstValue::Bool(val), | ||||||
|             mir::Literal::String(val) => ConstValue::StringPtr(val.clone()), |             mir::Literal::String(val) => ConstValue::StringPtr(val.clone()), | ||||||
|             mir::Literal::Vague(VagueLiteral::Number(val)) => ConstValue::I32(val as i32), |             mir::Literal::Vague(VagueLiteral::Number(val)) => ConstValue::I32(val as i32), | ||||||
|  |             mir::Literal::Vague(VagueLiteral::Decimal(val)) => ConstValue::F32(val as f32), | ||||||
|  |             mir::Literal::F16(val) => ConstValue::F16(val), | ||||||
|  |             mir::Literal::F32B(val) => ConstValue::F32B(val), | ||||||
|  |             mir::Literal::F32(val) => ConstValue::F32(val), | ||||||
|  |             mir::Literal::F64(val) => ConstValue::F64(val), | ||||||
|  |             mir::Literal::F80(val) => ConstValue::F80(val), | ||||||
|  |             mir::Literal::F128(val) => ConstValue::F128(val), | ||||||
|  |             mir::Literal::F128PPC(val) => ConstValue::F128PPC(val), | ||||||
|         }) |         }) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -1194,6 +1202,13 @@ impl TypeKind { | |||||||
|             TypeKind::U64 => Type::U64, |             TypeKind::U64 => Type::U64, | ||||||
|             TypeKind::U128 => Type::U128, |             TypeKind::U128 => Type::U128, | ||||||
|             TypeKind::Bool => Type::Bool, |             TypeKind::Bool => Type::Bool, | ||||||
|  |             TypeKind::F16 => Type::F16, | ||||||
|  |             TypeKind::F32B => Type::F32B, | ||||||
|  |             TypeKind::F32 => Type::F32, | ||||||
|  |             TypeKind::F64 => Type::F64, | ||||||
|  |             TypeKind::F128 => Type::F128, | ||||||
|  |             TypeKind::F80 => Type::F80, | ||||||
|  |             TypeKind::F128PPC => Type::F128PPC, | ||||||
|             TypeKind::StringPtr => Type::Ptr(Box::new(Type::I8)), |             TypeKind::StringPtr => Type::Ptr(Box::new(Type::I8)), | ||||||
|             TypeKind::Array(elem_t, len) => { |             TypeKind::Array(elem_t, len) => { | ||||||
|                 Type::Array(Box::new(elem_t.get_type(type_vals, typedefs)), *len) |                 Type::Array(Box::new(elem_t.get_type(type_vals, typedefs)), *len) | ||||||
|  | |||||||
| @ -18,7 +18,7 @@ fn label(text: &str) -> &str { | |||||||
|     "" |     "" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(thiserror::Error, Debug, Clone, PartialEq, Eq)] | #[derive(thiserror::Error, Debug, Clone, PartialEq)] | ||||||
| pub enum ErrorKind { | pub enum ErrorKind { | ||||||
|     #[error("{}{}", label("(Lexing) "), .0.kind)] |     #[error("{}{}", label("(Lexing) "), .0.kind)] | ||||||
|     LexerError(#[from] mir::pass::Error<lexer::Error>), |     LexerError(#[from] mir::pass::Error<lexer::Error>), | ||||||
| @ -62,12 +62,6 @@ impl PartialOrd for ErrorKind { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Ord for ErrorKind { |  | ||||||
|     fn cmp(&self, other: &Self) -> std::cmp::Ordering { |  | ||||||
|         self.get_meta().cmp(&other.get_meta()) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #[derive(Debug, Clone, PartialEq, Eq)] | #[derive(Debug, Clone, PartialEq, Eq)] | ||||||
| pub struct Module { | pub struct Module { | ||||||
|     pub name: String, |     pub name: String, | ||||||
| @ -112,7 +106,7 @@ impl ModuleMap { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone, PartialEq, Eq)] | #[derive(Debug, Clone, PartialEq)] | ||||||
| pub struct ReidError { | pub struct ReidError { | ||||||
|     map: ModuleMap, |     map: ModuleMap, | ||||||
|     errors: Vec<ErrorKind>, |     errors: Vec<ErrorKind>, | ||||||
| @ -171,37 +165,38 @@ impl std::error::Error for ReidError {} | |||||||
| impl std::fmt::Display for ReidError { | impl std::fmt::Display for ReidError { | ||||||
|     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||||||
|         let mut sorted_errors = self.errors.clone(); |         let mut sorted_errors = self.errors.clone(); | ||||||
|         sorted_errors.sort_by(|a, b| a.cmp(&b)); |         sorted_errors.sort_by(|a, b| a.partial_cmp(&b).unwrap_or(std::cmp::Ordering::Equal)); | ||||||
|         sorted_errors.dedup(); |         sorted_errors.dedup(); | ||||||
| 
 | 
 | ||||||
|         let mut curr_module = None; |         let mut curr_module = None; | ||||||
|         for error in sorted_errors { |         for error in sorted_errors { | ||||||
|             let meta = error.get_meta(); |             let meta = error.get_meta(); | ||||||
|             let module = self.map.module(&meta.source_module_id).unwrap(); |             let module = self.map.module(&meta.source_module_id); | ||||||
|             let position = if let Some(tokens) = &module.tokens { |             let position = if let Some(module) = module { | ||||||
|                 let range_tokens = meta.range.into_tokens(&tokens); |                 if let Some(tokens) = &module.tokens { | ||||||
|  |                     let range_tokens = meta.range.into_tokens(&tokens); | ||||||
| 
 | 
 | ||||||
|                 get_position(&range_tokens).or(meta.position.map(|p| (p, p))) |                     get_position(&range_tokens).or(meta.position.map(|p| (p, p))) | ||||||
|             } else if let Some(position) = meta.position { |                 } else if let Some(position) = meta.position { | ||||||
|                 Some((position, position)) |                     Some((position, position)) | ||||||
|  |                 } else { | ||||||
|  |                     None | ||||||
|  |                 } | ||||||
|             } else { |             } else { | ||||||
|                 None |                 None | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             if curr_module != Some(meta.source_module_id) { |             if curr_module != Some(meta.source_module_id) { | ||||||
|                 curr_module = Some(meta.source_module_id); |                 curr_module = Some(meta.source_module_id); | ||||||
|                 writeln!( |                 if let Some(module) = self.map.module_map.get(&meta.source_module_id) { | ||||||
|                     f, |                     writeln!( | ||||||
|                     "Errors in module {}:", |                         f, | ||||||
|                     color_err(format!( |                         "Errors in module {}:", | ||||||
|                         "{}", |                         color_err(format!("{}", module.name))? | ||||||
|                         self.map |                     )?; | ||||||
|                             .module_map |                 } else { | ||||||
|                             .get(&meta.source_module_id) |                     writeln!(f, "Errors detected: {}", color_err("in general")?)?; | ||||||
|                             .unwrap() |                 } | ||||||
|                             .name |  | ||||||
|                     ))? |  | ||||||
|                 )?; |  | ||||||
|             } |             } | ||||||
|             writeln!(f)?; |             writeln!(f)?; | ||||||
|             write!(f, "  Error: ")?; |             write!(f, "  Error: ")?; | ||||||
| @ -214,7 +209,9 @@ impl std::fmt::Display for ReidError { | |||||||
|                     .map(|p| fmt_positions(p)) |                     .map(|p| fmt_positions(p)) | ||||||
|                     .unwrap_or(String::from("{unknown}")), |                     .unwrap_or(String::from("{unknown}")), | ||||||
|             )?; |             )?; | ||||||
|             if let (Some(position), Some(source)) = (position, &module.source) { |             if let (Some(position), Some(source)) = | ||||||
|  |                 (position, &module.and_then(|m| m.source.clone())) | ||||||
|  |             { | ||||||
|                 writeln!(f, "{}", fmt_lines(source, position, 6)?)?; |                 writeln!(f, "{}", fmt_lines(source, position, 6)?)?; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -261,6 +261,13 @@ impl Display for Literal { | |||||||
|             Literal::Bool(val) => write!(f, "{}", val), |             Literal::Bool(val) => write!(f, "{}", val), | ||||||
|             Literal::String(val) => std::fmt::Debug::fmt(val, f), |             Literal::String(val) => std::fmt::Debug::fmt(val, f), | ||||||
|             Literal::Vague(val) => val.fmt(f), |             Literal::Vague(val) => val.fmt(f), | ||||||
|  |             Literal::F16(val) => write!(f, "{}f16", val), | ||||||
|  |             Literal::F32B(val) => write!(f, "{}f16b", val), | ||||||
|  |             Literal::F32(val) => write!(f, "{}f32", val), | ||||||
|  |             Literal::F64(val) => write!(f, "{}f64", val), | ||||||
|  |             Literal::F80(val) => write!(f, "{}f80", val), | ||||||
|  |             Literal::F128(val) => write!(f, "{}f128", val), | ||||||
|  |             Literal::F128PPC(val) => write!(f, "{}f128ppc", val), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -354,6 +361,13 @@ impl Display for TypeKind { | |||||||
|                 Display::fmt(type_kind, f) |                 Display::fmt(type_kind, f) | ||||||
|             } |             } | ||||||
|             TypeKind::Vague(vague_type) => Display::fmt(vague_type, f), |             TypeKind::Vague(vague_type) => Display::fmt(vague_type, f), | ||||||
|  |             TypeKind::F16 => write!(f, "f16"), | ||||||
|  |             TypeKind::F32B => write!(f, "f16b"), | ||||||
|  |             TypeKind::F32 => write!(f, "f32"), | ||||||
|  |             TypeKind::F64 => write!(f, "f64"), | ||||||
|  |             TypeKind::F128 => write!(f, "f128"), | ||||||
|  |             TypeKind::F80 => write!(f, "f80"), | ||||||
|  |             TypeKind::F128PPC => write!(f, "f128ppc"), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -363,14 +377,16 @@ impl Display for VagueType { | |||||||
|         if f.alternate() { |         if f.alternate() { | ||||||
|             match self { |             match self { | ||||||
|                 VagueType::Unknown => write!(f, "Unknown"), |                 VagueType::Unknown => write!(f, "Unknown"), | ||||||
|                 VagueType::Number => write!(f, "Number"), |                 VagueType::Integer => write!(f, "Number"), | ||||||
|                 VagueType::TypeRef(id) => write!(f, "TypeRef({0})", id), |                 VagueType::TypeRef(id) => write!(f, "TypeRef({0})", id), | ||||||
|  |                 VagueType::Decimal => write!(f, "Decimal"), | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             match self { |             match self { | ||||||
|                 VagueType::Unknown => write!(f, "{{unknown}}"), |                 VagueType::Unknown => write!(f, "{{unknown}}"), | ||||||
|                 VagueType::Number => write!(f, "Number"), |                 VagueType::Integer => write!(f, "Number"), | ||||||
|                 VagueType::TypeRef(_) => write!(f, "{{unknown}}"), |                 VagueType::TypeRef(_) => write!(f, "{{unknown}}"), | ||||||
|  |                 VagueType::Decimal => write!(f, "Decimal"), | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -44,12 +44,19 @@ impl TypeKind { | |||||||
|             TypeKind::U128 => false, |             TypeKind::U128 => false, | ||||||
|             TypeKind::Void => false, |             TypeKind::Void => false, | ||||||
|             TypeKind::StringPtr => false, |             TypeKind::StringPtr => false, | ||||||
|             TypeKind::Array(type_kind, len) => false, |             TypeKind::Array(_, _) => false, | ||||||
|             TypeKind::CustomType(_) => false, |             TypeKind::CustomType(_) => false, | ||||||
|             TypeKind::CodegenPtr(_) => false, |             TypeKind::CodegenPtr(_) => false, | ||||||
|             TypeKind::Vague(_) => false, |             TypeKind::Vague(_) => false, | ||||||
|             TypeKind::Borrow(_, _) => false, |             TypeKind::Borrow(_, _) => false, | ||||||
|             TypeKind::UserPtr(_) => false, |             TypeKind::UserPtr(_) => false, | ||||||
|  |             TypeKind::F16 => true, | ||||||
|  |             TypeKind::F32B => true, | ||||||
|  |             TypeKind::F32 => true, | ||||||
|  |             TypeKind::F64 => true, | ||||||
|  |             TypeKind::F128 => true, | ||||||
|  |             TypeKind::F80 => true, | ||||||
|  |             TypeKind::F128PPC => true, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -74,6 +81,13 @@ impl TypeKind { | |||||||
|             TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"), |             TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"), | ||||||
|             TypeKind::Borrow(_, _) => 64, |             TypeKind::Borrow(_, _) => 64, | ||||||
|             TypeKind::UserPtr(_) => 64, |             TypeKind::UserPtr(_) => 64, | ||||||
|  |             TypeKind::F16 => 16, | ||||||
|  |             TypeKind::F32B => 16, | ||||||
|  |             TypeKind::F32 => 32, | ||||||
|  |             TypeKind::F64 => 64, | ||||||
|  |             TypeKind::F128 => 128, | ||||||
|  |             TypeKind::F80 => 80, | ||||||
|  |             TypeKind::F128PPC => 128, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -98,6 +112,13 @@ impl TypeKind { | |||||||
|             TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"), |             TypeKind::Vague(_) => panic!("Tried to sizeof a vague type!"), | ||||||
|             TypeKind::Borrow(_, _) => 64, |             TypeKind::Borrow(_, _) => 64, | ||||||
|             TypeKind::UserPtr(_) => 64, |             TypeKind::UserPtr(_) => 64, | ||||||
|  |             TypeKind::F16 => 16, | ||||||
|  |             TypeKind::F32B => 16, | ||||||
|  |             TypeKind::F32 => 32, | ||||||
|  |             TypeKind::F64 => 64, | ||||||
|  |             TypeKind::F128 => 128, | ||||||
|  |             TypeKind::F80 => 80, | ||||||
|  |             TypeKind::F128PPC => 128, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -379,8 +400,9 @@ impl TypeKind { | |||||||
|         match self { |         match self { | ||||||
|             TypeKind::Vague(vague_type) => match &vague_type { |             TypeKind::Vague(vague_type) => match &vague_type { | ||||||
|                 Vague::Unknown => Err(ErrorKind::TypeIsVague(*vague_type)), |                 Vague::Unknown => Err(ErrorKind::TypeIsVague(*vague_type)), | ||||||
|                 Vague::Number => Ok(TypeKind::I32), |                 Vague::Integer => Ok(TypeKind::I32), | ||||||
|                 Vague::TypeRef(_) => panic!("Hinted default!"), |                 Vague::TypeRef(_) => panic!("Hinted default!"), | ||||||
|  |                 VagueType::Decimal => Ok(TypeKind::F32), | ||||||
|             }, |             }, | ||||||
|             _ => Ok(self.clone()), |             _ => Ok(self.clone()), | ||||||
|         } |         } | ||||||
| @ -418,10 +440,10 @@ impl Collapsable for TypeKind { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         match (self, other) { |         match (self, other) { | ||||||
|             (TypeKind::Vague(Vague::Number), other) | (other, TypeKind::Vague(Vague::Number)) => { |             (TypeKind::Vague(Vague::Integer), other) | (other, TypeKind::Vague(Vague::Integer)) => { | ||||||
|                 match other { |                 match other { | ||||||
|                     TypeKind::Vague(Vague::Unknown) => Ok(TypeKind::Vague(Vague::Number)), |                     TypeKind::Vague(Vague::Unknown) => Ok(TypeKind::Vague(Vague::Integer)), | ||||||
|                     TypeKind::Vague(Vague::Number) => Ok(TypeKind::Vague(Vague::Number)), |                     TypeKind::Vague(Vague::Integer) => Ok(TypeKind::Vague(Vague::Integer)), | ||||||
|                     TypeKind::I8 |                     TypeKind::I8 | ||||||
|                     | TypeKind::I16 |                     | TypeKind::I16 | ||||||
|                     | TypeKind::I32 |                     | TypeKind::I32 | ||||||
| @ -474,6 +496,14 @@ impl Literal { | |||||||
|             Literal::Bool(_) => None, |             Literal::Bool(_) => None, | ||||||
|             Literal::String(_) => None, |             Literal::String(_) => None, | ||||||
|             Literal::Vague(VagueLiteral::Number(val)) => Some(*val as i128), |             Literal::Vague(VagueLiteral::Number(val)) => Some(*val as i128), | ||||||
|  |             Literal::Vague(VagueLiteral::Decimal(_)) => None, | ||||||
|  |             Literal::F16(_) => None, | ||||||
|  |             Literal::F32B(_) => None, | ||||||
|  |             Literal::F32(_) => None, | ||||||
|  |             Literal::F64(_) => None, | ||||||
|  |             Literal::F80(_) => None, | ||||||
|  |             Literal::F128(_) => None, | ||||||
|  |             Literal::F128PPC(_) => None, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -91,6 +91,13 @@ pub enum TypeKind { | |||||||
|     U64, |     U64, | ||||||
|     U128, |     U128, | ||||||
|     Void, |     Void, | ||||||
|  |     F16, | ||||||
|  |     F32B, | ||||||
|  |     F32, | ||||||
|  |     F64, | ||||||
|  |     F128, | ||||||
|  |     F80, | ||||||
|  |     F128PPC, | ||||||
|     StringPtr, |     StringPtr, | ||||||
|     Array(Box<TypeKind>, u64), |     Array(Box<TypeKind>, u64), | ||||||
|     CustomType(String), |     CustomType(String), | ||||||
| @ -103,7 +110,8 @@ pub enum TypeKind { | |||||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | ||||||
| pub enum VagueType { | pub enum VagueType { | ||||||
|     Unknown, |     Unknown, | ||||||
|     Number, |     Integer, | ||||||
|  |     Decimal, | ||||||
|     TypeRef(usize), |     TypeRef(usize), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -133,7 +141,7 @@ impl TypeKind { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] | #[derive(Debug, Clone, PartialEq, PartialOrd)] | ||||||
| pub enum Literal { | pub enum Literal { | ||||||
|     I8(i8), |     I8(i8), | ||||||
|     I16(i16), |     I16(i16), | ||||||
| @ -145,14 +153,22 @@ pub enum Literal { | |||||||
|     U32(u32), |     U32(u32), | ||||||
|     U64(u64), |     U64(u64), | ||||||
|     U128(u128), |     U128(u128), | ||||||
|  |     F16(f32), | ||||||
|  |     F32B(f32), | ||||||
|  |     F32(f32), | ||||||
|  |     F64(f64), | ||||||
|  |     F80(f64), | ||||||
|  |     F128(f64), | ||||||
|  |     F128PPC(f64), | ||||||
|     Bool(bool), |     Bool(bool), | ||||||
|     String(String), |     String(String), | ||||||
|     Vague(VagueLiteral), |     Vague(VagueLiteral), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] | #[derive(Debug, Clone, Copy, PartialEq, PartialOrd)] | ||||||
| pub enum VagueLiteral { | pub enum VagueLiteral { | ||||||
|     Number(u64), |     Number(u64), | ||||||
|  |     Decimal(f64), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Literal { | impl Literal { | ||||||
| @ -170,7 +186,15 @@ impl Literal { | |||||||
|             Literal::U128(_) => TypeKind::U128, |             Literal::U128(_) => TypeKind::U128, | ||||||
|             Literal::Bool(_) => TypeKind::Bool, |             Literal::Bool(_) => TypeKind::Bool, | ||||||
|             Literal::String(_) => TypeKind::StringPtr, |             Literal::String(_) => TypeKind::StringPtr, | ||||||
|             Literal::Vague(VagueLiteral::Number(_)) => TypeKind::Vague(VagueType::Number), |             Literal::Vague(VagueLiteral::Number(_)) => TypeKind::Vague(VagueType::Integer), | ||||||
|  |             Literal::Vague(VagueLiteral::Decimal(_)) => TypeKind::Vague(VagueType::Decimal), | ||||||
|  |             Literal::F16(_) => TypeKind::F16, | ||||||
|  |             Literal::F32B(_) => TypeKind::F32B, | ||||||
|  |             Literal::F32(_) => TypeKind::F32, | ||||||
|  |             Literal::F64(_) => TypeKind::F64, | ||||||
|  |             Literal::F80(_) => TypeKind::F80, | ||||||
|  |             Literal::F128(_) => TypeKind::F128, | ||||||
|  |             Literal::F128PPC(_) => TypeKind::F128PPC, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -178,7 +202,8 @@ impl Literal { | |||||||
| impl VagueLiteral { | impl VagueLiteral { | ||||||
|     pub fn as_type(self: &VagueLiteral) -> VagueType { |     pub fn as_type(self: &VagueLiteral) -> VagueType { | ||||||
|         match self { |         match self { | ||||||
|             VagueLiteral::Number(_) => VagueType::Number, |             VagueLiteral::Number(_) => VagueType::Integer, | ||||||
|  |             VagueLiteral::Decimal(_) => VagueType::Decimal, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -11,7 +11,7 @@ use super::{ | |||||||
|     typerefs::TypeRefs, |     typerefs::TypeRefs, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #[derive(thiserror::Error, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] | #[derive(thiserror::Error, Debug, Clone, PartialEq, PartialOrd)] | ||||||
| pub enum ErrorKind { | pub enum ErrorKind { | ||||||
|     #[error("NULL error, should never occur!")] |     #[error("NULL error, should never occur!")] | ||||||
|     Null, |     Null, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user