Feature gate async fn methods
This commit is contained in:
parent
4bbd29f206
commit
47a558ed7c
@ -2035,28 +2035,22 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
||||
fn_decl: &'a ast::FnDecl,
|
||||
span: Span,
|
||||
_node_id: NodeId) {
|
||||
match fn_kind {
|
||||
FnKind::ItemFn(_, header, _, _) => {
|
||||
// Check for const fn and async fn declarations.
|
||||
if header.asyncness.node.is_async() {
|
||||
gate_feature_post!(&self, async_await, span, "async fn is unstable");
|
||||
}
|
||||
|
||||
if fn_decl.c_variadic {
|
||||
gate_feature_post!(&self, c_variadic, span,
|
||||
"C-varaidic functions are unstable");
|
||||
}
|
||||
// Stability of const fn methods are covered in
|
||||
// `visit_trait_item` and `visit_impl_item` below; this is
|
||||
// because default methods don't pass through this point.
|
||||
|
||||
self.check_abi(header.abi, span);
|
||||
if let Some(header) = fn_kind.header() {
|
||||
// Check for const fn and async fn declarations.
|
||||
if header.asyncness.node.is_async() {
|
||||
gate_feature_post!(&self, async_await, span, "async fn is unstable");
|
||||
}
|
||||
FnKind::Method(_, sig, _, _) => {
|
||||
self.check_abi(sig.header.abi, span);
|
||||
}
|
||||
_ => {}
|
||||
|
||||
// Stability of const fn methods are covered in
|
||||
// `visit_trait_item` and `visit_impl_item` below; this is
|
||||
// because default methods don't pass through this point.
|
||||
self.check_abi(header.abi, span);
|
||||
}
|
||||
|
||||
if fn_decl.c_variadic {
|
||||
gate_feature_post!(&self, c_variadic, span, "C-varaidic functions are unstable");
|
||||
}
|
||||
|
||||
visit::walk_fn(self, fn_kind, fn_decl, span);
|
||||
}
|
||||
|
||||
|
@ -31,6 +31,16 @@ pub enum FnKind<'a> {
|
||||
Closure(&'a Expr),
|
||||
}
|
||||
|
||||
impl<'a> FnKind<'a> {
|
||||
pub fn header(&self) -> Option<&'a FnHeader> {
|
||||
match *self {
|
||||
FnKind::ItemFn(_, header, _, _) => Some(header),
|
||||
FnKind::Method(_, sig, _, _) => Some(&sig.header),
|
||||
FnKind::Closure(_) => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Each method of the Visitor trait is a hook to be potentially
|
||||
/// overridden. Each method's default implementation recursively visits
|
||||
/// the substructure of the input via the corresponding `walk` method;
|
||||
|
Loading…
Reference in New Issue
Block a user