Skip to content

Conversation

nox213
Copy link
Contributor

@nox213 nox213 commented Sep 12, 2025

closes #23620

If the upper bound of an abstract type is not sealed but is effectively sealed, it is not handled correctly, since classSym could return a type that is not sealed (Object in the issue above).
If the type were not abstract, it would pass the logic that checks whether it is an Or, And, etc., and would be handled properly.
This PR makes exhaustivity checking use the upper bound of abstract types that are effectively sealed.

classSym.is(Case) ||
(tpw.isInstanceOf[TypeRef] && {
val tref = tpw.asInstanceOf[TypeRef]
tref.symbol.isOpaqueAlias && !tref.info.hiBound.isNothingType
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should I extract this logic into a separate function? If so, where would be a good place to put it?

else NoType
}.filter(_.exists)
parts
case tref: TypeRef if tref.symbol.isOpaqueAlias && !tref.info.hiBound.isNothingType =>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

None of this logic should be limited to opaque type aliases. It should work also for abstract type members, or not work for either. From the outside of its scope, an opaque type alias is an abstract type member. It makes no sense to treat them differently in this situation.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

c70aaa3
Is this correct?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems correct to me, as far as that comment is concerned.

I cannot vouch for the whole PR. I am not familiar with pattern-match analysis.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, thank you for the review.

@nox213 nox213 changed the title Enable exhaustivity and reachability checks for opaque types Use upper bound of effectively sealed abstract types in exhaustivity checking Sep 25, 2025
@nox213 nox213 changed the title Use upper bound of effectively sealed abstract types in exhaustivity checking Use upper bound of abstract types in exhaustivity checking Sep 29, 2025
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.

False pattern match not exhaustive for union types + opaque types
4 participants