Auto merge of #103509 - compiler-errors:opaques-w-bound-vars-r-hard, r=oli-obk
Revert "Normalize opaques with escaping bound vars" This caused a perf regression in #103423, cc `@skyzh` this should fix #103423. reverts #100980 r? `@oli-obk`
This commit is contained in:
commit
5e6de2369c
5 changed files with 49 additions and 26 deletions
|
@ -508,7 +508,7 @@ impl<'a, 'b, 'tcx> TypeFolder<'tcx> for AssocTypeNormalizer<'a, 'b, 'tcx> {
|
||||||
// This is really important. While we *can* handle this, this has
|
// This is really important. While we *can* handle this, this has
|
||||||
// severe performance implications for large opaque types with
|
// severe performance implications for large opaque types with
|
||||||
// late-bound regions. See `issue-88862` benchmark.
|
// late-bound regions. See `issue-88862` benchmark.
|
||||||
ty::Opaque(def_id, substs) => {
|
ty::Opaque(def_id, substs) if !substs.has_escaping_bound_vars() => {
|
||||||
// Only normalize `impl Trait` outside of type inference, usually in codegen.
|
// Only normalize `impl Trait` outside of type inference, usually in codegen.
|
||||||
match self.param_env.reveal() {
|
match self.param_env.reveal() {
|
||||||
Reveal::UserFacing => ty.super_fold_with(self),
|
Reveal::UserFacing => ty.super_fold_with(self),
|
||||||
|
|
|
@ -198,7 +198,7 @@ impl<'cx, 'tcx> FallibleTypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> {
|
||||||
// This is really important. While we *can* handle this, this has
|
// This is really important. While we *can* handle this, this has
|
||||||
// severe performance implications for large opaque types with
|
// severe performance implications for large opaque types with
|
||||||
// late-bound regions. See `issue-88862` benchmark.
|
// late-bound regions. See `issue-88862` benchmark.
|
||||||
ty::Opaque(def_id, substs) => {
|
ty::Opaque(def_id, substs) if !substs.has_escaping_bound_vars() => {
|
||||||
// Only normalize `impl Trait` outside of type inference, usually in codegen.
|
// Only normalize `impl Trait` outside of type inference, usually in codegen.
|
||||||
match self.param_env.reveal() {
|
match self.param_env.reveal() {
|
||||||
Reveal::UserFacing => ty.try_super_fold_with(self),
|
Reveal::UserFacing => ty.try_super_fold_with(self),
|
||||||
|
|
39
src/test/ui/impl-trait/normalize-tait-in-const.rs
Normal file
39
src/test/ui/impl-trait/normalize-tait-in-const.rs
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
// known-bug: #103507
|
||||||
|
// failure-status: 101
|
||||||
|
// normalize-stderr-test "note: .*\n\n" -> ""
|
||||||
|
// normalize-stderr-test "thread 'rustc' panicked.*\n" -> ""
|
||||||
|
// rustc-env:RUST_BACKTRACE=0
|
||||||
|
|
||||||
|
#![feature(type_alias_impl_trait)]
|
||||||
|
#![feature(const_trait_impl)]
|
||||||
|
#![feature(const_refs_to_cell)]
|
||||||
|
#![feature(inline_const)]
|
||||||
|
|
||||||
|
use std::marker::Destruct;
|
||||||
|
|
||||||
|
trait T {
|
||||||
|
type Item;
|
||||||
|
}
|
||||||
|
|
||||||
|
type Alias<'a> = impl T<Item = &'a ()>;
|
||||||
|
|
||||||
|
struct S;
|
||||||
|
impl<'a> T for &'a S {
|
||||||
|
type Item = &'a ();
|
||||||
|
}
|
||||||
|
|
||||||
|
const fn filter_positive<'a>() -> &'a Alias<'a> {
|
||||||
|
&&S
|
||||||
|
}
|
||||||
|
|
||||||
|
const fn with_positive<F: ~const for<'a> Fn(&'a Alias<'a>) + ~const Destruct>(fun: F) {
|
||||||
|
fun(filter_positive());
|
||||||
|
}
|
||||||
|
|
||||||
|
const fn foo(_: &Alias<'_>) {}
|
||||||
|
|
||||||
|
const BAR: () = {
|
||||||
|
with_positive(foo);
|
||||||
|
};
|
||||||
|
|
||||||
|
fn main() {}
|
8
src/test/ui/impl-trait/normalize-tait-in-const.stderr
Normal file
8
src/test/ui/impl-trait/normalize-tait-in-const.stderr
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
error: internal compiler error: compiler/rustc_middle/src/ty/normalize_erasing_regions.rs:198:90: Failed to normalize <for<'a, 'b> fn(&'a Alias<'b>) {foo} as std::ops::FnOnce<(&&S,)>>::Output, maybe try to call `try_normalize_erasing_regions` instead
|
||||||
|
|
||||||
|
query stack during panic:
|
||||||
|
#0 [eval_to_allocation_raw] const-evaluating + checking `BAR`
|
||||||
|
#1 [eval_to_const_value_raw] simplifying constant for the type system `BAR`
|
||||||
|
end of query stack
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
#![feature(type_alias_impl_trait)]
|
|
||||||
|
|
||||||
trait T {
|
|
||||||
type Item;
|
|
||||||
}
|
|
||||||
|
|
||||||
type Alias<'a> = impl T<Item = &'a ()>;
|
|
||||||
|
|
||||||
struct S;
|
|
||||||
impl<'a> T for &'a S {
|
|
||||||
type Item = &'a ();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn filter_positive<'a>() -> Alias<'a> {
|
|
||||||
&S
|
|
||||||
}
|
|
||||||
|
|
||||||
fn with_positive(fun: impl Fn(Alias<'_>)) {
|
|
||||||
fun(filter_positive());
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
with_positive(|_| ());
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue