aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-10-18 14:31:53 +0200
committerPhilip Herron <philip.herron@embecosm.com>2023-11-09 15:39:45 +0000
commitafb8e75e08526cdde7a513a56050046dc0ba0368 (patch)
treeef8afad4c7b0d6292ac1fced8f61a208045ab62d /gcc
parent203f1927078b5c331cb34a3cf228c9af8d8903db (diff)
downloadgcc-afb8e75e08526cdde7a513a56050046dc0ba0368.zip
gcc-afb8e75e08526cdde7a513a56050046dc0ba0368.tar.gz
gcc-afb8e75e08526cdde7a513a56050046dc0ba0368.tar.bz2
Parse variadic functions
Variadic functions were not parsed because it is an unstable feature. While it is still unstable, it is required in order to parse libcore. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_function_param): Parse variadic functions. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/parse/rust-parse-impl.h30
1 files changed, 23 insertions, 7 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index d509cdf..5fce140 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -3584,6 +3584,13 @@ Parser<ManagedTokenSource>::parse_function_param ()
// TODO: should saved location be at start of outer attributes or pattern?
location_t locus = lexer.peek_token ()->get_locus ();
+
+ if (lexer.peek_token ()->get_id () == ELLIPSIS) // Unnamed variadic
+ {
+ lexer.skip_token (); // Skip ellipsis
+ return AST::FunctionParam (std::move (outer_attrs), locus);
+ }
+
std::unique_ptr<AST::Pattern> param_pattern = parse_pattern ();
// create error function param if it doesn't exist
@@ -3599,15 +3606,24 @@ Parser<ManagedTokenSource>::parse_function_param ()
return AST::FunctionParam::create_error ();
}
- std::unique_ptr<AST::Type> param_type = parse_type ();
- if (param_type == nullptr)
+ if (lexer.peek_token ()->get_id () == ELLIPSIS) // Named variadic
{
- // skip?
- return AST::FunctionParam::create_error ();
+ lexer.skip_token (); // Skip ellipsis
+ return AST::FunctionParam (std::move (param_pattern),
+ std::move (outer_attrs), locus);
+ }
+ else
+ {
+ std::unique_ptr<AST::Type> param_type = parse_type ();
+ if (param_type == nullptr)
+ {
+ // skip?
+ return AST::FunctionParam::create_error ();
+ }
+ return AST::FunctionParam (std::move (param_pattern),
+ std::move (param_type),
+ std::move (outer_attrs), locus);
}
-
- return AST::FunctionParam (std::move (param_pattern), std::move (param_type),
- std::move (outer_attrs), locus);
}
/* Parses a function or method return type syntactical construction. Also