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 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");
+ }
- 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.
+ // 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);
+ }
- self.check_abi(header.abi, span);
- }
- FnKind::Method(_, sig, _, _) => {
- self.check_abi(sig.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);
}
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;