Don't perform selection if IATs are not enabled

This commit is contained in:
León Orell Valerian Liehr 2023-07-03 13:34:54 +02:00
parent 6162f6f123
commit 838f85d6f7
No known key found for this signature in database
GPG Key ID: D17A07215F68E713
10 changed files with 99 additions and 46 deletions

View File

@ -1893,6 +1893,15 @@ fn lookup_inherent_assoc_ty(
) -> Result<Option<(Ty<'tcx>, DefId)>, ErrorGuaranteed> {
let tcx = self.tcx();
// Don't attempt to look up inherent associated types when the feature is not enabled.
// Theoretically it'd be fine to do so since we feature-gate their definition site.
// However, due to current limitations of the implementation (caused by us performing
// selection in AstConv), IATs can lead to cycle errors (#108491, #110106) which mask the
// feature-gate error, needlessly confusing users that use IATs by accident (#113265).
if !tcx.features().inherent_associated_types {
return Ok(None);
}
let candidates: Vec<_> = tcx
.inherent_impls(adt_did)
.iter()
@ -1903,11 +1912,6 @@ fn lookup_inherent_assoc_ty(
return Ok(None);
}
if !tcx.features().inherent_associated_types {
tcx.sess
.delay_span_bug(span, "found inherent assoc type without the feature being gated");
}
//
// Select applicable inherent associated type candidates modulo regions.
//

View File

@ -1,6 +1,9 @@
// aux-crate:aux=assoc-inherent-unstable.rs
// edition: 2021
#![feature(inherent_associated_types)]
#![allow(incomplete_features)]
type Data = aux::Owner::Data; //~ ERROR use of unstable library feature 'data'
fn main() {}

View File

@ -1,5 +1,5 @@
error[E0658]: use of unstable library feature 'data'
--> $DIR/assoc-inherent-unstable.rs:4:13
--> $DIR/assoc-inherent-unstable.rs:7:13
|
LL | type Data = aux::Owner::Data;
| ^^^^^^^^^^^^^^^^

View File

@ -1,5 +1,7 @@
// known-bug: #108491
#![feature(inherent_associated_types)]
#![allow(incomplete_features)]
// FIXME(inherent_associated_types): This should pass.
struct Foo {
@ -8,3 +10,5 @@ struct Foo {
impl Foo {
pub type Bar = usize;
}
fn main() {}

View File

@ -1,49 +1,43 @@
error[E0601]: `main` function not found in crate `cycle_iat_inside_of_adt`
--> $DIR/cycle-iat-inside-of-adt.rs:10:2
|
LL | }
| ^ consider adding a `main` function to `$DIR/cycle-iat-inside-of-adt.rs`
error[E0391]: cycle detected when computing predicates of `Foo`
--> $DIR/cycle-iat-inside-of-adt.rs:5:1
--> $DIR/cycle-iat-inside-of-adt.rs:7:1
|
LL | struct Foo {
| ^^^^^^^^^^
|
note: ...which requires computing predicates of `Foo`...
--> $DIR/cycle-iat-inside-of-adt.rs:5:1
--> $DIR/cycle-iat-inside-of-adt.rs:7:1
|
LL | struct Foo {
| ^^^^^^^^^^
note: ...which requires computing inferred outlives predicates of `Foo`...
--> $DIR/cycle-iat-inside-of-adt.rs:5:1
--> $DIR/cycle-iat-inside-of-adt.rs:7:1
|
LL | struct Foo {
| ^^^^^^^^^^
= note: ...which requires computing the inferred outlives predicates for items in this crate...
note: ...which requires computing type of `Foo::bar`...
--> $DIR/cycle-iat-inside-of-adt.rs:6:5
--> $DIR/cycle-iat-inside-of-adt.rs:8:5
|
LL | bar: Self::Bar,
| ^^^^^^^^^^^^^^
note: ...which requires computing normalized predicates of `Foo`...
--> $DIR/cycle-iat-inside-of-adt.rs:5:1
--> $DIR/cycle-iat-inside-of-adt.rs:7:1
|
LL | struct Foo {
| ^^^^^^^^^^
= note: ...which again requires computing predicates of `Foo`, completing the cycle
note: cycle used when collecting item types in top-level module
--> $DIR/cycle-iat-inside-of-adt.rs:5:1
--> $DIR/cycle-iat-inside-of-adt.rs:3:1
|
LL | / struct Foo {
LL | | bar: Self::Bar,
LL | | }
LL | | impl Foo {
LL | | pub type Bar = usize;
LL | | }
| |_^
LL | / #![feature(inherent_associated_types)]
LL | | #![allow(incomplete_features)]
LL | | // FIXME(inherent_associated_types): This should pass.
LL | |
... |
LL | |
LL | | fn main() {}
| |____________^
error: aborting due to 2 previous errors
error: aborting due to previous error
Some errors have detailed explanations: E0391, E0601.
For more information about an error, try `rustc --explain E0391`.
For more information about this error, try `rustc --explain E0391`.

View File

@ -0,0 +1,17 @@
// Regression test for #113265.
// Don't perform selection if the feature is not enabled to prevent cycle errors
// that exist due to current limitations of the implementation from masking the
// feature-gate error. See the aforementioned issue.
// This does lead to rustc not mentioning inherent associated types at usage-sites of
// IATs that were defined in an external crate but that's acceptable for now.
// FIXME(inherent_associated_types): Revisit this decision once the implementation is smarter.
// The following program would currently lead to a cycle if IATs were enabled.
struct S(S::P); //~ ERROR ambiguous associated type
impl S { type P = (); } //~ ERROR inherent associated types are unstable
fn main() {}

View File

@ -0,0 +1,24 @@
error[E0223]: ambiguous associated type
--> $DIR/dont-select-if-disabled.rs:13:10
|
LL | struct S(S::P);
| ^^^^
|
help: if there were a trait named `Example` with associated type `P` implemented for `S`, you could use the fully-qualified path
|
LL | struct S(<S as Example>::P);
| ~~~~~~~~~~~~~~~~~
error[E0658]: inherent associated types are unstable
--> $DIR/dont-select-if-disabled.rs:15:10
|
LL | impl S { type P = (); }
| ^^^^^^^^^^^^
|
= note: see issue #8995 <https://github.com/rust-lang/rust/issues/8995> for more information
= help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0223, E0658.
For more information about an error, try `rustc --explain E0223`.

View File

@ -29,7 +29,13 @@ LL | type Item = &[T];
= note: see issue #8995 <https://github.com/rust-lang/rust/issues/8995> for more information
= help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable
error: aborting due to 3 previous errors
error[E0223]: ambiguous associated type
--> $DIR/issue-109071.rs:15:22
|
LL | fn T() -> Option<Self::Item> {}
| ^^^^^^^^^^ help: use the fully-qualified path: `<Windows<T> as IntoIterator>::Item`
Some errors have detailed explanations: E0107, E0637, E0658.
error: aborting due to 4 previous errors
Some errors have detailed explanations: E0107, E0223, E0637, E0658.
For more information about an error, try `rustc --explain E0107`.

View File

@ -13,6 +13,7 @@ fn next() -> Option<Self::Item> {}
impl<T> Windows<T> {
fn T() -> Option<Self::Item> {}
//[no_gate]~^ ERROR: ambiguous associated type
}
fn main() {}

View File

@ -1,3 +1,19 @@
error: `Self` is not valid in the self type of an impl block
--> $DIR/resolve-self-in-impl.rs:14:13
|
LL | impl Tr for Self {}
| ^^^^
|
= note: replace `Self` with a different type
error: `Self` is not valid in the self type of an impl block
--> $DIR/resolve-self-in-impl.rs:15:15
|
LL | impl Tr for S<Self> {}
| ^^^^
|
= note: replace `Self` with a different type
error: `Self` is not valid in the self type of an impl block
--> $DIR/resolve-self-in-impl.rs:16:6
|
@ -22,22 +38,6 @@ LL | impl (Self, Self) {}
|
= note: replace `Self` with a different type
error: `Self` is not valid in the self type of an impl block
--> $DIR/resolve-self-in-impl.rs:14:13
|
LL | impl Tr for Self {}
| ^^^^
|
= note: replace `Self` with a different type
error: `Self` is not valid in the self type of an impl block
--> $DIR/resolve-self-in-impl.rs:15:15
|
LL | impl Tr for S<Self> {}
| ^^^^
|
= note: replace `Self` with a different type
error[E0391]: cycle detected when computing trait implemented by `<impl at $DIR/resolve-self-in-impl.rs:19:1: 19:23>`
--> $DIR/resolve-self-in-impl.rs:19:1
|