Make sure to always ACCEPT the enum elements. #869
Merged
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.
As shown in RT#129160 if we try to use an enumeration element as a type
for an optional parameter like in the following example we end up with a
type mismatch between Int:D and Foo.
To actually understand what goes wrong we simply have to look at the
backtrace: the ACCEPT method that the binder calls is the one from the
Numeric role (since enums have Int as base type by default) which in
turn calls the infix:<==> operator which in turn calls Bridge.
This is where things go south as we actually fail to bind a (Option)
type object to a Int:D, causing the error shown in the bug report.
The solution is to simply catch this edge case and let the base type
handle all the other ones in a similar manner to what we already do for
Bool.
Some additional tests to show how the enum behave, compared with Bool