mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
revert rust-lang/rust#114586
This commit is contained in:
parent
5d5edf0248
commit
a1e274f172
@ -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
|
||||
// the bounds that the function supplies.
|
||||
let mut obligations = vec![];
|
||||
infcx
|
||||
.insert_hidden_type(
|
||||
OpaqueTypeKey { def_id, args: identity_args },
|
||||
&ObligationCause::misc(definition_span, def_id),
|
||||
param_env,
|
||||
definition_ty,
|
||||
true,
|
||||
&mut obligations,
|
||||
)
|
||||
.unwrap();
|
||||
infcx.add_item_bounds_for_hidden_type(
|
||||
def_id.to_def_id(),
|
||||
identity_args,
|
||||
ObligationCause::misc(definition_span, def_id),
|
||||
param_env,
|
||||
definition_ty,
|
||||
&mut obligations,
|
||||
);
|
||||
ocx.register_obligations(obligations);
|
||||
let opaque_ty = Ty::new_opaque(tcx, def_id.to_def_id(), identity_args);
|
||||
ocx.eq(&ObligationCause::misc(definition_span, def_id), param_env, opaque_ty, definition_ty)
|
||||
.map_err(|err| {
|
||||
infcx
|
||||
.err_ctxt()
|
||||
.report_mismatched_types(
|
||||
&ObligationCause::misc(definition_span, def_id),
|
||||
opaque_ty,
|
||||
definition_ty,
|
||||
err,
|
||||
)
|
||||
.emit()
|
||||
})?;
|
||||
|
||||
// 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
|
||||
|
@ -145,25 +145,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
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::Bubble => {}
|
||||
DefiningAnchor::Error => return None,
|
||||
};
|
||||
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::{PolyTraitObligation, SelectionError, TraitEngine};
|
||||
use rustc_middle::mir::interpret::ErrorHandled;
|
||||
use rustc_middle::traits::DefiningAnchor;
|
||||
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
||||
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
||||
use rustc_middle::ty::GenericArgsRef;
|
||||
@ -626,27 +625,9 @@ impl<'a, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
ty::PredicateKind::Ambiguous => ProcessResult::Unchanged,
|
||||
ty::PredicateKind::AliasRelate(..)
|
||||
if matches!(self.selcx.infcx.defining_use_anchor, DefiningAnchor::Bubble) =>
|
||||
{
|
||||
ProcessResult::Unchanged
|
||||
ty::PredicateKind::AliasRelate(..) => {
|
||||
bug!("AliasRelate is only used for new solver")
|
||||
}
|
||||
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)) => {
|
||||
match self.selcx.infcx.at(&obligation.cause, obligation.param_env).eq(
|
||||
DefineOpaqueTypes::No,
|
||||
|
@ -38,7 +38,6 @@ use rustc_infer::traits::TraitObligation;
|
||||
use rustc_middle::dep_graph::dep_kinds;
|
||||
use rustc_middle::dep_graph::DepNodeIndex;
|
||||
use rustc_middle::mir::interpret::ErrorHandled;
|
||||
use rustc_middle::traits::DefiningAnchor;
|
||||
use rustc_middle::ty::_match::MatchAgainstFreshVars;
|
||||
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
||||
use rustc_middle::ty::fold::BottomUpFolder;
|
||||
@ -1005,27 +1004,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
}
|
||||
}
|
||||
}
|
||||
ty::PredicateKind::AliasRelate(..)
|
||||
if matches!(self.infcx.defining_use_anchor, DefiningAnchor::Bubble) =>
|
||||
{
|
||||
Ok(EvaluatedToAmbig)
|
||||
ty::PredicateKind::AliasRelate(..) => {
|
||||
bug!("AliasRelate is only used for new solver")
|
||||
}
|
||||
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::Clause(ty::ClauseKind::ConstArgHasType(ct, ty)) => {
|
||||
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: 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
|
||||
|
|
||||
LL | query(get_rpit);
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
|
||||
--> $DIR/rpit_tait_equality_in_canonical_query.rs:28:5
|
||||
|
|
||||
LL | query(get_rpit);
|
||||
@ -14,7 +20,10 @@ LL | query(get_rpit);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
query stack during panic:
|
||||
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] failure-status: 101
|
||||
//[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)^ *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