Is there a workaround that would allow me to do this? I did notice that using references in foo do not trigger the drop check overflow, but I can't implement a builder pattern without owned values.
If possible, I would also like to understand a little better why this type is problematic when it is conceptually just as infinite as a recursing enum with no trait constraints.
Is it a limitation of rust's design or a bad idea on my part? It is often hard to distinguish the two
You could comment here or open a new issue since your use case does not unconditionally introduce a type of infinite length. (No need for recursion to bottom out; I think it just needs to be able to normalize.)
Probably only a context with a normalized type could pull the inner tree out. So a builder pattern where a separate builder holds the ManuallyDrop<_> would still probably not be complete (you couldn't have a fully generic finalize(self) -> Tree<T> method.
(Higher-level workaround: use the &mut self builder pattern instead.)