Skip to content

Better warning for matching values with flexible types in explicit nulls #21577

Closed
@noti0na1

Description

@noti0na1
Member

The code is from discussion in Scala 3.5.0 unreachable case which was working with 3.4.2.

Compiler version

Since 3.5 (after the flexible type was introduced)

Minimized example

-Yexplicit-nulls

def f(s: String) =
  val s2 = s.trim()
  s2 match
    case s3: String => println(1)
    case _ => println(2)

Output Error/Warning message

-- [E030] Match case Unreachable Warning: Stest.scala:1026:7 -------------------
1026 |  case _ => println(2)
     |       ^
     |       Unreachable case
1 warning found

Why this Error/Warning was not helpful

Should produce a better warning similar to without explicit nulls:

-- [E121] Pattern Match Warning: Stest.scala:1026:7 ----------------------------
1026 |  case _ => println(2)
     |       ^
     |Unreachable case except for null (if this is intentional, consider writing case null => instead).
1 warning found

Activity

added
area:reportingError reporting including formatting, implicit suggestions, etc
stat:needs triageEvery issue needs to have an "area" and "itype" label
better-errorsIssues concerned with improving confusing/unhelpful diagnostic messages
good first issuePerfect for someone who wants to get started contributing
on Sep 11, 2024
added
area:private optionsIssues tied to -Y private/internal compiler settings.
and removed
stat:needs triageEvery issue needs to have an "area" and "itype" label
on Sep 12, 2024
ajits089

ajits089 commented on Sep 14, 2024

@ajits089

As per my preliminary investigation what i found is this warning was introduced since 3.0.2. So if we look at the Scala compiler 3.0.0, 3.0.1 and 3.0.2 we receive following response from compiler after defining method f with the given signature and body.
//3.0.2
def f(s: String): Unit -- Warning: 5 | case _ => println(2) | ^ |Unreachable case except for null (if this is intentional, consider writing case null => instead).
// 3.0.1
def f(s: String): Unit 5 | case _ => println(2) | ^ |Unreachable case except for null (if this is intentional, consider writing case null => instead).
//3.0.0
def f(s: String): Unit 5 | case _ => println(2) | ^ | Only null is matched. Consider using case null => instead.

Also, If we consider this case:
def f(s: String | Null) = | val s2 = s.nn.trim() | s2 match | case s3: String => println(1) | case _ => println(2) |
we get warning too where there could be any type involved as the wild card pattern not just null.
1 warning found
def f(s: String | Null): Unit
-- [E121] Pattern Match Warning: -----------------------------------------------
5 | case _ => println(2)
| ^
|Unreachable case except for null (if this is intentional, consider writing case null => instead).

added this to the 3.6.3 milestone on Dec 9, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:nullabilityarea:private optionsIssues tied to -Y private/internal compiler settings.area:reportingError reporting including formatting, implicit suggestions, etcbetter-errorsIssues concerned with improving confusing/unhelpful diagnostic messagesgood first issuePerfect for someone who wants to get started contributingitype:enhancement

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @noti0na1@Gedochao@WojciechMazur@ajits089

        Issue actions

          Better warning for matching values with flexible types in explicit nulls · Issue #21577 · scala/scala3