Skip to content

Commit

Permalink
Handle inherent associated types fallout
Browse files Browse the repository at this point in the history
  • Loading branch information
fmease committed Aug 3, 2023
1 parent 263a0de commit 6f5d855
Show file tree
Hide file tree
Showing 15 changed files with 117 additions and 72 deletions.
17 changes: 9 additions & 8 deletions tests/rustdoc-json/type/inherent_associated_type_bound.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@
// @set Carrier = '$.index[*][?(@.name=="Carrier")].id'
pub struct Carrier<'a>(&'a ());

// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.generic_params[*].name' \""'b"\"
// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.decl.inputs[0][1].qualified_path.self_type.resolved_path.id' $Carrier
// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.decl.inputs[0][1].qualified_path.self_type.resolved_path.args.angle_bracketed.args[0].lifetime' \""'b"\"
// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.decl.inputs[0][1].qualified_path.name' '"Focus"'
// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.decl.inputs[0][1].qualified_path.trait' null
// @is '$.index[*][?(@.name=="User")].inner.typedef.type.function_pointer.decl.inputs[0][1].qualified_path.args.angle_bracketed.args[0].type.primitive' '"i32"'

pub type User = for<'b> fn(Carrier<'b>::Focus<i32>);
// @count "$.index[*][?(@.name=='user')].inner.function.decl.inputs[*]" 1
// @is "$.index[*][?(@.name=='user')].inner.function.decl.inputs[0][0]" '"_"'
// @is '$.index[*][?(@.name=="user")].inner.function.decl.inputs[0][1].function_pointer.generic_params[*].name' \""'b"\"
// @is '$.index[*][?(@.name=="user")].inner.function.decl.inputs[0][1].function_pointer.decl.inputs[0][1].qualified_path.self_type.resolved_path.id' $Carrier
// @is '$.index[*][?(@.name=="user")].inner.function.decl.inputs[0][1].function_pointer.decl.inputs[0][1].qualified_path.self_type.resolved_path.args.angle_bracketed.args[0].lifetime' \""'b"\"
// @is '$.index[*][?(@.name=="user")].inner.function.decl.inputs[0][1].function_pointer.decl.inputs[0][1].qualified_path.name' '"Focus"'
// @is '$.index[*][?(@.name=="user")].inner.function.decl.inputs[0][1].function_pointer.decl.inputs[0][1].qualified_path.trait' null
// @is '$.index[*][?(@.name=="user")].inner.function.decl.inputs[0][1].function_pointer.decl.inputs[0][1].qualified_path.args.angle_bracketed.args[0].type.primitive' '"i32"'
pub fn user(_: for<'b> fn(Carrier<'b>::Focus<i32>)) {}

impl<'a> Carrier<'a> {
pub type Focus<T> = &'a mut T;
Expand Down
12 changes: 7 additions & 5 deletions tests/rustdoc-json/type/inherent_associated_type_projections.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
// @set Parametrized = '$.index[*][?(@.name=="Parametrized")].id'
pub struct Parametrized<T>(T);

// @is '$.index[*][?(@.name=="Test")].inner.typedef.type.qualified_path.self_type.resolved_path.id' $Parametrized
// @is '$.index[*][?(@.name=="Test")].inner.typedef.type.qualified_path.self_type.resolved_path.args.angle_bracketed.args[0].type.primitive' \"i32\"
// @is '$.index[*][?(@.name=="Test")].inner.typedef.type.qualified_path.name' '"Proj"'
// @is '$.index[*][?(@.name=="Test")].inner.typedef.type.qualified_path.trait' null
pub type Test = Parametrized<i32>::Proj;
// @count "$.index[*][?(@.name=='test')].inner.function.decl.inputs[*]" 1
// @is "$.index[*][?(@.name=='test')].inner.function.decl.inputs[0][0]" '"_"'
// @is '$.index[*][?(@.name=="test")].inner.function.decl.inputs[0][1].qualified_path.self_type.resolved_path.id' $Parametrized
// @is '$.index[*][?(@.name=="test")].inner.function.decl.inputs[0][1].qualified_path.self_type.resolved_path.args.angle_bracketed.args[0].type.primitive' \"i32\"
// @is '$.index[*][?(@.name=="test")].inner.function.decl.inputs[0][1].qualified_path.name' '"Proj"'
// @is '$.index[*][?(@.name=="test")].inner.function.decl.inputs[0][1].qualified_path.trait' null
pub fn test(_: Parametrized<i32>::Proj) {}

/// param_bool
impl Parametrized<bool> {
Expand Down
10 changes: 5 additions & 5 deletions tests/rustdoc/inherent-projections.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ impl Owner {
}

// Make sure we handle bound vars correctly.
// @has 'inherent_projections/type.User.html' '//pre[@class="rust item-decl"]' "for<'a> fn(_: Carrier<'a>::Focus)"
pub type User = for<'a> fn(Carrier<'a>::Focus);
// @has 'inherent_projections/fn.user.html' '//pre[@class="rust item-decl"]' "user(_: for<'a> fn(_: Carrier<'a>::Focus))"
pub fn user(_: for<'a> fn(Carrier<'a>::Focus)) {}

pub struct Carrier<'a>(&'a ());

Expand All @@ -27,11 +27,11 @@ impl<'a> Carrier<'a> {
// FIXME(inherent_associated_types): Below we link to `Proj` but we should link to `Proj-1`.
// The current test checks for the buggy behavior for demonstration purposes.

// @has 'inherent_projections/type.Test.html'
// @has - '//pre[@class="rust item-decl"]' "Parametrized<i32>"
// @has 'inherent_projections/fn.test.html'
// @has - '//pre[@class="rust item-decl"]' "test(_: Parametrized<i32>::Proj)"
// @has - '//pre[@class="rust item-decl"]//a[@class="associatedtype"]/@href' 'struct.Parametrized.html#associatedtype.Proj'
// @!has - '//pre[@class="rust item-decl"]//a[@class="associatedtype"]/@href' 'struct.Parametrized.html#associatedtype.Proj-1'
pub type Test = Parametrized<i32>::Proj;
pub fn test(_: Parametrized<i32>::Proj) {}

pub struct Parametrized<T>(T);

Expand Down
4 changes: 1 addition & 3 deletions tests/ui/associated-inherent-types/issue-111879-0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,8 @@

pub struct Carrier<'a>(&'a ());

pub type User = for<'b> fn(Carrier<'b>::Focus<i32>);

impl<'a> Carrier<'a> {
pub type Focus<T> = &'a mut User; //~ ERROR overflow evaluating associated type
pub type Focus<T> = &'a mut for<'b> fn(Carrier<'b>::Focus<i32>); //~ ERROR overflow evaluating associated type
}

fn main() {}
6 changes: 3 additions & 3 deletions tests/ui/associated-inherent-types/issue-111879-0.stderr
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
error: overflow evaluating associated type `Carrier<'b>::Focus<i32>`
--> $DIR/issue-111879-0.rs:11:25
--> $DIR/issue-111879-0.rs:9:25
|
LL | pub type Focus<T> = &'a mut User;
| ^^^^^^^^^^^^
LL | pub type Focus<T> = &'a mut for<'b> fn(Carrier<'b>::Focus<i32>);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error

4 changes: 1 addition & 3 deletions tests/ui/associated-inherent-types/late-bound-regions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@

// Test if we correctly normalize `S<'a>::P` with respect to late-bound regions.

type Function = for<'a> fn(&'a i32) -> S<'a>::P;

struct S<'a>(&'a ());

trait Inter {
Expand All @@ -16,7 +14,7 @@ impl<'a> S<'a> {
}

fn ret_ref_local<'e>() -> &'e i32 {
let f: Function = |x| x;
let f: for<'a> fn(&'a i32) -> S<'a>::P = |x| x;

let local = 0;
f(&local) //~ ERROR cannot return value referencing local variable `local`
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0515]: cannot return value referencing local variable `local`
--> $DIR/late-bound-regions.rs:22:5
--> $DIR/late-bound-regions.rs:20:5
|
LL | f(&local)
| ^^------^
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
// revisions: local alias

#![feature(inherent_associated_types)]
#![allow(incomplete_features)]

Expand All @@ -13,10 +11,7 @@ impl<T> Family<Result<T, ()>> {
type Proj = Self;
}

#[cfg(alias)]
type Alias = Family<Option<()>>::Proj; //[alias]~ ERROR associated type `Proj` not found for `Family<Option<()>>`

fn main() {
#[cfg(local)]
let _: Family<std::path::PathBuf>::Proj = (); //[local]~ ERROR associated type `Proj` not found for `Family<PathBuf>`
let _: Family<Option<()>>::Proj; //~ ERROR associated type `Proj` not found for `Family<Option<()>>`
let _: Family<std::path::PathBuf>::Proj = (); //~ ERROR associated type `Proj` not found for `Family<PathBuf>`
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
error[E0220]: associated type `Proj` not found for `Family<Option<()>>` in the current scope
--> $DIR/not-found-self-type-differs.rs:15:32
|
LL | struct Family<T>(T);
| ---------------- associated item `Proj` not found for this struct
...
LL | let _: Family<Option<()>>::Proj;
| ^^^^ associated item not found in `Family<Option<()>>`
|
= note: the associated type was found for
- `Family<()>`
- `Family<Result<T, ()>>`

error[E0220]: associated type `Proj` not found for `Family<PathBuf>` in the current scope
--> $DIR/not-found-self-type-differs.rs:16:40
|
LL | struct Family<T>(T);
| ---------------- associated item `Proj` not found for this struct
...
LL | let _: Family<std::path::PathBuf>::Proj = ();
| ^^^^ associated item not found in `Family<PathBuf>`
|
= note: the associated type was found for
- `Family<()>`
- `Family<Result<T, ()>>`

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0220`.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ impl<T, S> Subj<(T, S)> {
}

fn main() {
type A = S<()>::P;
let _: S<()>::P;

let _: Subj<(i32, i32)>::Un = 0i32; //~ ERROR mismatched types
}
3 changes: 1 addition & 2 deletions tests/ui/associated-inherent-types/substitute-params.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ impl<T> S<(T,)> {

fn main() {
// Regression test for issue #104240.
type A = S<()>::P;
let _: A = ();
let _: S<()>::P = ();

// Regression test for issue #107468.
let _: S<(i32,)>::Un = 0i32;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// check-pass
// FIXME(inherent_associated_types): This should be `check-pass`
// known-bug: #108491
// compile-flags: --crate-type=lib

#![feature(inherent_associated_types)]
Expand All @@ -17,7 +18,6 @@

pub type Alias<T: Bound> = (Source<T>::Assoc,);


pub struct Source<T>(T);
pub trait Bound {}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
error[E0391]: cycle detected when expanding type alias `Alias`
--> $DIR/type-alias-bounds-are-enforced.rs:19:1
|
LL | pub type Alias<T: Bound> = (Source<T>::Assoc,);
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
note: ...which requires computing the variances of `Source`...
--> $DIR/type-alias-bounds-are-enforced.rs:21:1
|
LL | pub struct Source<T>(T);
| ^^^^^^^^^^^^^^^^^^^^
= note: ...which requires computing the variances for items in this crate...
= note: ...which again requires expanding type alias `Alias`, completing the cycle
note: cycle used when collecting item types in top-level module
--> $DIR/type-alias-bounds-are-enforced.rs:5:1
|
LL | / #![feature(inherent_associated_types)]
LL | | #![allow(incomplete_features)]
LL | |
LL | | // Bounds on the self type play a major role in the resolution of inherent associated types (*).
... |
LL | | pub type Assoc = ();
LL | | }
| |_^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information

error[E0391]: cycle detected when expanding type alias `Alias`
--> $DIR/type-alias-bounds-are-enforced.rs:19:1
|
LL | pub type Alias<T: Bound> = (Source<T>::Assoc,);
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
note: ...which requires computing the variances of `Source`...
--> $DIR/type-alias-bounds-are-enforced.rs:21:1
|
LL | pub struct Source<T>(T);
| ^^^^^^^^^^^^^^^^^^^^
= note: ...which requires computing the variances for items in this crate...
= note: ...which again requires expanding type alias `Alias`, completing the cycle
note: cycle used when collecting item types in top-level module
--> $DIR/type-alias-bounds-are-enforced.rs:5:1
|
LL | / #![feature(inherent_associated_types)]
LL | | #![allow(incomplete_features)]
LL | |
LL | | // Bounds on the self type play a major role in the resolution of inherent associated types (*).
... |
LL | | pub type Assoc = ();
LL | | }
| |_^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0391`.

0 comments on commit 6f5d855

Please sign in to comment.