Skip to content

No match exhaustivity warning emitted when selector is nullable and null case isn't handled #23790

@SuperCl4sh

Description

@SuperCl4sh

Compiler version

3.7.2

Minimized code

@main def test() = {
  val a: String = null
  a match {
    case b: String =>
  }
}

Scastie link: https://scastie.scala-lang.org/QeOE1XybSBGgSk3VWp0M0w

Output

No warnings are emitted, but a match error is correctly thrown at runtime:

scala.MatchError: null
	at main$package$.test(main.scala:6)
	at test.main(main.scala:1)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at sbt.Run.invokeMain(Run.scala:144)
	at sbt.Run.execute$1(Run.scala:94)
	at sbt.Run.$anonfun$runWithLoader$5(Run.scala:121)
	at sbt.Run$.executeSuccess(Run.scala:187)
	at sbt.Run.runWithLoader(Run.scala:121)
	at sbt.Run.run(Run.scala:128)
	at com.olegych.scastie.sbtscastie.SbtScastiePlugin$$anon$1.$anonfun$run$1(SbtScastiePlugin.scala:38)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
	at sbt.util.InterfaceUtil$$anon$1.get(InterfaceUtil.scala:32)
	at sbt.ScastieTrapExit$App.run(ScastieTrapExit.scala:258)
	at java.base/java.lang.Thread.run(Thread.java:840)

Expectation

An exhaustivity warning should be emitted. The exhaustivity warning is correctly emitted when -Yexplicit-nulls is used and a is changed to have type String | Null.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions