aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMuhammad Mahad <mahadtxt@gmail.com>2023-08-05 17:28:45 +0500
committerPhilip Herron <philip.herron@embecosm.com>2023-08-10 09:37:44 +0000
commite55113ea2bf0cec2f8436a576ce6f2bcaacd1c27 (patch)
tree2c1bd92a8c1f14bda549938234b12e9438aefb81 /gcc
parent152eb852643c4cfdf753a19f70ccc49d1b602502 (diff)
downloadgcc-e55113ea2bf0cec2f8436a576ce6f2bcaacd1c27.zip
gcc-e55113ea2bf0cec2f8436a576ce6f2bcaacd1c27.tar.gz
gcc-e55113ea2bf0cec2f8436a576ce6f2bcaacd1c27.tar.bz2
gccrs: [E0054/E0604/E0620/E0606] TypeCasting ErrorCodes
Added errorcodes according to different conditions and updated error message according to type casting type. gcc/rust/ChangeLog: * typecheck/rust-casts.cc (TypeCastRules::emit_cast_error): Refactored ErrorCodes & error messages. gcc/testsuite/ChangeLog: * rust/compile/bad_as_bool_char.rs: Updated comment to pass test case. * rust/compile/cast1.rs: likewise. * rust/compile/cast4.rs: likewise. * rust/compile/cast5.rs: likewise. * rust/compile/all-cast.rs: New test for all error codes. Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-casts.cc26
-rw-r--r--gcc/testsuite/rust/compile/all-cast.rs11
-rw-r--r--gcc/testsuite/rust/compile/bad_as_bool_char.rs14
-rw-r--r--gcc/testsuite/rust/compile/cast1.rs2
-rw-r--r--gcc/testsuite/rust/compile/cast4.rs2
-rw-r--r--gcc/testsuite/rust/compile/cast5.rs6
6 files changed, 47 insertions, 14 deletions
diff --git a/gcc/rust/typecheck/rust-casts.cc b/gcc/rust/typecheck/rust-casts.cc
index 75b2872..7439deb 100644
--- a/gcc/rust/typecheck/rust-casts.cc
+++ b/gcc/rust/typecheck/rust-casts.cc
@@ -300,11 +300,33 @@ TypeCastRules::check_ptr_ptr_cast ()
void
TypeCastRules::emit_cast_error () const
{
- // error[E0604]
rich_location r (line_table, locus);
r.add_range (from.get_locus ());
r.add_range (to.get_locus ());
- rust_error_at (r, ErrorCode::E0054, "invalid cast %<%s%> to %<%s%>",
+ ErrorCode error_code;
+ std::string error_msg;
+ switch (to.get_ty ()->get_kind ())
+ {
+ case TyTy::TypeKind::BOOL:
+ error_msg = "cannot cast %qs as %qs";
+ error_code = ErrorCode::E0054;
+ break;
+ case TyTy::TypeKind::CHAR:
+ error_msg
+ += "cannot cast %qs as %qs, only %<u8%> can be cast as %<char%>";
+ error_code = ErrorCode::E0604;
+ break;
+ case TyTy::TypeKind::SLICE:
+ error_msg = "cast to unsized type: %qs as %qs";
+ error_code = ErrorCode::E0620;
+ break;
+
+ default:
+ error_msg = "casting %qs as %qs is invalid";
+ error_code = ErrorCode::E0606;
+ break;
+ }
+ rust_error_at (r, error_code, error_msg.c_str (),
from.get_ty ()->get_name ().c_str (),
to.get_ty ()->get_name ().c_str ());
}
diff --git a/gcc/testsuite/rust/compile/all-cast.rs b/gcc/testsuite/rust/compile/all-cast.rs
new file mode 100644
index 0000000..fa24373
--- /dev/null
+++ b/gcc/testsuite/rust/compile/all-cast.rs
@@ -0,0 +1,11 @@
+fn main() {
+ let x = 5;
+ let x_is_nonzero = x as bool; // { dg-error "cannot cast .<integer>. as .bool." }
+
+ 0u32 as char; // { dg-error "cannot cast .u32. as .char., only .u8. can be cast as .char." }
+
+ let x = &[1_usize, 2] as [usize]; // { dg-error "cast to unsized type: .& .usize:CAPACITY.. as ..usize.." }
+
+ let a = &0u8; // Here, `x` is a `&u8`.
+ let y: u32 = a as u32; // { dg-error "casting .& u8. as .u32. is invalid" }
+}
diff --git a/gcc/testsuite/rust/compile/bad_as_bool_char.rs b/gcc/testsuite/rust/compile/bad_as_bool_char.rs
index 9652915..1828d22 100644
--- a/gcc/testsuite/rust/compile/bad_as_bool_char.rs
+++ b/gcc/testsuite/rust/compile/bad_as_bool_char.rs
@@ -2,17 +2,17 @@ pub fn main ()
{
let t = true;
let f = false;
- let fone = t as f32; // { dg-error "invalid cast" }
- let fzero = f as f64; // { dg-error "invalid cast" }
+ let fone = t as f32; // { dg-error "casting .bool. as .f32. is invalid" }
+ let fzero = f as f64; // { dg-error "casting .bool. as .f64. is invalid" }
- let nb = 0u8 as bool; // { dg-error "invalid cast .u8. to .bool. \\\[E0054\\\]" }
- let nc = true as char; // { dg-error "invalid cast" }
+ let nb = 0u8 as bool; // { dg-error "cannot cast .u8. as .bool." }
+ let nc = true as char; // { dg-error "cannot cast .bool. as .char., only .u8. can be cast as .char." }
let a = 'a';
let b = 'b';
- let fa = a as f32; // { dg-error "invalid cast" }
- let bb = b as bool; // { dg-error "invalid cast .char. to .bool. \\\[E0054\\\]" }
+ let fa = a as f32; // { dg-error "casting .char. as .f32. is invalid" }
+ let bb = b as bool; // { dg-error "cannot cast .char. as .bool." }
let t32: u32 = 33;
- let ab = t32 as char; // { dg-error "invalid cast" }
+ let ab = t32 as char; // { dg-error "cannot cast .u32. as .char., only .u8. can be cast as .char." }
}
diff --git a/gcc/testsuite/rust/compile/cast1.rs b/gcc/testsuite/rust/compile/cast1.rs
index 74c4b1e..0472d58 100644
--- a/gcc/testsuite/rust/compile/cast1.rs
+++ b/gcc/testsuite/rust/compile/cast1.rs
@@ -1,5 +1,5 @@
fn main() {
let a: i32 = 123;
let b = a as char;
- // { dg-error "invalid cast .i32. to .char." "" { target *-*-* } .-1 }
+ // { dg-error "cannot cast .i32. as .char., only .u8. can be cast as .char." "" { target *-*-* } .-1 }
}
diff --git a/gcc/testsuite/rust/compile/cast4.rs b/gcc/testsuite/rust/compile/cast4.rs
index ab00010..22ac0c5 100644
--- a/gcc/testsuite/rust/compile/cast4.rs
+++ b/gcc/testsuite/rust/compile/cast4.rs
@@ -1,5 +1,5 @@
fn main() {
let a: i32 = 123;
let u = a as bool;
- // { dg-error "invalid cast .i32. to .bool." "" { target *-*-* } .-1 }
+ // { dg-error "cannot cast .i32. as .bool." "" { target *-*-* } .-1 }
}
diff --git a/gcc/testsuite/rust/compile/cast5.rs b/gcc/testsuite/rust/compile/cast5.rs
index ecc10c1..2e340dd 100644
--- a/gcc/testsuite/rust/compile/cast5.rs
+++ b/gcc/testsuite/rust/compile/cast5.rs
@@ -1,11 +1,11 @@
fn main() {
const A: char = 0x1F888 as char;
- // { dg-error "invalid cast .<integer>. to .char." "" { target *-*-* } .-1 }
+ // { dg-error "cannot cast .<integer>. as .char., only .u8. can be cast as .char." "" { target *-*-* } .-1 }
const B: char = 129160 as char;
- // { dg-error "invalid cast .<integer>. to .char." "" { target *-*-* } .-1 }
+ // { dg-error "cannot cast .<integer>. as .char., only .u8. can be cast as .char." "" { target *-*-* } .-1 }
const C: i32 = 42;
const D: char = C as char;
- // { dg-error "invalid cast .i32. to .char." "" { target *-*-* } .-1 }
+ // { dg-error "cannot cast .i32. as .char., only .u8. can be cast as .char." "" { target *-*-* } .-1 }
const E: char = '\u{01F888}';
const F: u8 = 42;
const G: char= F as char;