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::{
|
||||
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::query::evaluate_obligation::InferCtxtExt;
|
||||
|
||||
@ -96,6 +96,17 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'tcx>) {
|
||||
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 =
|
||||
Ty::new_projection(cx.tcx, proj.projection_ty.def_id, proj.projection_ty.args);
|
||||
// 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