Skip to content

Generic arguments page doesn't mention how nested generics are represented #2776

@khyperia

Description

@khyperia

Page: https://rustc-dev-guide.rust-lang.org/ty-module/generic-arguments.html

The code snippit in my head as an example:

struct S<T1> {
    f: T1,
}

impl<T1> S<T1> {
    fn func<T2>() {}
}

fn main() {
    S::<u32>::func::<bool>()
}

My question that I want answered by that page: How is S::<u32>::func::<bool> represented? The DefId part of (DefId, GenericArgs) points to fn func(), but is the GenericArgs just [bool] (somehow storing u32 somewhere else), or does it include "parent" generics as well, being [u32, bool]?

I ended up DM'ing @BoxyUwU to ask how this works - turns out it's [u32, bool]. She asked me to open this issue to make the rustc-dev-guide page more clear that GenericArgs is [u32, bool] in this case. A reference to the generics_of query/ty::Generics would be really helpful as well, to answer the question "ok, I have a GenericsArgs list, how do I figure out which arg goes where".

The next page, https://rustc-dev-guide.rust-lang.org/ty-module/param-ty-const-regions.html implies that the answer is [u32, bool], by saying "right, references to generics are based on their flattened index, outermost generics first, inner next". Explicitly saying "hey, GenericArgs is a list of all parent scopes too, [u32, bool]" would make this much easier to understand (trying to understand this next page before realizing that is rough, haha).

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-triageThis issue needs triage to classify its nature and status

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions