Fixed bug with dyn_var<T*> requiring T to be completely defined #92
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
BuildIt had a bug with how it handles dyn_var<T*> for recursive types. A very common pattern like the following appears in linked list implementations -
Typically declaring a pointer to a type doesn't require the type to be "complete". However the way dyn_var<T*> is implemented is it tries to create an object of type dyn_var inside to return when the ->/[] operator is called. Now this causes issues because dyn_var requires T to be "complete" since it inherits from T when T is a struct type.
This causes the above sample to fail with compile error.
To fix this we make the extra member of type dyn_var inside dyn_var<T*> be created lazily. We change the member to be of type std::unique_ptr<dyn_var> and allocate it when it is first required.
Sample63 has been added to test this