ASTValidation::visit (AST::Function &function)
{
const auto &qualifiers = function.get_qualifiers ();
+ if (qualifiers.is_default () && ctx.peek () != Kind::INHERENT_IMPL
+ && ctx.peek () != Kind::TRAIT_IMPL)
+ rust_error_at (
+ function.get_locus (),
+ "%<default%> is only allowed on items within %<impl%> blocks");
if (qualifiers.is_async () && qualifiers.is_const ())
rust_error_at (function.get_locus (),
"functions cannot be both %<const%> and %<async%>");
else if (t->get_str () == Values::WeakKeywords::DEFAULT
&& lexer.peek_token (1)->get_id () != EXCLAM)
{
- add_error (Error (t->get_locus (),
- "%qs is only allowed on items within %qs blocks",
- "default", "impl"));
- return Parse::Error::Item::make_malformed ();
+ // parse normal functions with `default` qualifier
+ // they will be rejected in ASTValidation pass
+ return parse_vis_item (std::move (outer_attrs));
}
else if (is_macro_rules_def (t))
{
return parse_union (std::move (vis), std::move (outer_attrs));
// or should item switch go straight to parsing union?
}
- else
+ else if (t->get_str () == Values::WeakKeywords::DEFAULT)
{
- break;
+ // parse normal functions with `default` qualifier they will be
+ // rejected in ASTValidation pass
+ return parse_function (std::move (vis), std::move (outer_attrs));
}
+ break;
case CONST:
// lookahead to resolve syntactical production
t = lexer.peek_token (1);