about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMara Bos <m-ou.se@m-ou.se>2022-10-19 13:33:45 +0200
committerMara Bos <m-ou.se@m-ou.se>2022-10-19 13:34:18 +0200
commitc4f829b2e5053cef753e010fa89bcc01b164a306 (patch)
treefd9bf8f2f71ec14eb2d391d12dc0dff8506a1546
parent5420fa388197ee61fc799ea22ea9bb820306dbb9 (diff)
downloadrust-c4f829b2e5053cef753e010fa89bcc01b164a306.tar.gz
rust-c4f829b2e5053cef753e010fa89bcc01b164a306.zip
Allow #[unstable] impl for fn() -> UnstableType.
(But not fn() -> !, which is stable.)
-rw-r--r--compiler/rustc_passes/src/stability.rs26
-rw-r--r--src/test/ui/stability-attribute/stability-attribute-trait-impl.rs3
2 files changed, 22 insertions, 7 deletions
diff --git a/compiler/rustc_passes/src/stability.rs b/compiler/rustc_passes/src/stability.rs
index 78591e640e3..9591aeb881f 100644
--- a/compiler/rustc_passes/src/stability.rs
+++ b/compiler/rustc_passes/src/stability.rs
@@ -888,14 +888,26 @@ impl<'tcx> Visitor<'tcx> for CheckTraitImplStable<'tcx> {
     }
 
     fn visit_ty(&mut self, t: &'tcx Ty<'tcx>) {
-        match t.kind {
-            TyKind::Never => self.fully_stable = false,
-            TyKind::BareFn(f) => {
-                if rustc_target::spec::abi::is_stable(f.abi.name()).is_err() {
-                    self.fully_stable = false;
-                }
+        if let TyKind::Never = t.kind {
+            self.fully_stable = false;
+        }
+        if let TyKind::BareFn(f) = t.kind {
+            if rustc_target::spec::abi::is_stable(f.abi.name()).is_err() {
+                self.fully_stable = false;
+            }
+        }
+        intravisit::walk_ty(self, t)
+    }
+
+    fn visit_fn_decl(&mut self, fd: &'tcx hir::FnDecl<'tcx>) {
+        for ty in fd.inputs {
+            self.visit_ty(ty)
+        }
+        if let hir::FnRetTy::Return(output_ty) = fd.output {
+            match output_ty.kind {
+                TyKind::Never => {} // `-> !` is stable
+                _ => self.visit_ty(output_ty),
             }
-            _ => intravisit::walk_ty(self, t),
         }
     }
 }
diff --git a/src/test/ui/stability-attribute/stability-attribute-trait-impl.rs b/src/test/ui/stability-attribute/stability-attribute-trait-impl.rs
index cc5bc3b6d91..0c771ae8795 100644
--- a/src/test/ui/stability-attribute/stability-attribute-trait-impl.rs
+++ b/src/test/ui/stability-attribute/stability-attribute-trait-impl.rs
@@ -37,4 +37,7 @@ impl StableTrait for StableType {}
 //~^ ERROR an `#[unstable]` annotation here has no effect [ineffective_unstable_trait_impl]
 impl StableTrait for fn() -> ! {}
 
+#[unstable(feature = "l", issue = "none")]
+impl StableTrait for fn() -> UnstableType {}
+
 fn main() {}