mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-09 05:23:07 +00:00
Auto merge of #119110 - matthiaskrgr:rollup-vr6ha8x, r=matthiaskrgr
Rollup of 4 pull requests Successful merges: - #119087 (Update books) - #119091 (Use alias-eq in structural normalization) - #119098 (Adjust the ignore-compare-mode-next-solver for hangs) - #119100 (Add the function body span to StableMIR) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
69e4545a8d
@ -1498,7 +1498,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let ty = self.resolve_vars_with_obligations(ty);
|
||||
|
||||
if self.next_trait_solver()
|
||||
&& let ty::Alias(ty::Projection | ty::Inherent | ty::Weak, _) = ty.kind()
|
||||
&& let ty::Alias(..) = ty.kind()
|
||||
{
|
||||
match self
|
||||
.at(&self.misc(sp), self.param_env)
|
||||
|
@ -37,6 +37,7 @@ impl<'tcx> Stable<'tcx> for mir::Body<'tcx> {
|
||||
self.arg_count,
|
||||
self.var_debug_info.iter().map(|info| info.stable(tables)).collect(),
|
||||
self.spread_arg.stable(tables),
|
||||
self.span.stable(tables),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKi
|
||||
use rustc_infer::traits::{FulfillmentError, TraitEngine};
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
|
||||
use crate::traits::{query::evaluate_obligation::InferCtxtExt, NormalizeExt, Obligation};
|
||||
use crate::traits::{NormalizeExt, Obligation};
|
||||
|
||||
pub trait StructurallyNormalizeExt<'tcx> {
|
||||
fn structurally_normalize(
|
||||
@ -16,42 +16,43 @@ pub trait StructurallyNormalizeExt<'tcx> {
|
||||
impl<'tcx> StructurallyNormalizeExt<'tcx> for At<'_, 'tcx> {
|
||||
fn structurally_normalize(
|
||||
&self,
|
||||
mut ty: Ty<'tcx>,
|
||||
ty: Ty<'tcx>,
|
||||
fulfill_cx: &mut dyn TraitEngine<'tcx>,
|
||||
) -> Result<Ty<'tcx>, Vec<FulfillmentError<'tcx>>> {
|
||||
assert!(!ty.is_ty_var(), "should have resolved vars before calling");
|
||||
|
||||
if self.infcx.next_trait_solver() {
|
||||
// FIXME(-Znext-solver): correctly handle
|
||||
// overflow here.
|
||||
for _ in 0..256 {
|
||||
let ty::Alias(ty::Projection | ty::Inherent | ty::Weak, alias) = *ty.kind() else {
|
||||
break;
|
||||
};
|
||||
// FIXME(-Znext-solver): Should we resolve opaques here?
|
||||
let ty::Alias(ty::Projection | ty::Inherent | ty::Weak, _) = *ty.kind() else {
|
||||
return Ok(ty);
|
||||
};
|
||||
|
||||
let new_infer_ty = self.infcx.next_ty_var(TypeVariableOrigin {
|
||||
kind: TypeVariableOriginKind::NormalizeProjectionType,
|
||||
span: self.cause.span,
|
||||
});
|
||||
let obligation = Obligation::new(
|
||||
self.infcx.tcx,
|
||||
self.cause.clone(),
|
||||
self.param_env,
|
||||
ty::NormalizesTo { alias, term: new_infer_ty.into() },
|
||||
);
|
||||
if self.infcx.predicate_may_hold(&obligation) {
|
||||
fulfill_cx.register_predicate_obligation(self.infcx, obligation);
|
||||
let errors = fulfill_cx.select_where_possible(self.infcx);
|
||||
if !errors.is_empty() {
|
||||
return Err(errors);
|
||||
}
|
||||
ty = self.infcx.resolve_vars_if_possible(new_infer_ty);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
let new_infer_ty = self.infcx.next_ty_var(TypeVariableOrigin {
|
||||
kind: TypeVariableOriginKind::NormalizeProjectionType,
|
||||
span: self.cause.span,
|
||||
});
|
||||
|
||||
// We simply emit an `alias-eq` goal here, since that will take care of
|
||||
// normalizing the LHS of the projection until it is a rigid projection
|
||||
// (or a not-yet-defined opaque in scope).
|
||||
let obligation = Obligation::new(
|
||||
self.infcx.tcx,
|
||||
self.cause.clone(),
|
||||
self.param_env,
|
||||
ty::PredicateKind::AliasRelate(
|
||||
ty.into(),
|
||||
new_infer_ty.into(),
|
||||
ty::AliasRelationDirection::Equate,
|
||||
),
|
||||
);
|
||||
|
||||
fulfill_cx.register_predicate_obligation(self.infcx, obligation);
|
||||
let errors = fulfill_cx.select_where_possible(self.infcx);
|
||||
if !errors.is_empty() {
|
||||
return Err(errors);
|
||||
}
|
||||
|
||||
Ok(ty)
|
||||
Ok(self.infcx.resolve_vars_if_possible(new_infer_ty))
|
||||
} else {
|
||||
Ok(self.normalize(ty).into_value_registering_obligations(self.infcx, fulfill_cx))
|
||||
}
|
||||
|
@ -27,6 +27,9 @@ pub struct Body {
|
||||
///
|
||||
/// This is used for the "rust-call" ABI such as closures.
|
||||
pub(super) spread_arg: Option<Local>,
|
||||
|
||||
/// The span that covers the entire function body.
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
pub type BasicBlockIdx = usize;
|
||||
@ -42,6 +45,7 @@ impl Body {
|
||||
arg_count: usize,
|
||||
var_debug_info: Vec<VarDebugInfo>,
|
||||
spread_arg: Option<Local>,
|
||||
span: Span,
|
||||
) -> Self {
|
||||
// If locals doesn't contain enough entries, it can lead to panics in
|
||||
// `ret_local`, `arg_locals`, and `inner_locals`.
|
||||
@ -49,7 +53,7 @@ impl Body {
|
||||
locals.len() > arg_count,
|
||||
"A Body must contain at least a local for the return value and each of the function's arguments"
|
||||
);
|
||||
Self { blocks, locals, arg_count, var_debug_info, spread_arg }
|
||||
Self { blocks, locals, arg_count, var_debug_info, spread_arg, span }
|
||||
}
|
||||
|
||||
/// Return local that holds this function's return value.
|
||||
|
@ -133,7 +133,7 @@ pub trait MirVisitor {
|
||||
}
|
||||
|
||||
fn super_body(&mut self, body: &Body) {
|
||||
let Body { blocks, locals: _, arg_count, var_debug_info, spread_arg: _ } = body;
|
||||
let Body { blocks, locals: _, arg_count, var_debug_info, spread_arg: _, span } = body;
|
||||
|
||||
for bb in blocks {
|
||||
self.visit_basic_block(bb);
|
||||
@ -153,6 +153,8 @@ pub trait MirVisitor {
|
||||
for info in var_debug_info.iter() {
|
||||
self.visit_var_debug_info(info);
|
||||
}
|
||||
|
||||
self.visit_span(span)
|
||||
}
|
||||
|
||||
fn super_basic_block(&mut self, bb: &BasicBlock) {
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 34fca48ed284525b2f124bf93c51af36d6685492
|
||||
Subproject commit bbffb074e16bef89772818b400b6c76a65eac126
|
@ -1 +1 @@
|
||||
Subproject commit 22bca3d0f6e9b9b556689b54ce96f25b46ecd1b3
|
||||
Subproject commit 3f9df2b9885c6741365da2e12ed6662cd0e827d6
|
@ -1 +1 @@
|
||||
Subproject commit 83d015105e6d490fc30d6c95da1e56152a50e228
|
||||
Subproject commit f6bd083c4ccfc4ce6699b8b4154e3c45c5a27a8c
|
@ -1 +1 @@
|
||||
Subproject commit 692d216f5a1151e8852ddb308ba64040e634c876
|
||||
Subproject commit f9f5b5babd95515e7028c32d6ca4d9790f64c146
|
@ -1 +1 @@
|
||||
Subproject commit da0a06aada31a324ae84a9eaee344f6a944b9683
|
||||
Subproject commit 4c2b24ff9d9cf19f2fcff799a3a49b9a2c50ae8e
|
@ -1 +1 @@
|
||||
Subproject commit 904bb5aa7b21adad58ffae610e2830c7b0f813b0
|
||||
Subproject commit 0610665a8687b1b0aa037917a1598b9f2a21e3ef
|
@ -1,6 +1,7 @@
|
||||
// build-fail
|
||||
// normalize-stderr-test: "<\{closure@.+`" -> "$$CLOSURE`"
|
||||
// normalize-stderr-test: ".nll/" -> "/"
|
||||
// ignore-compare-mode-next-solver (hangs)
|
||||
|
||||
#![allow(unused)]
|
||||
|
||||
|
@ -1,11 +1,11 @@
|
||||
error: reached the recursion limit while instantiating `A::matches::$CLOSURE`
|
||||
--> $DIR/issue-22638.rs:56:9
|
||||
--> $DIR/issue-22638.rs:57:9
|
||||
|
|
||||
LL | a.matches(f)
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
note: `A::matches` defined here
|
||||
--> $DIR/issue-22638.rs:15:5
|
||||
--> $DIR/issue-22638.rs:16:5
|
||||
|
|
||||
LL | pub fn matches<F: Fn()>(&self, f: &F) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -1,7 +1,6 @@
|
||||
// build-fail
|
||||
// compile-flags: -Copt-level=0
|
||||
// normalize-stderr-test: ".nll/" -> "/"
|
||||
// ignore-compare-mode-next-solver (hangs)
|
||||
|
||||
fn main() {
|
||||
rec(Empty);
|
||||
|
@ -1,11 +1,11 @@
|
||||
error: reached the recursion limit while instantiating `rec::<&mut &mut &mut &mut &mut ...>`
|
||||
--> $DIR/issue-67552.rs:30:9
|
||||
--> $DIR/issue-67552.rs:29:9
|
||||
|
|
||||
LL | rec(identity(&mut it))
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: `rec` defined here
|
||||
--> $DIR/issue-67552.rs:23:1
|
||||
--> $DIR/issue-67552.rs:22:1
|
||||
|
|
||||
LL | / fn rec<T>(mut it: T)
|
||||
LL | | where
|
||||
|
@ -3,7 +3,6 @@
|
||||
// compile-flags: -Copt-level=0
|
||||
// dont-check-failure-status
|
||||
// dont-check-compiler-stderr
|
||||
// ignore-compare-mode-next-solver (hangs)
|
||||
|
||||
pub fn encode_num<Writer: ExampleWriter>(n: u32, mut writer: Writer) -> Result<(), Writer::Error> {
|
||||
if n > 15 {
|
||||
|
@ -23,7 +23,7 @@ fn main() {
|
||||
let x = String::from("hello, world");
|
||||
drop(<() as Foo>::copy_me(&x));
|
||||
//~^ ERROR overflow evaluating the requirement `<() as Foo>::Item: Sized`
|
||||
//~| ERROR overflow evaluating the requirement `<() as Foo>::Item normalizes-to _`
|
||||
//~| ERROR overflow evaluating the requirement `<() as Foo>::Item == _`
|
||||
//~| ERROR overflow evaluating the requirement `<() as Foo>::Item well-formed`
|
||||
//~| ERROR overflow evaluating the requirement `String <: <() as Foo>::Item`
|
||||
//~| ERROR overflow evaluating the requirement `&<() as Foo>::Item well-formed`
|
||||
|
@ -19,7 +19,7 @@ LL | drop(<() as Foo>::copy_me(&x));
|
||||
|
|
||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`alias_bound_unsound`)
|
||||
|
||||
error[E0275]: overflow evaluating the requirement `<() as Foo>::Item normalizes-to _`
|
||||
error[E0275]: overflow evaluating the requirement `<() as Foo>::Item == _`
|
||||
--> $DIR/alias-bound-unsound.rs:24:10
|
||||
|
|
||||
LL | drop(<() as Foo>::copy_me(&x));
|
||||
@ -59,7 +59,6 @@ LL | drop(<() as Foo>::copy_me(&x));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`alias_bound_unsound`)
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
|
@ -0,0 +1,15 @@
|
||||
// compile-flags: -Znext-solver
|
||||
// check-pass
|
||||
|
||||
trait Trait {
|
||||
type Assoc;
|
||||
}
|
||||
|
||||
fn call<T: Trait>(_: <T as Trait>::Assoc, _: T) {}
|
||||
|
||||
fn foo<T: Trait>(rigid: <T as Trait>::Assoc, t: T) {
|
||||
// Check that we can coerce `<?0 as Trait>::Assoc` to `<T as Trait>::Assoc`.
|
||||
call::<_ /* ?0 */>(rigid, t);
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -13,7 +13,6 @@ pub fn copy_any<T>(t: &T) -> T {
|
||||
//~^ ERROR the type `&<dyn Setup<From = T> as Setup>::From` is not well-formed
|
||||
//~| ERROR the trait bound `dyn Setup<From = T>: Setup` is not satisfied
|
||||
//~| ERROR mismatched types
|
||||
//~| ERROR mismatched types
|
||||
//~| ERROR the type `<dyn Setup<From = T> as Setup>::From` is not well-formed
|
||||
//~| ERROR the size for values of type `<dyn Setup<From = T> as Setup>::From` cannot be known at compilation time
|
||||
|
||||
|
@ -36,20 +36,6 @@ note: function defined here
|
||||
LL | fn copy<U: Setup + ?Sized>(from: &U::From) -> U::From {
|
||||
| ^^^^ --------------
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/object-unsafety.rs:12:5
|
||||
|
|
||||
LL | pub fn copy_any<T>(t: &T) -> T {
|
||||
| - - expected `T` because of return type
|
||||
| |
|
||||
| expected this type parameter
|
||||
LL | copy::<dyn Setup<From=T>>(t)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ types differ
|
||||
|
|
||||
= note: expected type parameter `T`
|
||||
found associated type `<dyn Setup<From = T> as Setup>::From`
|
||||
= note: you might be missing a type parameter or trait bound
|
||||
|
||||
error: the type `<dyn Setup<From = T> as Setup>::From` is not well-formed
|
||||
--> $DIR/object-unsafety.rs:12:5
|
||||
|
|
||||
@ -72,7 +58,7 @@ help: consider further restricting the associated type
|
||||
LL | pub fn copy_any<T>(t: &T) -> T where <dyn Setup<From = T> as Setup>::From: Sized {
|
||||
| +++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0277, E0308.
|
||||
For more information about an error, try `rustc --explain E0277`.
|
||||
|
@ -1,3 +1,5 @@
|
||||
// ignore-compare-mode-next-solver (hangs)
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
type Bar<'a, 'b> = impl PartialEq<Bar<'a, 'b>> + std::fmt::Debug;
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0277]: can't compare `&i32` with `Bar<'a, 'b>`
|
||||
--> $DIR/self-referential-3.rs:5:31
|
||||
--> $DIR/self-referential-3.rs:7:31
|
||||
|
|
||||
LL | fn bar<'a, 'b>(i: &'a i32) -> Bar<'a, 'b> {
|
||||
| ^^^^^^^^^^^ no implementation for `&i32 == Bar<'a, 'b>`
|
||||
|
@ -1,3 +1,5 @@
|
||||
// ignore-compare-mode-next-solver (hangs)
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
type Bar<'a, 'b> = impl PartialEq<Bar<'b, 'static>> + std::fmt::Debug;
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0277]: can't compare `&i32` with `Bar<'b, 'static>`
|
||||
--> $DIR/self-referential-4.rs:5:31
|
||||
--> $DIR/self-referential-4.rs:7:31
|
||||
|
|
||||
LL | fn bar<'a, 'b>(i: &'a i32) -> Bar<'a, 'b> {
|
||||
| ^^^^^^^^^^^ no implementation for `&i32 == Bar<'b, 'static>`
|
||||
@ -10,7 +10,7 @@ LL | i
|
||||
= help: the trait `PartialEq` is implemented for `i32`
|
||||
|
||||
error[E0277]: can't compare `&i32` with `Foo<'static, 'b>`
|
||||
--> $DIR/self-referential-4.rs:11:31
|
||||
--> $DIR/self-referential-4.rs:13:31
|
||||
|
|
||||
LL | fn foo<'a, 'b>(i: &'a i32) -> Foo<'a, 'b> {
|
||||
| ^^^^^^^^^^^ no implementation for `&i32 == Foo<'static, 'b>`
|
||||
@ -21,7 +21,7 @@ LL | i
|
||||
= help: the trait `PartialEq` is implemented for `i32`
|
||||
|
||||
error[E0277]: can't compare `&i32` with `Moo<'static, 'a>`
|
||||
--> $DIR/self-referential-4.rs:17:31
|
||||
--> $DIR/self-referential-4.rs:19:31
|
||||
|
|
||||
LL | fn moo<'a, 'b>(i: &'a i32) -> Moo<'a, 'b> {
|
||||
| ^^^^^^^^^^^ no implementation for `&i32 == Moo<'static, 'a>`
|
||||
|
@ -1,3 +1,5 @@
|
||||
// ignore-compare-mode-next-solver (hangs)
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
type Bar<'a, 'b> = impl PartialEq<Bar<'b, 'a>> + std::fmt::Debug;
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0277]: can't compare `&i32` with `Bar<'b, 'a>`
|
||||
--> $DIR/self-referential.rs:5:31
|
||||
--> $DIR/self-referential.rs:7:31
|
||||
|
|
||||
LL | fn bar<'a, 'b>(i: &'a i32) -> Bar<'a, 'b> {
|
||||
| ^^^^^^^^^^^ no implementation for `&i32 == Bar<'b, 'a>`
|
||||
@ -11,7 +11,7 @@ LL | i
|
||||
= help: the trait `PartialEq` is implemented for `i32`
|
||||
|
||||
error[E0277]: can't compare `&i32` with `(i32, Foo<'a, 'b>::{opaque#0})`
|
||||
--> $DIR/self-referential.rs:12:31
|
||||
--> $DIR/self-referential.rs:14:31
|
||||
|
|
||||
LL | fn foo<'a, 'b>(i: &'a i32) -> Foo<'a, 'b> {
|
||||
| ^^^^^^^^^^^ no implementation for `&i32 == (i32, Foo<'a, 'b>::{opaque#0})`
|
||||
@ -23,7 +23,7 @@ LL | (42, i)
|
||||
= help: the trait `PartialEq` is implemented for `i32`
|
||||
|
||||
error[E0277]: can't compare `&i32` with `(i32, Moo<'b, 'a>::{opaque#0})`
|
||||
--> $DIR/self-referential.rs:19:31
|
||||
--> $DIR/self-referential.rs:21:31
|
||||
|
|
||||
LL | fn moo<'a, 'b>(i: &'a i32) -> Moo<'a, 'b> {
|
||||
| ^^^^^^^^^^^ no implementation for `&i32 == (i32, Moo<'b, 'a>::{opaque#0})`
|
||||
|
Loading…
Reference in New Issue
Block a user