diff options
| author | Mara Bos <m-ou.se@m-ou.se> | 2022-10-19 13:33:45 +0200 |
|---|---|---|
| committer | Mara Bos <m-ou.se@m-ou.se> | 2022-10-19 13:34:18 +0200 |
| commit | c4f829b2e5053cef753e010fa89bcc01b164a306 (patch) | |
| tree | fd9bf8f2f71ec14eb2d391d12dc0dff8506a1546 | |
| parent | 5420fa388197ee61fc799ea22ea9bb820306dbb9 (diff) | |
| download | rust-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.rs | 26 | ||||
| -rw-r--r-- | src/test/ui/stability-attribute/stability-attribute-trait-impl.rs | 3 |
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() {} |
