Skip to content

Commit 47a558e

Browse files
committed
Feature gate async fn methods
1 parent 4bbd29f commit 47a558e

File tree

2 files changed

+23
-19
lines changed

2 files changed

+23
-19
lines changed

src/libsyntax/feature_gate.rs

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2035,28 +2035,22 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
20352035
fn_decl: &'a ast::FnDecl,
20362036
span: Span,
20372037
_node_id: NodeId) {
2038-
match fn_kind {
2039-
FnKind::ItemFn(_, header, _, _) => {
2040-
// Check for const fn and async fn declarations.
2041-
if header.asyncness.node.is_async() {
2042-
gate_feature_post!(&self, async_await, span, "async fn is unstable");
2043-
}
2038+
if let Some(header) = fn_kind.header() {
2039+
// Check for const fn and async fn declarations.
2040+
if header.asyncness.node.is_async() {
2041+
gate_feature_post!(&self, async_await, span, "async fn is unstable");
2042+
}
20442043

2045-
if fn_decl.c_variadic {
2046-
gate_feature_post!(&self, c_variadic, span,
2047-
"C-varaidic functions are unstable");
2048-
}
2049-
// Stability of const fn methods are covered in
2050-
// `visit_trait_item` and `visit_impl_item` below; this is
2051-
// because default methods don't pass through this point.
2044+
// Stability of const fn methods are covered in
2045+
// `visit_trait_item` and `visit_impl_item` below; this is
2046+
// because default methods don't pass through this point.
2047+
self.check_abi(header.abi, span);
2048+
}
20522049

2053-
self.check_abi(header.abi, span);
2054-
}
2055-
FnKind::Method(_, sig, _, _) => {
2056-
self.check_abi(sig.header.abi, span);
2057-
}
2058-
_ => {}
2050+
if fn_decl.c_variadic {
2051+
gate_feature_post!(&self, c_variadic, span, "C-varaidic functions are unstable");
20592052
}
2053+
20602054
visit::walk_fn(self, fn_kind, fn_decl, span);
20612055
}
20622056

src/libsyntax/visit.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,16 @@ pub enum FnKind<'a> {
3131
Closure(&'a Expr),
3232
}
3333

34+
impl<'a> FnKind<'a> {
35+
pub fn header(&self) -> Option<&'a FnHeader> {
36+
match *self {
37+
FnKind::ItemFn(_, header, _, _) => Some(header),
38+
FnKind::Method(_, sig, _, _) => Some(&sig.header),
39+
FnKind::Closure(_) => None,
40+
}
41+
}
42+
}
43+
3444
/// Each method of the Visitor trait is a hook to be potentially
3545
/// overridden. Each method's default implementation recursively visits
3646
/// the substructure of the input via the corresponding `walk` method;

0 commit comments

Comments
 (0)