]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add multiple check on variadics position
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Thu, 9 Nov 2023 21:51:31 +0000 (22:51 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:13:14 +0000 (19:13 +0100)
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>
gcc/rust/checks/errors/rust-ast-validation.cc
gcc/rust/checks/errors/rust-ast-validation.h

index 0ba73c674150bb3a9ab15c715da683ec40ee4195..a903297d19b80331f95342cb392429e201242f0a 100644 (file)
@@ -62,4 +62,23 @@ ASTValidation::visit (AST::ConstantItem &const_item)
   AST::ContextualASTVisitor::visit (const_item);
 }
 
+void
+ASTValidation::visit (AST::ExternalFunctionItem &item)
+{
+  auto &params = 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
index a21bcc44f68bb8b7bb0c71089ffe23a0e50a7a8f..6028b21ff00643dd54203fa8467bc09599c5eabc 100644 (file)
@@ -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