Skip to content

Avoid case of a self-referential type alias.#2109

Merged
emilio merged 1 commit intorust-lang:masterfrom
adetaylor:bug-2102-2
Oct 27, 2021
Merged

Avoid case of a self-referential type alias.#2109
emilio merged 1 commit intorust-lang:masterfrom
adetaylor:bug-2102-2

Conversation

@adetaylor
Copy link
Copy Markdown
Contributor

@adetaylor adetaylor commented Oct 19, 2021

This previously produced a type alias which referred to itself,
which was clearly wrong and resulted in downstream code recursing
infinitely.

The problem case (per bug #2102) is:

  template <typename> class B{};
  template <typename c> class C {
  public:
    using U = B<c>;
  };
  class A : C<A> {
    U u;
  };

As far as I can tell, we parse clang's definition of B<A>; that leads
us to parse A; to find it has a field U which turns out to be of type
B<A>. And so we hit the line in item.rs which says:

  debug!("Avoiding recursion parsing type: {:?}", ty);

and bail out, returning the original item ID: hence, a self-
referential typedef is created.

The 'fix' in this PR creates an opaque type in this case instead,
to avoid later infinite loops. It would be preferable to avoid this
situation in the first place, but presumably that would require
us to split the parsing phase into two:

  1. types
  2. fields within those types.

Fixes #2102 (partially).

This previously produced a type alias which referred to itself,
which was clearly wrong and resulted in downstream code recursing
infinitely.

The problem case (per bug rust-lang#2102) is:

  template <typename> class B{};
  template <typename c> class C {
  public:
    using U = B<c>;
  };
  class A : C<A> {
    U u;
  };

As far as I can tell, we parse clang's definition of B<A>; that leads
us to parse A; to find it has a field U which turns out to be of type
B<A>. And so we hit the line in item.rs which says:
  debug!("Avoiding recursion parsing type: {:?}", ty);
and bail out, returning the original item ID: hence, a self-
referential typedef is created.

The 'fix' in this PR creates an opaque type in this case instead,
to avoid later infinite loops. It would be preferable to avoid this
situation in the first place, but presumably that would require
us to split the parsing phase into two:
1) types
2) fields within those types.

Fixes rust-lang#2102.
@highfive
Copy link
Copy Markdown

warning Warning warning

  • These commits modify unsafe code. Please review it carefully!

Copy link
Copy Markdown
Contributor

@emilio emilio left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C++ templates always break my head. Looks good to me, thanks!

@emilio emilio merged commit da3f3a3 into rust-lang:master Oct 27, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack overflow in ir::item::Item::is_constified_enum_module

3 participants