aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-11-09 22:51:31 +0100
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2023-11-14 18:27:16 +0000
commit5cf0fc3d59b95655dc929adadea54e3215329b52 (patch)
tree2ba31b1abe330609a1d02f82c150cd7ecd59c1a3 /gcc
parent87a1800acaecc0df515548fb16596f1ad19cd94f (diff)
downloadgcc-5cf0fc3d59b95655dc929adadea54e3215329b52.zip
gcc-5cf0fc3d59b95655dc929adadea54e3215329b52.tar.gz
gcc-5cf0fc3d59b95655dc929adadea54e3215329b52.tar.bz2
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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/checks/errors/rust-ast-validation.cc19
-rw-r--r--gcc/rust/checks/errors/rust-ast-validation.h1
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 &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
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