aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust
diff options
context:
space:
mode:
authorMuhammad Mahad <mahadtxt@gmail.com>2023-09-17 16:58:51 +0500
committerArthur Cohen <arthur.cohen@embecosm.com>2024-01-16 19:04:37 +0100
commit718b65a93d194a97a88f96780b97023ce9ed9378 (patch)
treec32bda7796d429dffc97998569cbc77c18cd039e /gcc/rust
parent95703bb75efc3ca0300b78ab9d3f4d544faad4b6 (diff)
downloadgcc-718b65a93d194a97a88f96780b97023ce9ed9378.zip
gcc-718b65a93d194a97a88f96780b97023ce9ed9378.tar.gz
gcc-718b65a93d194a97a88f96780b97023ce9ed9378.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>
Diffstat (limited to 'gcc/rust')
-rw-r--r--gcc/rust/typecheck/rust-tyty-call.cc35
1 files changed, 25 insertions, 10 deletions
diff --git a/gcc/rust/typecheck/rust-tyty-call.cc b/gcc/rust/typecheck/rust-tyty-call.cc
index 667d54c..31afe04 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;