Allow #[unstable] impl for fn() -> UnstableType.
(But not fn() -> !, which is stable.)
This commit is contained in:
parent
5420fa3881
commit
c4f829b2e5
@ -888,14 +888,26 @@ impl<'tcx> Visitor<'tcx> for CheckTraitImplStable<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_ty(&mut self, t: &'tcx Ty<'tcx>) {
|
fn visit_ty(&mut self, t: &'tcx Ty<'tcx>) {
|
||||||
match t.kind {
|
if let TyKind::Never = t.kind {
|
||||||
TyKind::Never => self.fully_stable = false,
|
self.fully_stable = false;
|
||||||
TyKind::BareFn(f) => {
|
}
|
||||||
if rustc_target::spec::abi::is_stable(f.abi.name()).is_err() {
|
if let TyKind::BareFn(f) = t.kind {
|
||||||
self.fully_stable = false;
|
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),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,4 +37,7 @@ impl StableTrait for StableType {}
|
|||||||
//~^ ERROR an `#[unstable]` annotation here has no effect [ineffective_unstable_trait_impl]
|
//~^ ERROR an `#[unstable]` annotation here has no effect [ineffective_unstable_trait_impl]
|
||||||
impl StableTrait for fn() -> ! {}
|
impl StableTrait for fn() -> ! {}
|
||||||
|
|
||||||
|
#[unstable(feature = "l", issue = "none")]
|
||||||
|
impl StableTrait for fn() -> UnstableType {}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user