Fix parsing of explicitly typed literals
This commit is contained in:
parent
242cf9fb2d
commit
b288fee2d5
@ -728,7 +728,6 @@ impl BlockHolder {
|
|||||||
))
|
))
|
||||||
.compile(module, function, block_ref);
|
.compile(module, function, block_ref);
|
||||||
|
|
||||||
dbg!(&self.value, &self.data.terminator_location);
|
|
||||||
if let Some(location) = &self.data.terminator_location {
|
if let Some(location) = &self.data.terminator_location {
|
||||||
LLVMInstructionSetDebugLoc(
|
LLVMInstructionSetDebugLoc(
|
||||||
term_instr.value_ref,
|
term_instr.value_ref,
|
||||||
@ -839,7 +838,6 @@ impl InstructionHolder {
|
|||||||
FCmp(pred, lhs, rhs) => {
|
FCmp(pred, lhs, rhs) => {
|
||||||
let lhs = module.values.get(&lhs).unwrap();
|
let lhs = module.values.get(&lhs).unwrap();
|
||||||
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
let rhs_val = module.values.get(&rhs).unwrap().value_ref;
|
||||||
dbg!(pred.as_llvm_unsorted_float());
|
|
||||||
LLVMBuildFCmp(
|
LLVMBuildFCmp(
|
||||||
module.builder_ref,
|
module.builder_ref,
|
||||||
pred.as_llvm_unsorted_float(),
|
pred.as_llvm_unsorted_float(),
|
||||||
|
@ -99,80 +99,72 @@ impl Parse for UnaryOperator {
|
|||||||
fn specific_float_lit(value: f64, stream: &mut TokenStream) -> Result<Expression, Error> {
|
fn specific_float_lit(value: f64, stream: &mut TokenStream) -> Result<Expression, Error> {
|
||||||
use ExpressionKind as Kind;
|
use ExpressionKind as Kind;
|
||||||
|
|
||||||
let specific_lit = if let Ok(ty) = stream.parse::<Type>() {
|
let lit = match stream
|
||||||
dbg!(&ty);
|
.parse_if::<Type, _>(|t| match t.0 {
|
||||||
match ty.0 {
|
TypeKind::F16 => true,
|
||||||
TypeKind::F16 => Some(SpecificLiteral::F16(value as f32)),
|
TypeKind::F32B => true,
|
||||||
TypeKind::F32 => Some(SpecificLiteral::F32(value as f32)),
|
TypeKind::F32 => true,
|
||||||
TypeKind::F32B => Some(SpecificLiteral::F32B(value as f32)),
|
TypeKind::F64 => true,
|
||||||
TypeKind::F64 => Some(SpecificLiteral::F64(value as f64)),
|
TypeKind::F128 => true,
|
||||||
TypeKind::F128 => Some(SpecificLiteral::F128(value as f64)),
|
TypeKind::F80 => true,
|
||||||
TypeKind::F80 => Some(SpecificLiteral::F80(value as f64)),
|
TypeKind::F128PPC => true,
|
||||||
TypeKind::F128PPC => Some(SpecificLiteral::F128PPC(value as f64)),
|
_ => false,
|
||||||
TypeKind::Array(..) => None,
|
})?
|
||||||
TypeKind::Ptr(..) => None,
|
.0
|
||||||
TypeKind::Custom(..) => None,
|
{
|
||||||
TypeKind::Borrow(..) => None,
|
TypeKind::F16 => SpecificLiteral::F16(value as f32),
|
||||||
_ => return Err(stream.expected_err("integer-compatible type")?),
|
TypeKind::F32 => SpecificLiteral::F32(value as f32),
|
||||||
}
|
TypeKind::F32B => SpecificLiteral::F32B(value as f32),
|
||||||
} else {
|
TypeKind::F64 => SpecificLiteral::F64(value as f64),
|
||||||
None
|
TypeKind::F128 => SpecificLiteral::F128(value as f64),
|
||||||
|
TypeKind::F80 => SpecificLiteral::F80(value as f64),
|
||||||
|
TypeKind::F128PPC => SpecificLiteral::F128PPC(value as f64),
|
||||||
|
_ => Err(stream.expected_err("float-compatible type")?)?,
|
||||||
};
|
};
|
||||||
Ok(if let Some(lit) = specific_lit {
|
Ok(Expression(
|
||||||
Expression(
|
Kind::Literal(Literal::Specific(lit)),
|
||||||
Kind::Literal(Literal::Specific(lit)),
|
stream.get_range().unwrap(),
|
||||||
stream.get_range().unwrap(),
|
))
|
||||||
)
|
|
||||||
} else {
|
|
||||||
Expression(
|
|
||||||
Kind::Literal(Literal::Decimal(value)),
|
|
||||||
stream.get_range().unwrap(),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn specific_int_lit(value: u128, stream: &mut TokenStream) -> Result<Expression, Error> {
|
fn specific_int_lit(value: u128, stream: &mut TokenStream) -> Result<Expression, Error> {
|
||||||
use ExpressionKind as Kind;
|
use ExpressionKind as Kind;
|
||||||
|
|
||||||
let specific_lit = if let Ok(ty) = stream.parse::<Type>() {
|
let lit = match stream
|
||||||
match ty.0 {
|
.parse_if::<Type, _>(|t| match t.0 {
|
||||||
TypeKind::I8 => Some(SpecificLiteral::I8(value as i8)),
|
TypeKind::Char => false,
|
||||||
TypeKind::I16 => Some(SpecificLiteral::I16(value as i16)),
|
TypeKind::Array(_, _) => false,
|
||||||
TypeKind::I32 => Some(SpecificLiteral::I32(value as i32)),
|
TypeKind::Custom(_) => false,
|
||||||
TypeKind::I64 => Some(SpecificLiteral::I64(value as i64)),
|
TypeKind::Borrow(_, _) => false,
|
||||||
TypeKind::I128 => Some(SpecificLiteral::I128(value as i128)),
|
TypeKind::Ptr(_) => false,
|
||||||
TypeKind::U8 => Some(SpecificLiteral::U8(value as u8)),
|
TypeKind::Bool => false,
|
||||||
TypeKind::U16 => Some(SpecificLiteral::U16(value as u16)),
|
_ => true,
|
||||||
TypeKind::U32 => Some(SpecificLiteral::U32(value as u32)),
|
})?
|
||||||
TypeKind::U64 => Some(SpecificLiteral::U64(value as u64)),
|
.0
|
||||||
TypeKind::U128 => Some(SpecificLiteral::U128(value as u128)),
|
{
|
||||||
TypeKind::F16 => Some(SpecificLiteral::F16(value as f32)),
|
TypeKind::I8 => SpecificLiteral::I8(value as i8),
|
||||||
TypeKind::F32 => Some(SpecificLiteral::F32(value as f32)),
|
TypeKind::I16 => SpecificLiteral::I16(value as i16),
|
||||||
TypeKind::F32B => Some(SpecificLiteral::F32B(value as f32)),
|
TypeKind::I32 => SpecificLiteral::I32(value as i32),
|
||||||
TypeKind::F64 => Some(SpecificLiteral::F64(value as f64)),
|
TypeKind::I64 => SpecificLiteral::I64(value as i64),
|
||||||
TypeKind::F128 => Some(SpecificLiteral::F128(value as f64)),
|
TypeKind::I128 => SpecificLiteral::I128(value as i128),
|
||||||
TypeKind::F80 => Some(SpecificLiteral::F80(value as f64)),
|
TypeKind::U8 => SpecificLiteral::U8(value as u8),
|
||||||
TypeKind::F128PPC => Some(SpecificLiteral::F128PPC(value as f64)),
|
TypeKind::U16 => SpecificLiteral::U16(value as u16),
|
||||||
TypeKind::Array(..) => None,
|
TypeKind::U32 => SpecificLiteral::U32(value as u32),
|
||||||
TypeKind::Ptr(..) => None,
|
TypeKind::U64 => SpecificLiteral::U64(value as u64),
|
||||||
TypeKind::Custom(..) => None,
|
TypeKind::U128 => SpecificLiteral::U128(value as u128),
|
||||||
TypeKind::Borrow(..) => None,
|
TypeKind::F16 => SpecificLiteral::F16(value as f32),
|
||||||
_ => return Err(stream.expected_err("integer-compatible type")?),
|
TypeKind::F32 => SpecificLiteral::F32(value as f32),
|
||||||
}
|
TypeKind::F32B => SpecificLiteral::F32B(value as f32),
|
||||||
} else {
|
TypeKind::F64 => SpecificLiteral::F64(value as f64),
|
||||||
None
|
TypeKind::F128 => SpecificLiteral::F128(value as f64),
|
||||||
|
TypeKind::F80 => SpecificLiteral::F80(value as f64),
|
||||||
|
TypeKind::F128PPC => SpecificLiteral::F128PPC(value as f64),
|
||||||
|
_ => return Err(stream.expected_err("integer-compatible type")?),
|
||||||
};
|
};
|
||||||
Ok(if let Some(lit) = specific_lit {
|
Ok(Expression(
|
||||||
Expression(
|
Kind::Literal(Literal::Specific(lit)),
|
||||||
Kind::Literal(Literal::Specific(lit)),
|
stream.get_range().unwrap(),
|
||||||
stream.get_range().unwrap(),
|
))
|
||||||
)
|
|
||||||
} else {
|
|
||||||
Expression(
|
|
||||||
Kind::Literal(Literal::Integer(value)),
|
|
||||||
stream.get_range().unwrap(),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -234,25 +226,43 @@ impl Parse for PrimaryExpression {
|
|||||||
}
|
}
|
||||||
Token::BinaryValue(v) => {
|
Token::BinaryValue(v) => {
|
||||||
stream.next(); // Consume binary
|
stream.next(); // Consume binary
|
||||||
specific_int_lit(
|
let value =
|
||||||
u128::from_str_radix(&v, 2).expect("Binary is not parseable as u128!"),
|
u128::from_str_radix(&v, 2).expect("Value is not parseable as u128!");
|
||||||
&mut stream,
|
if let Ok(expr) = specific_int_lit(value, &mut stream) {
|
||||||
)?
|
expr
|
||||||
|
} else {
|
||||||
|
Expression(
|
||||||
|
Kind::Literal(Literal::Integer(value)),
|
||||||
|
stream.get_range().unwrap(),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Token::OctalValue(v) => {
|
Token::OctalValue(v) => {
|
||||||
stream.next(); // Consume octal
|
stream.next(); // Consume octal
|
||||||
specific_int_lit(
|
let value =
|
||||||
u128::from_str_radix(&v, 8).expect("Octal is not parseable as u128!"),
|
u128::from_str_radix(&v, 8).expect("Value is not parseable as u128!");
|
||||||
&mut stream,
|
if let Ok(expr) = specific_int_lit(value, &mut stream) {
|
||||||
)?
|
expr
|
||||||
|
} else {
|
||||||
|
Expression(
|
||||||
|
Kind::Literal(Literal::Integer(value)),
|
||||||
|
stream.get_range().unwrap(),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Token::HexadecimalValue(v) => {
|
Token::HexadecimalValue(v) => {
|
||||||
stream.next(); // Consume hexadecimal
|
stream.next(); // Consume hexadecimal
|
||||||
specific_int_lit(
|
|
||||||
u128::from_str_radix(&v, 16)
|
let value =
|
||||||
.expect("Hexadecimal is not parseable as u128!"),
|
u128::from_str_radix(&v, 16).expect("Value is not parseable as u128!");
|
||||||
&mut stream,
|
if let Ok(expr) = specific_int_lit(value, &mut stream) {
|
||||||
)?
|
expr
|
||||||
|
} else {
|
||||||
|
Expression(
|
||||||
|
Kind::Literal(Literal::Integer(value)),
|
||||||
|
stream.get_range().unwrap(),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Token::DecimalValue(v) => {
|
Token::DecimalValue(v) => {
|
||||||
stream.next(); // Consume decimal
|
stream.next(); // Consume decimal
|
||||||
@ -266,15 +276,25 @@ impl Parse for PrimaryExpression {
|
|||||||
.parse()
|
.parse()
|
||||||
.expect("Decimal is not parseable as f64!");
|
.expect("Decimal is not parseable as f64!");
|
||||||
|
|
||||||
let a = specific_float_lit(value, &mut stream)?;
|
if let Ok(expr) = specific_float_lit(value, &mut stream) {
|
||||||
dbg!(&a);
|
expr
|
||||||
a
|
} else {
|
||||||
|
Expression(
|
||||||
|
Kind::Literal(Literal::Decimal(value)),
|
||||||
|
stream.get_range().unwrap(),
|
||||||
|
)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
specific_int_lit(
|
let value =
|
||||||
u128::from_str_radix(&v, 10)
|
u128::from_str_radix(&v, 10).expect("Value is not parseable as u128!");
|
||||||
.expect("Integer is not parseable as u128!"),
|
if let Ok(expr) = specific_int_lit(value, &mut stream) {
|
||||||
&mut stream,
|
expr
|
||||||
)?
|
} else {
|
||||||
|
Expression(
|
||||||
|
Kind::Literal(Literal::Integer(value)),
|
||||||
|
stream.get_range().unwrap(),
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Token::StringLit(v) => {
|
Token::StringLit(v) => {
|
||||||
|
@ -972,7 +972,6 @@ impl mir::Expression {
|
|||||||
Instr::Sub(lhs, mul)
|
Instr::Sub(lhs, mul)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
dbg!(&instr);
|
|
||||||
Some(StackValue(
|
Some(StackValue(
|
||||||
StackValueKind::Immutable(
|
StackValueKind::Immutable(
|
||||||
scope
|
scope
|
||||||
|
@ -565,9 +565,6 @@ impl Expression {
|
|||||||
let lhs_type = state.or_else(lhs_res, TypeKind::Vague(Vague::Unknown), lhs.1);
|
let lhs_type = state.or_else(lhs_res, TypeKind::Vague(Vague::Unknown), lhs.1);
|
||||||
let rhs_res = rhs.typecheck(state, &typerefs, Some(&lhs_type));
|
let rhs_res = rhs.typecheck(state, &typerefs, Some(&lhs_type));
|
||||||
let rhs_type = state.or_else(rhs_res, TypeKind::Vague(Vague::Unknown), rhs.1);
|
let rhs_type = state.or_else(rhs_res, TypeKind::Vague(Vague::Unknown), rhs.1);
|
||||||
dbg!(&op, &hint_t);
|
|
||||||
dbg!(&lhs_type);
|
|
||||||
dbg!(&rhs_type);
|
|
||||||
|
|
||||||
let both_t = lhs_type.collapse_into(&rhs_type)?;
|
let both_t = lhs_type.collapse_into(&rhs_type)?;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user