mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Rollup merge of #116879 - aliemjay:revert-opaque-bubble, r=oli-obk
revert #114586 Reverts #114586. cc #116877 (not closing until this gets a beta backport) fixes #116684 fixes https://github.com/rust-lang/rust/pull/114586#issuecomment-1751967321 r? `@oli-obk` or `@lcnr`
This commit is contained in:
commit
8489bce7f5
@ -328,26 +328,19 @@ fn check_opaque_type_well_formed<'tcx>(
|
|||||||
|
|
||||||
// Require that the hidden type actually fulfills all the bounds of the opaque type, even without
|
// Require that the hidden type actually fulfills all the bounds of the opaque type, even without
|
||||||
// the bounds that the function supplies.
|
// the bounds that the function supplies.
|
||||||
let mut obligations = vec![];
|
let opaque_ty = Ty::new_opaque(tcx, def_id.to_def_id(), identity_args);
|
||||||
infcx
|
ocx.eq(&ObligationCause::misc(definition_span, def_id), param_env, opaque_ty, definition_ty)
|
||||||
.insert_hidden_type(
|
.map_err(|err| {
|
||||||
OpaqueTypeKey { def_id, args: identity_args },
|
infcx
|
||||||
&ObligationCause::misc(definition_span, def_id),
|
.err_ctxt()
|
||||||
param_env,
|
.report_mismatched_types(
|
||||||
definition_ty,
|
&ObligationCause::misc(definition_span, def_id),
|
||||||
true,
|
opaque_ty,
|
||||||
&mut obligations,
|
definition_ty,
|
||||||
)
|
err,
|
||||||
.unwrap();
|
)
|
||||||
infcx.add_item_bounds_for_hidden_type(
|
.emit()
|
||||||
def_id.to_def_id(),
|
})?;
|
||||||
identity_args,
|
|
||||||
ObligationCause::misc(definition_span, def_id),
|
|
||||||
param_env,
|
|
||||||
definition_ty,
|
|
||||||
&mut obligations,
|
|
||||||
);
|
|
||||||
ocx.register_obligations(obligations);
|
|
||||||
|
|
||||||
// Require the hidden type to be well-formed with only the generics of the opaque type.
|
// Require the hidden type to be well-formed with only the generics of the opaque type.
|
||||||
// Defining use functions may have more bounds than the opaque type, which is ok, as long as the
|
// Defining use functions may have more bounds than the opaque type, which is ok, as long as the
|
||||||
|
@ -145,25 +145,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DefiningAnchor::Bubble => {
|
DefiningAnchor::Bubble => {}
|
||||||
if let ty::Alias(ty::Opaque, _) = b.kind() {
|
|
||||||
// In bubble mode we don't know which of the two opaque types is supposed to have the other
|
|
||||||
// as a hidden type (both, none or either one of them could be in its defining scope).
|
|
||||||
let predicate = ty::PredicateKind::AliasRelate(
|
|
||||||
a.into(),
|
|
||||||
b.into(),
|
|
||||||
ty::AliasRelationDirection::Equate,
|
|
||||||
);
|
|
||||||
let obligation = traits::Obligation::new(
|
|
||||||
self.tcx,
|
|
||||||
cause.clone(),
|
|
||||||
param_env,
|
|
||||||
predicate,
|
|
||||||
);
|
|
||||||
let obligations = vec![obligation];
|
|
||||||
return Some(Ok(InferOk { value: (), obligations }));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DefiningAnchor::Error => return None,
|
DefiningAnchor::Error => return None,
|
||||||
};
|
};
|
||||||
if let ty::Alias(ty::Opaque, ty::AliasTy { def_id: b_def_id, .. }) = *b.kind() {
|
if let ty::Alias(ty::Opaque, ty::AliasTy { def_id: b_def_id, .. }) = *b.kind() {
|
||||||
|
@ -6,7 +6,6 @@ use rustc_infer::infer::DefineOpaqueTypes;
|
|||||||
use rustc_infer::traits::ProjectionCacheKey;
|
use rustc_infer::traits::ProjectionCacheKey;
|
||||||
use rustc_infer::traits::{PolyTraitObligation, SelectionError, TraitEngine};
|
use rustc_infer::traits::{PolyTraitObligation, SelectionError, TraitEngine};
|
||||||
use rustc_middle::mir::interpret::ErrorHandled;
|
use rustc_middle::mir::interpret::ErrorHandled;
|
||||||
use rustc_middle::traits::DefiningAnchor;
|
|
||||||
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
||||||
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
||||||
use rustc_middle::ty::GenericArgsRef;
|
use rustc_middle::ty::GenericArgsRef;
|
||||||
@ -626,27 +625,9 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::PredicateKind::Ambiguous => ProcessResult::Unchanged,
|
ty::PredicateKind::Ambiguous => ProcessResult::Unchanged,
|
||||||
ty::PredicateKind::AliasRelate(..)
|
ty::PredicateKind::AliasRelate(..) => {
|
||||||
if matches!(self.selcx.infcx.defining_use_anchor, DefiningAnchor::Bubble) =>
|
bug!("AliasRelate is only used for new solver")
|
||||||
{
|
|
||||||
ProcessResult::Unchanged
|
|
||||||
}
|
}
|
||||||
ty::PredicateKind::AliasRelate(a, b, relate) => match relate {
|
|
||||||
ty::AliasRelationDirection::Equate => match self
|
|
||||||
.selcx
|
|
||||||
.infcx
|
|
||||||
.at(&obligation.cause, obligation.param_env)
|
|
||||||
.eq(DefineOpaqueTypes::Yes, a, b)
|
|
||||||
{
|
|
||||||
Ok(inf_ok) => ProcessResult::Changed(mk_pending(inf_ok.into_obligations())),
|
|
||||||
Err(_) => ProcessResult::Error(FulfillmentErrorCode::CodeSelectionError(
|
|
||||||
SelectionError::Unimplemented,
|
|
||||||
)),
|
|
||||||
},
|
|
||||||
ty::AliasRelationDirection::Subtype => {
|
|
||||||
bug!("AliasRelate with subtyping is only used for new solver")
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ty::PredicateKind::Clause(ty::ClauseKind::ConstArgHasType(ct, ty)) => {
|
ty::PredicateKind::Clause(ty::ClauseKind::ConstArgHasType(ct, ty)) => {
|
||||||
match self.selcx.infcx.at(&obligation.cause, obligation.param_env).eq(
|
match self.selcx.infcx.at(&obligation.cause, obligation.param_env).eq(
|
||||||
DefineOpaqueTypes::No,
|
DefineOpaqueTypes::No,
|
||||||
|
@ -38,7 +38,6 @@ use rustc_infer::traits::TraitObligation;
|
|||||||
use rustc_middle::dep_graph::dep_kinds;
|
use rustc_middle::dep_graph::dep_kinds;
|
||||||
use rustc_middle::dep_graph::DepNodeIndex;
|
use rustc_middle::dep_graph::DepNodeIndex;
|
||||||
use rustc_middle::mir::interpret::ErrorHandled;
|
use rustc_middle::mir::interpret::ErrorHandled;
|
||||||
use rustc_middle::traits::DefiningAnchor;
|
|
||||||
use rustc_middle::ty::_match::MatchAgainstFreshVars;
|
use rustc_middle::ty::_match::MatchAgainstFreshVars;
|
||||||
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
||||||
use rustc_middle::ty::fold::BottomUpFolder;
|
use rustc_middle::ty::fold::BottomUpFolder;
|
||||||
@ -1005,27 +1004,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::PredicateKind::AliasRelate(..)
|
ty::PredicateKind::AliasRelate(..) => {
|
||||||
if matches!(self.infcx.defining_use_anchor, DefiningAnchor::Bubble) =>
|
bug!("AliasRelate is only used for new solver")
|
||||||
{
|
|
||||||
Ok(EvaluatedToAmbig)
|
|
||||||
}
|
}
|
||||||
ty::PredicateKind::AliasRelate(a, b, relate) => match relate {
|
|
||||||
ty::AliasRelationDirection::Equate => match self
|
|
||||||
.infcx
|
|
||||||
.at(&obligation.cause, obligation.param_env)
|
|
||||||
.eq(DefineOpaqueTypes::Yes, a, b)
|
|
||||||
{
|
|
||||||
Ok(inf_ok) => self.evaluate_predicates_recursively(
|
|
||||||
previous_stack,
|
|
||||||
inf_ok.into_obligations(),
|
|
||||||
),
|
|
||||||
Err(_) => Ok(EvaluatedToErr),
|
|
||||||
},
|
|
||||||
ty::AliasRelationDirection::Subtype => {
|
|
||||||
bug!("AliasRelate subtyping is only used for new solver")
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ty::PredicateKind::Ambiguous => Ok(EvaluatedToAmbig),
|
ty::PredicateKind::Ambiguous => Ok(EvaluatedToAmbig),
|
||||||
ty::PredicateKind::Clause(ty::ClauseKind::ConstArgHasType(ct, ty)) => {
|
ty::PredicateKind::Clause(ty::ClauseKind::ConstArgHasType(ct, ty)) => {
|
||||||
match self.infcx.at(&obligation.cause, obligation.param_env).eq(
|
match self.infcx.at(&obligation.cause, obligation.param_env).eq(
|
||||||
|
29
tests/ui/impl-trait/equality-in-canonical-query.clone.stderr
Normal file
29
tests/ui/impl-trait/equality-in-canonical-query.clone.stderr
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
error: internal compiler error: no errors encountered even though `delay_span_bug` issued
|
||||||
|
|
||||||
|
error: internal compiler error: {OpaqueTypeKey { def_id: DefId(rpit::{opaque#0}), args: [] }: OpaqueTypeDecl { hidden_type: OpaqueHiddenType { span: no-location (#0), ty: Alias(Opaque, AliasTy { args: [], def_id: DefId(foo::{opaque#0}) }) } }}
|
||||||
|
|
|
||||||
|
=
|
||||||
|
|
||||||
|
|
||||||
|
error: internal compiler error: error performing ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing }, value: ProvePredicate { predicate: Binder { value: ProjectionPredicate(AliasTy { args: [FnDef(DefId(rpit), []), ()], def_id: DefId(ops::function::FnOnce::Output) }, Term::Ty(Alias(Opaque, AliasTy { args: [], def_id: DefId(foo::{opaque#0}) }))), bound_vars: [] } } }
|
||||||
|
--> $DIR/equality-in-canonical-query.rs:19:5
|
||||||
|
|
|
||||||
|
LL | same_output(foo, rpit);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
|
||||||
|
--> $DIR/equality-in-canonical-query.rs:19:5
|
||||||
|
|
|
||||||
|
LL | same_output(foo, rpit);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
query stack during panic:
|
||||||
|
end of query stack
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
23
tests/ui/impl-trait/equality-in-canonical-query.rs
Normal file
23
tests/ui/impl-trait/equality-in-canonical-query.rs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// issue: #116877
|
||||||
|
// revisions: sized clone
|
||||||
|
//[sized] check-pass
|
||||||
|
|
||||||
|
//[clone] known-bug: #108498
|
||||||
|
//[clone] failure-status: 101
|
||||||
|
//[clone] normalize-stderr-test: "DefId\(.*?\]::" -> "DefId("
|
||||||
|
//[clone] normalize-stderr-test: "(?m)note: .*$" -> ""
|
||||||
|
//[clone] normalize-stderr-test: "(?m)^ *\d+: .*\n" -> ""
|
||||||
|
//[clone] normalize-stderr-test: "(?m)^ *at .*\n" -> ""
|
||||||
|
|
||||||
|
#[cfg(sized)] fn rpit() -> impl Sized {}
|
||||||
|
#[cfg(clone)] fn rpit() -> impl Clone {}
|
||||||
|
|
||||||
|
fn same_output<Out>(_: impl Fn() -> Out, _: impl Fn() -> Out) {}
|
||||||
|
|
||||||
|
pub fn foo() -> impl Sized {
|
||||||
|
same_output(rpit, foo);
|
||||||
|
same_output(foo, rpit);
|
||||||
|
rpit()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main () {}
|
@ -1,11 +1,17 @@
|
|||||||
error: internal compiler error: no errors encountered even though `delay_span_bug` issued
|
error: internal compiler error: no errors encountered even though `delay_span_bug` issued
|
||||||
|
|
||||||
error: internal compiler error: ambiguity performing ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing }, value: ProvePredicate { predicate: Binder { value: ProjectionPredicate(AliasTy { args: [FnDef(DefId(get_rpit), []), ()], def_id: DefId(ops::function::FnOnce::Output) }, Term::Ty(Alias(Opaque, AliasTy { args: [], def_id: DefId(Opaque::{opaque#0}) }))), bound_vars: [] } } }
|
error: internal compiler error: {OpaqueTypeKey { def_id: DefId(get_rpit::{opaque#0}), args: [] }: OpaqueTypeDecl { hidden_type: OpaqueHiddenType { span: no-location (#0), ty: Alias(Opaque, AliasTy { args: [], def_id: DefId(Opaque::{opaque#0}) }) } }}
|
||||||
|
|
|
||||||
|
=
|
||||||
|
|
||||||
|
|
||||||
|
error: internal compiler error: error performing ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing }, value: ProvePredicate { predicate: Binder { value: ProjectionPredicate(AliasTy { args: [FnDef(DefId(get_rpit), []), ()], def_id: DefId(ops::function::FnOnce::Output) }, Term::Ty(Alias(Opaque, AliasTy { args: [], def_id: DefId(Opaque::{opaque#0}) }))), bound_vars: [] } } }
|
||||||
--> $DIR/rpit_tait_equality_in_canonical_query.rs:28:5
|
--> $DIR/rpit_tait_equality_in_canonical_query.rs:28:5
|
||||||
|
|
|
|
||||||
LL | query(get_rpit);
|
LL | query(get_rpit);
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
|
|
||||||
--> $DIR/rpit_tait_equality_in_canonical_query.rs:28:5
|
--> $DIR/rpit_tait_equality_in_canonical_query.rs:28:5
|
||||||
|
|
|
|
||||||
LL | query(get_rpit);
|
LL | query(get_rpit);
|
||||||
@ -14,7 +20,10 @@ LL | query(get_rpit);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
query stack during panic:
|
query stack during panic:
|
||||||
end of query stack
|
end of query stack
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
//[current] known-bug: #108498
|
//[current] known-bug: #108498
|
||||||
//[current] failure-status: 101
|
//[current] failure-status: 101
|
||||||
//[current] normalize-stderr-test: "DefId\(.*?\]::" -> "DefId("
|
//[current] normalize-stderr-test: "DefId\(.*?\]::" -> "DefId("
|
||||||
//[current] normalize-stderr-test: "(?m)^note: .*\n" -> ""
|
//[current] normalize-stderr-test: "(?m)note: .*$" -> ""
|
||||||
//[current] normalize-stderr-test: "(?m)^ *\d+: .*\n" -> ""
|
//[current] normalize-stderr-test: "(?m)^ *\d+: .*\n" -> ""
|
||||||
//[current] normalize-stderr-test: "(?m)^ *at .*\n" -> ""
|
//[current] normalize-stderr-test: "(?m)^ *at .*\n" -> ""
|
||||||
|
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
// The canonical query `Projection(<get_rpit as FnOnce>::Output = Opaque)`
|
||||||
|
// is the *only* site that defines `Opaque` in MIR typeck.
|
||||||
|
//
|
||||||
|
// check-pass
|
||||||
|
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
|
||||||
|
type Opaque = impl Sized;
|
||||||
|
|
||||||
|
fn get_rpit() -> impl Sized {}
|
||||||
|
|
||||||
|
fn query(_: impl FnOnce() -> Opaque) {}
|
||||||
|
|
||||||
|
fn test(_: Opaque) {
|
||||||
|
query(get_rpit);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Reference in New Issue
Block a user