diff --git a/crates/mun_codegen/src/ir/body.rs b/crates/mun_codegen/src/ir/body.rs index ef3017f53..7f4431341 100644 --- a/crates/mun_codegen/src/ir/body.rs +++ b/crates/mun_codegen/src/ir/body.rs @@ -280,6 +280,9 @@ impl<'a, 'b, D: IrDatabase> BodyIrGenerator<'a, 'b, D> { hir::IntBitness::X16 => context.i16_type().const_int(v.value as u64, has_sign), hir::IntBitness::X32 => context.i32_type().const_int(v.value as u64, has_sign), hir::IntBitness::X64 => context.i64_type().const_int(v.value as u64, has_sign), + hir::IntBitness::X128 => { + context.i128_type().const_int(v.value as u64, has_sign) + } _ => unreachable!("unresolved bitness in code generation"), }; diff --git a/crates/mun_codegen/src/snapshots/test__literal_types.snap b/crates/mun_codegen/src/snapshots/test__literal_types.snap index 617fa76ed..5fa15ca2b 100644 --- a/crates/mun_codegen/src/snapshots/test__literal_types.snap +++ b/crates/mun_codegen/src/snapshots/test__literal_types.snap @@ -1,6 +1,6 @@ --- source: crates/mun_codegen/src/test.rs -expression: "pub fn main(){\n let a = 123;\n let a = 123u8;\n let a = 123u16;\n let a = 123u32;\n let a = 123u64;\n let a = 123uint;\n let a = 1_000_000_u32;\n let a = 123i8;\n let a = 123i16;\n let a = 123i32;\n let a = 123i64;\n let a = 123int;\n let a = 1_000_000_i32;\n let a = 1_000_123.0e-2;\n let a = 1_000_123.0e-2f32;\n let a = 1_000_123.0e-2f64;\n let a = 1_000_123.0e-2float;\n}\n\npub fn add(a:u32) -> u32 {\n a + 12u32\n}" +expression: "pub fn main(){\n let a = 123;\n let a = 123u8;\n let a = 123u16;\n let a = 123u32;\n let a = 123u64;\n let a = 123u128;\n let a = 123uint;\n let a = 1_000_000_u32;\n let a = 123i8;\n let a = 123i16;\n let a = 123i32;\n let a = 123i64;\n let a = 123i128;\n let a = 123int;\n let a = 1_000_000_i32;\n let a = 1_000_123.0e-2;\n let a = 1_000_123.0e-2f32;\n let a = 1_000_123.0e-2f64;\n let a = 1_000_123.0e-2float;\n}\n\npub fn add(a:u32) -> u32 {\n a + 12u32\n}" --- ; == FILE IR ===================================== ; ModuleID = 'main.mun' @@ -12,18 +12,20 @@ source_filename = "main.mun" define void @main() { body: - %a16 = alloca double + %a18 = alloca double + %a17 = alloca double + %a16 = alloca float %a15 = alloca double - %a14 = alloca float - %a13 = alloca double - %a12 = alloca i32 + %a14 = alloca i32 + %a13 = alloca i64 + %a12 = alloca i128 %a11 = alloca i64 - %a10 = alloca i64 - %a9 = alloca i32 - %a8 = alloca i16 - %a7 = alloca i8 - %a6 = alloca i32 - %a5 = alloca i64 + %a10 = alloca i32 + %a9 = alloca i16 + %a8 = alloca i8 + %a7 = alloca i32 + %a6 = alloca i64 + %a5 = alloca i128 %a4 = alloca i64 %a3 = alloca i32 %a2 = alloca i16 @@ -34,18 +36,20 @@ body: store i16 123, i16* %a2 store i32 123, i32* %a3 store i64 123, i64* %a4 - store i64 123, i64* %a5 - store i32 1000000, i32* %a6 - store i8 123, i8* %a7 - store i16 123, i16* %a8 - store i32 123, i32* %a9 - store i64 123, i64* %a10 + store i128 123, i128* %a5 + store i64 123, i64* %a6 + store i32 1000000, i32* %a7 + store i8 123, i8* %a8 + store i16 123, i16* %a9 + store i32 123, i32* %a10 store i64 123, i64* %a11 - store i32 1000000, i32* %a12 - store double 0x40C3889D70A3D70A, double* %a13 - store float 0x40C3889D80000000, float* %a14 + store i128 123, i128* %a12 + store i64 123, i64* %a13 + store i32 1000000, i32* %a14 store double 0x40C3889D70A3D70A, double* %a15 - store double 0x40C3889D70A3D70A, double* %a16 + store float 0x40C3889D80000000, float* %a16 + store double 0x40C3889D70A3D70A, double* %a17 + store double 0x40C3889D70A3D70A, double* %a18 ret void } diff --git a/crates/mun_codegen/src/snapshots/test__literal_types_file_ir.snap b/crates/mun_codegen/src/snapshots/test__literal_types_file_ir.snap index 27ee262cd..f28141166 100644 --- a/crates/mun_codegen/src/snapshots/test__literal_types_file_ir.snap +++ b/crates/mun_codegen/src/snapshots/test__literal_types_file_ir.snap @@ -1,24 +1,26 @@ --- source: crates/mun_codegen/src/test.rs -expression: "fn main(){\n let a = 123;\n let a = 123u8;\n let a = 123u16;\n let a = 123u32;\n let a = 123u64;\n let a = 123uint;\n let a = 1_000_000_u32;\n let a = 123i8;\n let a = 123i16;\n let a = 123i32;\n let a = 123i64;\n let a = 123int;\n let a = 1_000_000_i32;\n let a = 1_000_123.0e-2;\n let a = 1_000_123.0e-2f32;\n let a = 1_000_123.0e-2f64;\n let a = 1_000_123.0e-2float;\n}\n\nfn add(a:u32): u32 {\n a + 12u32\n}" +expression: "fn main(){\n let a = 123;\n let a = 123u8;\n let a = 123u16;\n let a = 123u32;\n let a = 123u64;\n let a = 123u128;\n let a = 123uint;\n let a = 1_000_000_u32;\n let a = 123i8;\n let a = 123i16;\n let a = 123i32;\n let a = 123i64;\n let a = 123i128;\n let a = 123int;\n let a = 1_000_000_i32;\n let a = 1_000_123.0e-2;\n let a = 1_000_123.0e-2f32;\n let a = 1_000_123.0e-2f64;\n let a = 1_000_123.0e-2float;\n}\n\nfn add(a:u32) -> u32 {\n a + 12u32\n}" --- ; ModuleID = 'main.mun' source_filename = "main.mun" define void @main() { body: - %a16 = alloca double + %a18 = alloca double + %a17 = alloca double + %a16 = alloca float %a15 = alloca double - %a14 = alloca float - %a13 = alloca double - %a12 = alloca i32 + %a14 = alloca i32 + %a13 = alloca i64 + %a12 = alloca i128 %a11 = alloca i64 - %a10 = alloca i64 - %a9 = alloca i32 - %a8 = alloca i16 - %a7 = alloca i8 - %a6 = alloca i32 - %a5 = alloca i64 + %a10 = alloca i32 + %a9 = alloca i16 + %a8 = alloca i8 + %a7 = alloca i32 + %a6 = alloca i64 + %a5 = alloca i128 %a4 = alloca i64 %a3 = alloca i32 %a2 = alloca i16 @@ -29,18 +31,20 @@ body: store i16 123, i16* %a2 store i32 123, i32* %a3 store i64 123, i64* %a4 - store i64 123, i64* %a5 - store i32 1000000, i32* %a6 - store i8 123, i8* %a7 - store i16 123, i16* %a8 - store i32 123, i32* %a9 - store i64 123, i64* %a10 + store i128 123, i128* %a5 + store i64 123, i64* %a6 + store i32 1000000, i32* %a7 + store i8 123, i8* %a8 + store i16 123, i16* %a9 + store i32 123, i32* %a10 store i64 123, i64* %a11 - store i32 1000000, i32* %a12 - store double 0x40C3889D70A3D70A, double* %a13 - store float 0x40C3889D80000000, float* %a14 + store i128 123, i128* %a12 + store i64 123, i64* %a13 + store i32 1000000, i32* %a14 store double 0x40C3889D70A3D70A, double* %a15 - store double 0x40C3889D70A3D70A, double* %a16 + store float 0x40C3889D80000000, float* %a16 + store double 0x40C3889D70A3D70A, double* %a17 + store double 0x40C3889D70A3D70A, double* %a18 ret void } diff --git a/crates/mun_codegen/src/test.rs b/crates/mun_codegen/src/test.rs index c789e1bcb..aac930702 100644 --- a/crates/mun_codegen/src/test.rs +++ b/crates/mun_codegen/src/test.rs @@ -51,12 +51,14 @@ fn literal_types() { let a = 123u16; let a = 123u32; let a = 123u64; + let a = 123u128; let a = 123uint; let a = 1_000_000_u32; let a = 123i8; let a = 123i16; let a = 123i32; let a = 123i64; + let a = 123i128; let a = 123int; let a = 1_000_000_i32; let a = 1_000_123.0e-2; diff --git a/crates/mun_hir/src/expr.rs b/crates/mun_hir/src/expr.rs index 712b5a9f7..df8e5f46f 100644 --- a/crates/mun_hir/src/expr.rs +++ b/crates/mun_hir/src/expr.rs @@ -1139,6 +1139,17 @@ mod test { ) ); + assert_eq!( + integer_lit("1234", Some("i128")), + ( + Literal::Int(LiteralInt { + kind: LiteralIntKind::Suffixed(BuiltinInt::I128), + value: 1234 + }), + vec![] + ) + ); + assert_eq!( integer_lit("1234", Some("isize")), ( @@ -1205,6 +1216,17 @@ mod test { ) ); + assert_eq!( + integer_lit("1234", Some("u128")), + ( + Literal::Int(LiteralInt { + kind: LiteralIntKind::Suffixed(BuiltinInt::U128), + value: 1234 + }), + vec![] + ) + ); + assert_eq!( integer_lit("1234", Some("usize")), ( diff --git a/crates/mun_hir/src/ty/snapshots/tests__infer_suffix_literals.snap b/crates/mun_hir/src/ty/snapshots/tests__infer_suffix_literals.snap index c5bdb460b..3159ab9fc 100644 --- a/crates/mun_hir/src/ty/snapshots/tests__infer_suffix_literals.snap +++ b/crates/mun_hir/src/ty/snapshots/tests__infer_suffix_literals.snap @@ -1,27 +1,29 @@ --- source: crates/mun_hir/src/ty/tests.rs -expression: "fn main(){\n 123;\n 123u8;\n 123u16;\n 123u32;\n 123u64;\n 123uint;\n 1_000_000_u32;\n 123i8;\n 123i16;\n 123i32;\n 123i64;\n 123int;\n 1_000_000_i32;\n 1_000_123.0e-2;\n 1_000_123.0e-2f32;\n 1_000_123.0e-2f64;\n 1_000_123.0e-2float;\n}\n\nfn add(a:u32) -> u32 {\n a + 12u32\n}" +expression: "fn main(){\n 123;\n 123u8;\n 123u16;\n 123u32;\n 123u64;\n 123u128;\n 123uint;\n 1_000_000_u32;\n 123i8;\n 123i16;\n 123i32;\n 123i64;\n 123i128;\n 123int;\n 1_000_000_i32;\n 1_000_123.0e-2;\n 1_000_123.0e-2f32;\n 1_000_123.0e-2f64;\n 1_000_123.0e-2float;\n}\n\nfn add(a:u32) -> u32 {\n a + 12u32\n}" --- -[9; 269) '{ ...oat; }': nothing +[9; 295) '{ ...oat; }': nothing [15; 18) '123': int [24; 29) '123u8': u8 [35; 41) '123u16': u16 [47; 53) '123u32': u32 [59; 65) '123u64': u64 -[71; 78) '123uint': uint -[84; 97) '1_000_000_u32': u32 -[103; 108) '123i8': i8 -[114; 120) '123i16': i16 -[126; 132) '123i32': i32 -[138; 144) '123i64': i64 -[150; 156) '123int': int -[162; 175) '1_000_000_i32': i32 -[181; 195) '1_000_123.0e-2': float -[201; 218) '1_000_...e-2f32': f32 -[224; 241) '1_000_...e-2f64': f64 -[247; 266) '1_000_...2float': float -[278; 279) 'a': u32 -[292; 309) '{ ...2u32 }': u32 -[298; 299) 'a': u32 -[298; 307) 'a + 12u32': u32 -[302; 307) '12u32': u32 +[71; 78) '123u128': u128 +[84; 91) '123uint': uint +[97; 110) '1_000_000_u32': u32 +[116; 121) '123i8': i8 +[127; 133) '123i16': i16 +[139; 145) '123i32': i32 +[151; 157) '123i64': i64 +[163; 170) '123i128': i128 +[176; 182) '123int': int +[188; 201) '1_000_000_i32': i32 +[207; 221) '1_000_123.0e-2': float +[227; 244) '1_000_...e-2f32': f32 +[250; 267) '1_000_...e-2f64': f64 +[273; 292) '1_000_...2float': float +[304; 305) 'a': u32 +[318; 335) '{ ...2u32 }': u32 +[324; 325) 'a': u32 +[324; 333) 'a + 12u32': u32 +[328; 333) '12u32': u32 diff --git a/crates/mun_hir/src/ty/tests.rs b/crates/mun_hir/src/ty/tests.rs index 105afb337..e0f2a7643 100644 --- a/crates/mun_hir/src/ty/tests.rs +++ b/crates/mun_hir/src/ty/tests.rs @@ -18,12 +18,14 @@ fn infer_suffix_literals() { 123u16; 123u32; 123u64; + 123u128; 123uint; 1_000_000_u32; 123i8; 123i16; 123i32; 123i64; + 123i128; 123int; 1_000_000_i32; 1_000_123.0e-2;