Skip to content

Fix MRO shadowing of VariantLikeType.add_classes#331

Merged
alexcrichton merged 1 commit intobytecodealliance:mainfrom
chaynabors:fix-variant-add-classes-mro
Apr 3, 2026
Merged

Fix MRO shadowing of VariantLikeType.add_classes#331
alexcrichton merged 1 commit intobytecodealliance:mainfrom
chaynabors:fix-variant-add-classes-mro

Conversation

@chaynabors
Copy link
Copy Markdown
Contributor

@chaynabors chaynabors commented Apr 2, 2026

VariantLikeType.add_classes is shadowed by ValType.add_classes in the MRO for VariantType, OptionType, and ResultType. ValType defines add_classes as abstract (no-op), and because it comes before VariantLikeType in C3 linearization, the real implementation never runs. This means tagged variants can't be passed as function arguments since add_classes returns an empty set, so the isinstance check in _lower always fails with "value not valid for this variant".

For example, passing a Variant("blah", Record(...)) into an option field always fails because the option's "some" case can't match the value.

The fix makes VariantLikeType inherit from ValType, then drops the now-redundant ValType from classes that get it through VariantLikeType. This puts VariantLikeType.add_classes before ValType.add_classes in the MRO. No other method resolution is affected since convert_to_c and convert_from_c are defined directly on the concrete classes.

@alexcrichton
Copy link
Copy Markdown
Member

Thanks! Would it be possible to add a test for this too?

@chaynabors chaynabors force-pushed the fix-variant-add-classes-mro branch from 84bf6ae to 6f5813a Compare April 3, 2026 17:08
@alexcrichton alexcrichton merged commit 9790bf3 into bytecodealliance:main Apr 3, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants