diff options
author | Muhammad Mahad <mahadtxt@gmail.com> | 2023-09-17 16:58:51 +0500 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-09-17 15:57:23 +0000 |
commit | a2d525016277f5f51c452e02c5fb2a0dcf02c643 (patch) | |
tree | ab38060732290b3bee70805233557f8d6fccf6a6 | |
parent | e6b2c1aea47dd2da3345d2b88d303441c2f55506 (diff) | |
download | gcc-a2d525016277f5f51c452e02c5fb2a0dcf02c643.zip gcc-a2d525016277f5f51c452e02c5fb2a0dcf02c643.tar.gz gcc-a2d525016277f5f51c452e02c5fb2a0dcf02c643.tar.bz2 |
gccrs: [E0617] attempt for invalid type variable in variadic function
There are some certain rust types must be cast before
passing them to a variadic function, because of arcane
ABI rules dictated by the C standard. To fix the error,
cast the value to the type specified by the error message.
gcc/rust/ChangeLog:
* typecheck/rust-tyty-call.cc (TypeCheckCallExpr::visit):
Added ErrorCode & more fixit hints.
gcc/testsuite/ChangeLog:
* rust/compile/variadic.rs: Added new checks.
Signed-off-by: Muhammad Mahad <mahadtxt@gmail.com>
-rw-r--r-- | gcc/rust/typecheck/rust-tyty-call.cc | 35 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/variadic.rs | 8 |
2 files changed, 32 insertions, 11 deletions
diff --git a/gcc/rust/typecheck/rust-tyty-call.cc b/gcc/rust/typecheck/rust-tyty-call.cc index f5c1447..6fce40c 100644 --- a/gcc/rust/typecheck/rust-tyty-call.cc +++ b/gcc/rust/typecheck/rust-tyty-call.cc @@ -184,7 +184,10 @@ TypeCheckCallExpr::visit (FnType &type) if ((int_ty.get_int_kind () == TyTy::IntType::IntKind::I8) || (int_ty.get_int_kind () == TyTy::IntType::IntKind::I16)) { - rust_error_at (arg_locus, + rich_location richloc (line_table, arg_locus); + richloc.add_fixit_replace ( + "cast the value to c_int: as c_int"); + rust_error_at (richloc, ErrorCode::E0617, "expected %<c_int%> variadic argument"); return; } @@ -197,7 +200,10 @@ TypeCheckCallExpr::visit (FnType &type) || (uint_ty.get_uint_kind () == TyTy::UintType::UintKind::U16)) { - rust_error_at (arg_locus, + rich_location richloc (line_table, arg_locus); + richloc.add_fixit_replace ( + "cast the value to c_uint: as c_uint"); + rust_error_at (richloc, ErrorCode::E0617, "expected %<c_uint%> variadic argument"); return; } @@ -208,19 +214,28 @@ TypeCheckCallExpr::visit (FnType &type) .get_float_kind () == TyTy::FloatType::FloatKind::F32) { - rust_error_at (arg_locus, + rich_location richloc (line_table, arg_locus); + richloc.add_fixit_replace ( + "cast the value to c_double: as c_double"); + rust_error_at (richloc, ErrorCode::E0617, "expected %<c_double%> variadic argument"); return; } break; } - case TyTy::TypeKind::BOOL: - rust_error_at (arg_locus, "expected %<c_int%> variadic argument"); - return; - case TyTy::TypeKind::FNDEF: - rust_error_at (arg_locus, - "unexpected function definition type as variadic " - "argument - cast to function pointer"); + case TyTy::TypeKind::BOOL: { + rich_location richloc (line_table, arg_locus); + richloc.add_fixit_replace ("cast the value to c_int: as c_int"); + rust_error_at (arg_locus, ErrorCode::E0617, + "expected %<c_int%> variadic argument"); + return; + } + case TyTy::TypeKind::FNDEF: { + rust_error_at ( + arg_locus, ErrorCode::E0617, + "unexpected function definition type as variadic " + "argument - cast to function pointer"); + } return; default: break; diff --git a/gcc/testsuite/rust/compile/variadic.rs b/gcc/testsuite/rust/compile/variadic.rs index 886341b..e970cd1 100644 --- a/gcc/testsuite/rust/compile/variadic.rs +++ b/gcc/testsuite/rust/compile/variadic.rs @@ -4,5 +4,11 @@ extern "C" { fn main() { // { dg-error "expected .c_int. variadic argument" "" { target *-*-* } .+1 } - printf("%d\n" as *const str as *const i8, 1i8); + printf("%d\n" as *const str as *const i8, 1i8); + + // { dg-error "expected .c_uint. variadic argument" "" { target *-*-* } .+1 } + printf("%d\n" as *const str as *const i8, 1u8); + + // { dg-error "expected .c_double. variadic argument" "" { target *-*-* } .+1 } + printf("%d\n" as *const str as *const i8, 1f32); } |