diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-11-09 22:51:31 +0100 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 19:13:14 +0100 |
commit | e92ae55feab91404581ff82e49c47abe67962ed8 (patch) | |
tree | c160356b367cb4b15cbc9e58f00cb93dd46c8638 | |
parent | c1d722aa6f011a1584b1815bfbfb8d2733c1ba34 (diff) | |
download | gcc-e92ae55feab91404581ff82e49c47abe67962ed8.zip gcc-e92ae55feab91404581ff82e49c47abe67962ed8.tar.gz gcc-e92ae55feab91404581ff82e49c47abe67962ed8.tar.bz2 |
gccrs: Add multiple check on variadics position
Variadics are forbidden alone as well as non final position, this should
be checked during ast validation.
gcc/rust/ChangeLog:
* checks/errors/rust-ast-validation.cc (ASTValidation::visit): Add
check for additional named argument as well as variadic argument's
position.
* checks/errors/rust-ast-validation.h: Add visit function prototype for
external functions.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
-rw-r--r-- | gcc/rust/checks/errors/rust-ast-validation.cc | 19 | ||||
-rw-r--r-- | gcc/rust/checks/errors/rust-ast-validation.h | 1 |
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/rust/checks/errors/rust-ast-validation.cc b/gcc/rust/checks/errors/rust-ast-validation.cc index 0ba73c6..a903297 100644 --- a/gcc/rust/checks/errors/rust-ast-validation.cc +++ b/gcc/rust/checks/errors/rust-ast-validation.cc @@ -62,4 +62,23 @@ ASTValidation::visit (AST::ConstantItem &const_item) AST::ContextualASTVisitor::visit (const_item); } +void +ASTValidation::visit (AST::ExternalFunctionItem &item) +{ + auto ¶ms = item.get_function_params (); + + if (params.size () == 1 && params[0].is_variadic ()) + rust_error_at ( + params[0].get_locus (), + "C-variadic function must be declared with at least one named argument"); + + for (auto it = params.begin (); it != params.end (); it++) + if (it->is_variadic () && it + 1 != params.end ()) + rust_error_at ( + it->get_locus (), + "%<...%> must be the last argument of a C-variadic function"); + + AST::ContextualASTVisitor::visit (item); +} + } // namespace Rust diff --git a/gcc/rust/checks/errors/rust-ast-validation.h b/gcc/rust/checks/errors/rust-ast-validation.h index a21bcc4..6028b21 100644 --- a/gcc/rust/checks/errors/rust-ast-validation.h +++ b/gcc/rust/checks/errors/rust-ast-validation.h @@ -36,6 +36,7 @@ public: virtual void visit (AST::ConstantItem &const_item); virtual void visit (AST::Lifetime &lifetime); virtual void visit (AST::LoopLabel &label); + virtual void visit (AST::ExternalFunctionItem &item); }; } // namespace Rust |