From: Muhammad Mahad Date: Wed, 2 Aug 2023 11:21:15 +0000 (+0500) Subject: gccrs: [E0308] mismatch types on assignment X-Git-Tag: basepoints/gcc-15~2259 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5db4f84f883513ff062f77c7eca5fdceeb58c825;p=thirdparty%2Fgcc.git gccrs: [E0308] mismatch types on assignment This errorcode emits when there are mismatch types between lhs & rhs of assignment operator & refactored message. This error code was used in many test cases, so updated the error comments. gcc/rust/ChangeLog: * typecheck/rust-unify.cc (UnifyRules::emit_type_mismatch): refactored & called error function. gcc/testsuite/ChangeLog: * rust/compile/arrays1.rs: changed comment to pass testcase. * rust/compile/bad_type1.rs: likewise. * rust/compile/bad_type2.rs: likewise. * rust/compile/const_generics_6.rs: likewise. * rust/compile/deadcode_err1.rs: likewise. * rust/compile/deadcode_err2.rs: likewise. * rust/compile/func1.rs: likewise. * rust/compile/func3.rs: likewise. * rust/compile/func4.rs: likewise. * rust/compile/func5.rs: likewise. * rust/compile/generics1.rs: likewise. * rust/compile/generics2.rs: likewise. * rust/compile/generics3.rs: likewise. * rust/compile/implicit_returns_err1.rs: likewise. * rust/compile/implicit_returns_err2.rs: likewise. * rust/compile/implicit_returns_err3.rs: likewise. * rust/compile/implicit_returns_err4.rs: likewise. * rust/compile/issue-1152.rs: likewise. * rust/compile/issue-2477.rs: likewise. * rust/compile/reference1.rs: likewise. * rust/compile/stmt_with_block_err1.rs: likewise. * rust/compile/traits1.rs: likewise. * rust/compile/traits2.rs: likewise. * rust/compile/tuple_mismatch.rs: likewise. * rust/compile/tuple_struct3.rs: likewise. * rust/compile/mismatched-types.rs: New test from rustc. Signed-off-by: Muhammad Mahad --- diff --git a/gcc/rust/typecheck/rust-unify.cc b/gcc/rust/typecheck/rust-unify.cc index 43cb57b85abe..3027f0997390 100644 --- a/gcc/rust/typecheck/rust-unify.cc +++ b/gcc/rust/typecheck/rust-unify.cc @@ -122,7 +122,8 @@ UnifyRules::emit_type_mismatch () const rich_location r (line_table, locus); r.add_range (lhs.get_locus ()); r.add_range (rhs.get_locus ()); - rust_error_at (r, "expected %<%s%> got %<%s%>", + rust_error_at (r, ErrorCode::E0308, + "mismatched types, expected %qs but got %qs", expected->get_name ().c_str (), expr->get_name ().c_str ()); } diff --git a/gcc/testsuite/rust/compile/arrays1.rs b/gcc/testsuite/rust/compile/arrays1.rs index 714a6be7afb5..2db56676b014 100644 --- a/gcc/testsuite/rust/compile/arrays1.rs +++ b/gcc/testsuite/rust/compile/arrays1.rs @@ -1,4 +1,4 @@ fn main() { let xs: [i32; 5] = [1, 2, 3, 4, 5]; - let a: bool = xs[0]; // { dg-error "expected .bool. got .i32." } + let a: bool = xs[0]; // { dg-error "mismatched types, expected .bool. but got .i32." } } diff --git a/gcc/testsuite/rust/compile/bad_type1.rs b/gcc/testsuite/rust/compile/bad_type1.rs index 93de439704fd..88ab13b1e994 100644 --- a/gcc/testsuite/rust/compile/bad_type1.rs +++ b/gcc/testsuite/rust/compile/bad_type1.rs @@ -1,3 +1,3 @@ fn main() { - let logical: bool = 123; // { dg-error "expected .bool. got .." } + let logical: bool = 123; // { dg-error "mismatched types, expected .bool. but got .." } } diff --git a/gcc/testsuite/rust/compile/bad_type2.rs b/gcc/testsuite/rust/compile/bad_type2.rs index e47b8aac0e7c..0fe320632dc7 100644 --- a/gcc/testsuite/rust/compile/bad_type2.rs +++ b/gcc/testsuite/rust/compile/bad_type2.rs @@ -8,7 +8,7 @@ fn main() { let mut x; x = 1; - x = true; // { dg-error "expected .. got .bool." } + x = true; // { dg-error "mismatched types, expected .. but got .bool." } let call_test = test(1); } diff --git a/gcc/testsuite/rust/compile/const_generics_6.rs b/gcc/testsuite/rust/compile/const_generics_6.rs index de261236d933..b810b9560d39 100644 --- a/gcc/testsuite/rust/compile/const_generics_6.rs +++ b/gcc/testsuite/rust/compile/const_generics_6.rs @@ -1,2 +1,2 @@ struct Foo; -struct Bar; // { dg-error "expected .usize. got .i32." } +struct Bar; // { dg-error "mismatched types, expected .usize. but got .i32." } diff --git a/gcc/testsuite/rust/compile/deadcode_err1.rs b/gcc/testsuite/rust/compile/deadcode_err1.rs index 1dbe95731e1d..e77cef6852e8 100644 --- a/gcc/testsuite/rust/compile/deadcode_err1.rs +++ b/gcc/testsuite/rust/compile/deadcode_err1.rs @@ -3,7 +3,7 @@ fn foo() -> i32 { let mut a = 1; // { dg-warning "unreachable statement" } a = 1.1; // { dg-warning "unreachable statement" } - // { dg-error "expected .. got .." "" { target *-*-* } .-1 } + // { dg-error "mismatched types, expected .. but got .." "" { target *-*-* } .-1 } } fn main() { diff --git a/gcc/testsuite/rust/compile/deadcode_err2.rs b/gcc/testsuite/rust/compile/deadcode_err2.rs index 8c0eb4617a76..832fe9984660 100644 --- a/gcc/testsuite/rust/compile/deadcode_err2.rs +++ b/gcc/testsuite/rust/compile/deadcode_err2.rs @@ -1,11 +1,11 @@ fn foo() -> i32 { return 1; - return 1.5; // { dg-error "expected .i32. got .." } + return 1.5; // { dg-error "mismatched types, expected .i32. but got .." } // { dg-warning "unreachable statement" "" { target *-*-* } .-1 } } fn bar() -> i32 { - return 1.5; // { dg-error "expected .i32. got .." } + return 1.5; // { dg-error "mismatched types, expected .i32. but got .." } return 1; // { dg-warning "unreachable statement" "" { target *-*-* } .-1 } } diff --git a/gcc/testsuite/rust/compile/func1.rs b/gcc/testsuite/rust/compile/func1.rs index 6758a3898e30..037d377fff7b 100644 --- a/gcc/testsuite/rust/compile/func1.rs +++ b/gcc/testsuite/rust/compile/func1.rs @@ -1,5 +1,5 @@ fn test(x: i32) -> bool { - return x + 1; // { dg-error "expected .bool. got .i32." } + return x + 1; // { dg-error "mismatched types, expected .bool. but got .i32." } } fn main() { diff --git a/gcc/testsuite/rust/compile/func3.rs b/gcc/testsuite/rust/compile/func3.rs index 002e5c90ab5c..338971aa8bd4 100644 --- a/gcc/testsuite/rust/compile/func3.rs +++ b/gcc/testsuite/rust/compile/func3.rs @@ -4,5 +4,5 @@ fn test(a: i32, b: i32) -> i32 { fn main() { let a = test(1, true); - // { dg-error "expected .i32. got .bool." "" { target *-*-* } .-1 } + // { dg-error "mismatched types, expected .i32. but got .bool." "" { target *-*-* } .-1 } } diff --git a/gcc/testsuite/rust/compile/func4.rs b/gcc/testsuite/rust/compile/func4.rs index 3b2d2b0d773a..1b54878c6df3 100644 --- a/gcc/testsuite/rust/compile/func4.rs +++ b/gcc/testsuite/rust/compile/func4.rs @@ -1,4 +1,4 @@ -fn func() -> i32 { // { dg-error "expected .i32. got ...." } +fn func() -> i32 { // { dg-error "mismatched types, expected .i32. but got ...." } } fn main() { diff --git a/gcc/testsuite/rust/compile/func5.rs b/gcc/testsuite/rust/compile/func5.rs index 05624f524e94..6f418a221926 100644 --- a/gcc/testsuite/rust/compile/func5.rs +++ b/gcc/testsuite/rust/compile/func5.rs @@ -1,5 +1,5 @@ fn func() -> i32 { - return; // { dg-error "expected .i32. got ...." } + return; // { dg-error "mismatched types, expected .i32. but got ...." } } fn main() { diff --git a/gcc/testsuite/rust/compile/generics1.rs b/gcc/testsuite/rust/compile/generics1.rs index e9bdb3a28457..9e440af9e3c9 100644 --- a/gcc/testsuite/rust/compile/generics1.rs +++ b/gcc/testsuite/rust/compile/generics1.rs @@ -1,4 +1,4 @@ -// { dg-error "expected .i32. got .i8." "" { target *-*-* } 0 } +// { dg-error "mismatched types, expected .i32. but got .i8." "" { target *-*-* } 0 } #[lang = "sized"] pub trait Sized {} diff --git a/gcc/testsuite/rust/compile/generics2.rs b/gcc/testsuite/rust/compile/generics2.rs index fc203abc4510..4c95fd1a23c4 100644 --- a/gcc/testsuite/rust/compile/generics2.rs +++ b/gcc/testsuite/rust/compile/generics2.rs @@ -1,4 +1,4 @@ -// { dg-error "expected .i32. got .i8." "" { target *-*-* } 0 } +// { dg-error "mismatched types, expected .i32. but got .i8." "" { target *-*-* } 0 } #[lang = "sized"] pub trait Sized {} diff --git a/gcc/testsuite/rust/compile/generics3.rs b/gcc/testsuite/rust/compile/generics3.rs index e28953c14f8c..514d713a954b 100644 --- a/gcc/testsuite/rust/compile/generics3.rs +++ b/gcc/testsuite/rust/compile/generics3.rs @@ -1,4 +1,4 @@ -// { dg-error "expected .i32. got .i8." "" { target *-*-* } 0 } +// { dg-error "mismatched types, expected .i32. but got .i8." "" { target *-*-* } 0 } #[lang = "sized"] pub trait Sized {} diff --git a/gcc/testsuite/rust/compile/implicit_returns_err1.rs b/gcc/testsuite/rust/compile/implicit_returns_err1.rs index 973ba80fb866..1e8985410486 100644 --- a/gcc/testsuite/rust/compile/implicit_returns_err1.rs +++ b/gcc/testsuite/rust/compile/implicit_returns_err1.rs @@ -1,5 +1,5 @@ fn test(x: i32) -> i32 { - if x > 1 { // { dg-error "expected .... got .." } + if x > 1 { // { dg-error "mismatched types, expected .... but got .." } 1 } else { 2 diff --git a/gcc/testsuite/rust/compile/implicit_returns_err2.rs b/gcc/testsuite/rust/compile/implicit_returns_err2.rs index fb90748871f5..8d9e6e333409 100644 --- a/gcc/testsuite/rust/compile/implicit_returns_err2.rs +++ b/gcc/testsuite/rust/compile/implicit_returns_err2.rs @@ -1,5 +1,5 @@ fn test(x: i32) -> i32 { - // { dg-error "expected .i32. got .bool." "" { target *-*-* } .-1 } + // { dg-error "mismatched types, expected .i32. but got .bool." "" { target *-*-* } .-1 } return 1; // { dg-warning "unreachable expression" "" { target *-*-* } .+1 } true diff --git a/gcc/testsuite/rust/compile/implicit_returns_err3.rs b/gcc/testsuite/rust/compile/implicit_returns_err3.rs index 37b1c62414c5..ac9821377989 100644 --- a/gcc/testsuite/rust/compile/implicit_returns_err3.rs +++ b/gcc/testsuite/rust/compile/implicit_returns_err3.rs @@ -1,4 +1,4 @@ -fn test(x: i32) -> i32 { // { dg-error "expected .i32. got ...." } +fn test(x: i32) -> i32 { // { dg-error "mismatched types, expected .i32. but got ...." } if x > 1 { 1 } diff --git a/gcc/testsuite/rust/compile/implicit_returns_err4.rs b/gcc/testsuite/rust/compile/implicit_returns_err4.rs index 59c6a020d4c9..16a2f4c99ffb 100644 --- a/gcc/testsuite/rust/compile/implicit_returns_err4.rs +++ b/gcc/testsuite/rust/compile/implicit_returns_err4.rs @@ -1,5 +1,5 @@ fn test(x: bool) -> bool { - // { dg-error "expected .bool. got ...." "" { target *-*-*} .-1 } + // { dg-error "mismatched types, expected .bool. but got ...." "" { target *-*-*} .-1 } return x; // { dg-warning "unreachable expression" "" { target *-*-* } .+1 } () diff --git a/gcc/testsuite/rust/compile/issue-1152.rs b/gcc/testsuite/rust/compile/issue-1152.rs index 15697057ec62..32908c3513b6 100644 --- a/gcc/testsuite/rust/compile/issue-1152.rs +++ b/gcc/testsuite/rust/compile/issue-1152.rs @@ -1,6 +1,6 @@ fn test() { let f = [0; -4_isize]; - // { dg-error "expected .usize. got .isize." "" { target *-*-* } .-1 } + // { dg-error "mismatched types, expected .usize. but got .isize." "" { target *-*-* } .-1 } let f = [0_usize; -1_isize]; - // { dg-error "expected .usize. got .isize." "" { target *-*-* } .-1 } + // { dg-error "mismatched types, expected .usize. but got .isize." "" { target *-*-* } .-1 } } diff --git a/gcc/testsuite/rust/compile/issue-2477.rs b/gcc/testsuite/rust/compile/issue-2477.rs index 26831a6625d0..ca13ac57da07 100644 --- a/gcc/testsuite/rust/compile/issue-2477.rs +++ b/gcc/testsuite/rust/compile/issue-2477.rs @@ -1,3 +1,3 @@ const FOO: u32 = return 0; // { dg-error "return statement outside of function body" "" { target *-*-* } .-1 } -// { dg-error "expected .u32. got" "" { target *-*-* } .-2 } +// { dg-error "mismatched types, expected .u32. but got" "" { target *-*-* } .-2 } diff --git a/gcc/testsuite/rust/compile/mismatched-types.rs b/gcc/testsuite/rust/compile/mismatched-types.rs new file mode 100644 index 000000000000..08c751235f42 --- /dev/null +++ b/gcc/testsuite/rust/compile/mismatched-types.rs @@ -0,0 +1,9 @@ +// ErrorCode::E0308 +#![allow(unused)] +fn main() { + fn plus_one(x: i32) -> i32 { + x + 1 + } + plus_one("Not a number"); // { dg-error "mismatched types, expected .i32. but got .& str." } + let x: f32 = "Not a float"; // { dg-error "mismatched types, expected .f32. but got .& str." } +} diff --git a/gcc/testsuite/rust/compile/reference1.rs b/gcc/testsuite/rust/compile/reference1.rs index ff791533754b..2f94754bcb02 100644 --- a/gcc/testsuite/rust/compile/reference1.rs +++ b/gcc/testsuite/rust/compile/reference1.rs @@ -2,5 +2,5 @@ fn main() { let a = &123; let b: &mut i32 = a; // { dg-error "mismatched mutability" "" { target *-*-* } .-1 } - // { dg-error "expected .&mut i32. got .& i32." "" { target *-*-* } .-2 } + // { dg-error "mismatched types, expected .&mut i32. but got .& i32." "" { target *-*-* } .-2 } } diff --git a/gcc/testsuite/rust/compile/stmt_with_block_err1.rs b/gcc/testsuite/rust/compile/stmt_with_block_err1.rs index 8780d0feeac6..ec75cae312f1 100644 --- a/gcc/testsuite/rust/compile/stmt_with_block_err1.rs +++ b/gcc/testsuite/rust/compile/stmt_with_block_err1.rs @@ -1,11 +1,11 @@ fn test(x: i32) -> i32 { - if x > 1 { // { dg-error "expected .... got .." } + if x > 1 { // { dg-error "mismatched types, expected .... but got .." } 1 } else { 2 } - { // { dg-error "expected .... got .." } + { // { dg-error "mismatched types, expected .... but got .." } 3 } diff --git a/gcc/testsuite/rust/compile/traits1.rs b/gcc/testsuite/rust/compile/traits1.rs index 68f5abb5aa01..779662c3f418 100644 --- a/gcc/testsuite/rust/compile/traits1.rs +++ b/gcc/testsuite/rust/compile/traits1.rs @@ -3,7 +3,7 @@ pub trait Sized {} trait Foo { fn Bar() -> i32 {} - // { dg-error "expected .i32. got .()." "" { target *-*-* } .-1 } + // { dg-error "mismatched types, expected .i32. but got .()." "" { target *-*-* } .-1 } } struct Baz; diff --git a/gcc/testsuite/rust/compile/traits2.rs b/gcc/testsuite/rust/compile/traits2.rs index 3631a092e562..a76f4c02ffc8 100644 --- a/gcc/testsuite/rust/compile/traits2.rs +++ b/gcc/testsuite/rust/compile/traits2.rs @@ -3,14 +3,14 @@ pub trait Sized {} trait Foo { fn Bar() -> i32 {} - // { dg-error "expected .i32. got .()." "" { target *-*-* } .-1 } + // { dg-error "mismatched types, expected .i32. but got .()." "" { target *-*-* } .-1 } } struct Baz; impl Foo for Baz { fn Bar() {} - // { dg-error "expected" "" { target *-*-* } .-1 } + // { dg-error "mismatched types, expected" "" { target *-*-* } .-1 } // { dg-error "method .Bar. has an incompatible type for trait .Foo." "" { target *-*-* } .-2 } } diff --git a/gcc/testsuite/rust/compile/tuple_mismatch.rs b/gcc/testsuite/rust/compile/tuple_mismatch.rs index fbeb4b27fd48..828586b0f09d 100644 --- a/gcc/testsuite/rust/compile/tuple_mismatch.rs +++ b/gcc/testsuite/rust/compile/tuple_mismatch.rs @@ -7,7 +7,7 @@ fn main() { // The lhs and rhs sizes don't match, but we still resolve 'a' to be bool, we don't // error out immediately once we notice the size mismatch. -fn foo() -> i32 { // { dg-error "expected .i32. got .bool." } +fn foo() -> i32 { // { dg-error "mismatched types, expected .i32. but got .bool." } let (a, _) = (true, 2, 3); // { dg-error "expected a tuple with 3 elements, found one with 2 elements" } a } diff --git a/gcc/testsuite/rust/compile/tuple_struct3.rs b/gcc/testsuite/rust/compile/tuple_struct3.rs index 4af66b8370e2..e2fb02fe8839 100644 --- a/gcc/testsuite/rust/compile/tuple_struct3.rs +++ b/gcc/testsuite/rust/compile/tuple_struct3.rs @@ -2,5 +2,5 @@ struct Foo(i32, i32, bool); fn main() { let c = Foo(1, 2f32, true); - // { dg-error "expected .i32. got .f32." "" { target *-*-* } .-1 } + // { dg-error "mismatched types, expected .i32. but got .f32." "" { target *-*-* } .-1 } }