diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2023-02-10 10:19:24 -0500 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2023-04-06 10:47:22 +0200 |
commit | a9d72ef2d03064cc33393753e56f1137a653942d (patch) | |
tree | d0dcd492803e8a8973cc73e8e040ec5289a49fe5 | |
parent | fd5eb9f2b01e9e91720fea55d5c29b62b6ba498b (diff) | |
download | gcc-a9d72ef2d03064cc33393753e56f1137a653942d.zip gcc-a9d72ef2d03064cc33393753e56f1137a653942d.tar.gz gcc-a9d72ef2d03064cc33393753e56f1137a653942d.tar.bz2 |
gccrs: Add variadic argument type checking
gcc/rust/ChangeLog:
* typecheck/rust-tyty-call.cc
(TypeCheckCallExpr::visit): Add variadic argument type checking.
(TypeCheckCallExpr::visit): Fix comment spelling ("varadic").
gcc/testsuite/ChangeLog:
* rust/execute/torture/overflow1.rs: Fix test.
Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
-rw-r--r-- | gcc/rust/typecheck/rust-tyty-call.cc | 56 | ||||
-rw-r--r-- | gcc/testsuite/rust/execute/torture/overflow1.rs | 2 |
2 files changed, 56 insertions, 2 deletions
diff --git a/gcc/rust/typecheck/rust-tyty-call.cc b/gcc/rust/typecheck/rust-tyty-call.cc index 67e2866..f0846ae 100644 --- a/gcc/rust/typecheck/rust-tyty-call.cc +++ b/gcc/rust/typecheck/rust-tyty-call.cc @@ -122,7 +122,7 @@ TypeCheckCallExpr::visit (FnType &type) return; } - // it might be a varadic function + // it might be a variadic function if (i < type.num_params ()) { auto fnparam = type.param_at (i); @@ -143,6 +143,60 @@ TypeCheckCallExpr::visit (FnType &type) return; } } + else + { + switch (argument_expr_tyty->get_kind ()) + { + case TyTy::TypeKind::ERROR: + return; + case TyTy::TypeKind::INT: { + auto &int_ty + = static_cast<TyTy::IntType &> (*argument_expr_tyty); + if ((int_ty.get_int_kind () == TyTy::IntType::IntKind::I8) + || (int_ty.get_int_kind () == TyTy::IntType::IntKind::I16)) + { + rust_error_at (arg_locus, + "expected %<c_int%> variadic argument"); + return; + } + break; + } + case TyTy::TypeKind::UINT: { + auto &uint_ty + = static_cast<TyTy::UintType &> (*argument_expr_tyty); + if ((uint_ty.get_uint_kind () == TyTy::UintType::UintKind::U8) + || (uint_ty.get_uint_kind () + == TyTy::UintType::UintKind::U16)) + { + rust_error_at (arg_locus, + "expected %<c_uint%> variadic argument"); + return; + } + break; + } + case TyTy::TypeKind::FLOAT: { + if (static_cast<TyTy::FloatType &> (*argument_expr_tyty) + .get_float_kind () + == TyTy::FloatType::FloatKind::F32) + { + rust_error_at (arg_locus, + "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"); + return; + default: + break; + } + } i++; } diff --git a/gcc/testsuite/rust/execute/torture/overflow1.rs b/gcc/testsuite/rust/execute/torture/overflow1.rs index 57a0824..c4ccab1 100644 --- a/gcc/testsuite/rust/execute/torture/overflow1.rs +++ b/gcc/testsuite/rust/execute/torture/overflow1.rs @@ -16,5 +16,5 @@ fn main() { // { dg-final { scan-tree-dump ADD_OVERFLOW original } } let c = a + b; - unsafe { printf("%d\n\0" as *const str as *const i8, c) } + unsafe { printf("%d\n\0" as *const str as *const i8, c as i32) } } |