Skip to content

Commit

Permalink
Auto merge of #113690 - aliemjay:opaque-defined-by-trait, r=compiler-…
Browse files Browse the repository at this point in the history
…errors

allow opaques to be defined by trait queries, again

This basically reverts #112963.

Moreover, all call-sites of `enter_canonical_trait_query` can now define opaque types, see the ui test `defined-by-user-annotation.rs`.

Fixes #113689

r? `@compiler-errors` `@oli-obk`
  • Loading branch information
bors committed Jul 19, 2023
2 parents 0d6a9b2 + 281c227 commit b657dc5
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 5 deletions.
11 changes: 6 additions & 5 deletions compiler/rustc_trait_selection/src/infer.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::traits::query::evaluate_obligation::InferCtxtExt as _;
use crate::traits::{self, ObligationCtxt};
use crate::traits::{self, DefiningAnchor, ObligationCtxt};

use rustc_hir::def_id::DefId;
use rustc_hir::lang_items::LangItem;
Expand Down Expand Up @@ -80,7 +80,7 @@ impl<'tcx> InferCtxtExt<'tcx> for InferCtxt<'tcx> {

pub trait InferCtxtBuilderExt<'tcx> {
fn enter_canonical_trait_query<K, R>(
&mut self,
self,
canonical_key: &Canonical<'tcx, K>,
operation: impl FnOnce(&ObligationCtxt<'_, 'tcx>, K) -> Result<R, NoSolution>,
) -> Result<CanonicalQueryResponse<'tcx, R>, NoSolution>
Expand Down Expand Up @@ -108,7 +108,7 @@ impl<'tcx> InferCtxtBuilderExt<'tcx> for InferCtxtBuilder<'tcx> {
/// have `'tcx` be free on this function so that we can talk about
/// `K: TypeFoldable<TyCtxt<'tcx>>`.)
fn enter_canonical_trait_query<K, R>(
&mut self,
self,
canonical_key: &Canonical<'tcx, K>,
operation: impl FnOnce(&ObligationCtxt<'_, 'tcx>, K) -> Result<R, NoSolution>,
) -> Result<CanonicalQueryResponse<'tcx, R>, NoSolution>
Expand All @@ -117,8 +117,9 @@ impl<'tcx> InferCtxtBuilderExt<'tcx> for InferCtxtBuilder<'tcx> {
R: Debug + TypeFoldable<TyCtxt<'tcx>>,
Canonical<'tcx, QueryResponse<'tcx, R>>: ArenaAllocatable<'tcx>,
{
let (infcx, key, canonical_inference_vars) =
self.build_with_canonical(DUMMY_SP, canonical_key);
let (infcx, key, canonical_inference_vars) = self
.with_opaque_type_inference(DefiningAnchor::Bubble)
.build_with_canonical(DUMMY_SP, canonical_key);
let ocx = ObligationCtxt::new(&infcx);
let value = operation(&ocx, key)?;
ocx.make_canonicalized_query_response(canonical_inference_vars, value)
Expand Down
12 changes: 12 additions & 0 deletions tests/ui/impl-trait/defined-by-trait-resolution.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//! The trait query `foo: Fn() -> u8` is a valid defining use of RPIT.

// build-pass

fn returns_u8(_: impl Fn() -> u8) {}

pub fn foo() -> impl Sized {
returns_u8(foo);
0u8
}

fn main() {}
19 changes: 19 additions & 0 deletions tests/ui/type-alias-impl-trait/defined-by-user-annotation.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// User type annotation in fn bodies is a a valid defining site for opaque types.
// check-pass
#![feature(type_alias_impl_trait)]

trait Equate { type Proj; }
impl<T> Equate for T { type Proj = T; }

trait Indirect { type Ty; }
impl<A, B: Equate<Proj = A>> Indirect for (A, B) { type Ty = (); }

type Opq = impl Sized;
fn define_1(_: Opq) {
let _ = None::<<(Opq, u8) as Indirect>::Ty>;
}
fn define_2() -> Opq {
0u8
}

fn main() {}

0 comments on commit b657dc5

Please sign in to comment.