Skip to content

Commit

Permalink
Don't fire OPAQUE_HIDDEN_INFERRED_BOUND on sized return of AFIT
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Jan 25, 2024
1 parent cd6d8f2 commit 2aa7469
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
13 changes: 12 additions & 1 deletion compiler/rustc_lint/src/opaque_hidden_inferred_bound.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use rustc_macros::{LintDiagnostic, Subdiagnostic};
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;

Expand Down Expand Up @@ -96,6 +96,17 @@ impl<'tcx> LateLintPass<'tcx> for OpaqueHiddenInferredBound {
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,
Expand Down
18 changes: 18 additions & 0 deletions tests/ui/async-await/in-trait/returning-possibly-unsized-self.rs
Original file line number Diff line number Diff line change
@@ -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() {}

0 comments on commit 2aa7469

Please sign in to comment.