diff options
author | Adrian Taylor <ade@hohum.me.uk> | 2021-10-03 09:35:10 -0700 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2021-10-27 19:23:31 +0200 |
commit | da3f3a3ab13fb335b525d74a38e6a8634a117fe5 (patch) | |
tree | 818c72154e1969c1f093fa06e00b831e87830449 /tests/headers/constified-enum-module-overflow.hpp | |
parent | 57853405463dd985dd49a2f14fb78bbf3595b1df (diff) |
Avoid case of a self-referential type alias.
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.
Diffstat (limited to 'tests/headers/constified-enum-module-overflow.hpp')
-rw-r--r-- | tests/headers/constified-enum-module-overflow.hpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/tests/headers/constified-enum-module-overflow.hpp b/tests/headers/constified-enum-module-overflow.hpp new file mode 100644 index 00000000..d48f2be1 --- /dev/null +++ b/tests/headers/constified-enum-module-overflow.hpp @@ -0,0 +1,8 @@ +template <typename> class B{}; +template <typename c> class C { +public: + using U = B<c>; +}; +class A : C<A> { + U u; +}; |