Rollup merge of #120360 - compiler-errors:afit-sized-lol, r=lcnr
Don't fire `OPAQUE_HIDDEN_INFERRED_BOUND` on sized return of AFIT Conceptually, we should probably not fire `OPAQUE_HIDDEN_INFERRED_BOUND` for methods like: ``` trait Foo { async fn bar() -> Self; } ``` Even though we technically cannot prove that `Self: Sized`, which is one of the item bounds of the `Output` type in the `-> impl Future<Output = Sized>` from the async desugaring. This is somewhat justifiable along the same lines as how we allow regular methods to return `-> Self` even though `Self` isn't sized. Fixes #113538 (side-note: some days i wonder if we should just remove the `OPAQUE_HIDDEN_INFERRED_BOUND` lint... it does make me sad that we have non-well-formed types in signatures, though.)
This commit is contained in:
commit
b4b483574f
@ -4,7 +4,7 @@
|
|||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, fold::BottomUpFolder, print::TraitPredPrintModifiersAndPath, Ty, TypeFoldable,
|
self, fold::BottomUpFolder, print::TraitPredPrintModifiersAndPath, Ty, TypeFoldable,
|
||||||
};
|
};
|
||||||
use rustc_span::Span;
|
use rustc_span::{symbol::kw, Span};
|
||||||
use rustc_trait_selection::traits;
|
use rustc_trait_selection::traits;
|
||||||
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt;
|
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt;
|
||||||
|
|
||||||
@ -96,6 +96,17 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'tcx>) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HACK: `async fn() -> Self` in traits is "ok"...
|
||||||
|
// This is not really that great, but it's similar to why the `-> Self`
|
||||||
|
// return type is well-formed in traits even when `Self` isn't sized.
|
||||||
|
if let ty::Param(param_ty) = *proj_term.kind()
|
||||||
|
&& param_ty.name == kw::SelfUpper
|
||||||
|
&& matches!(opaque.origin, hir::OpaqueTyOrigin::AsyncFn(_))
|
||||||
|
&& opaque.in_trait
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let proj_ty =
|
let proj_ty =
|
||||||
Ty::new_projection(cx.tcx, proj.projection_ty.def_id, proj.projection_ty.args);
|
Ty::new_projection(cx.tcx, proj.projection_ty.def_id, proj.projection_ty.args);
|
||||||
// For every instance of the projection type in the bounds,
|
// For every instance of the projection type in the bounds,
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
// check-pass
|
||||||
|
// edition:2021
|
||||||
|
|
||||||
|
#![deny(opaque_hidden_inferred_bound)]
|
||||||
|
|
||||||
|
trait Repository /* : ?Sized */ {
|
||||||
|
async fn new() -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MyRepository {}
|
||||||
|
|
||||||
|
impl Repository for MyRepository {
|
||||||
|
async fn new() -> Self {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Reference in New Issue
Block a user