Skip to content

Null guards not generated for all control flow paths #3939

@WojciechMazur

Description

@WojciechMazur

Reproducer based on scala-java-time

trait TemporalAccessor {
  def isSupported(field: TemporalField): Boolean
  def range(field: TemporalField): ValueRange
}

final class Month extends TemporalAccessor {
  override def isSupported(field: TemporalField): Boolean = field.## == 0
  override def range(field: TemporalField): ValueRange =
    if (field eq ChronoField.MONTH_OF_YEAR) field.range
    else field.rangeRefinedBy(this)
}
object Month {
  lazy val JANUARY = new Month()
}

trait TemporalField {
  def range: ValueRange
  def rangeRefinedBy(temporal: TemporalAccessor): ValueRange
}
final class ValueRange

final class ChronoField extends TemporalField {
  def range: ValueRange = new ValueRange()
  def rangeRefinedBy(temporal: TemporalAccessor): ValueRange = new ValueRange()
}
object ChronoField {
  lazy val MONTH_OF_YEAR = new ChronoField()
}

object JulianFields {
  lazy val JULIAN_DAY: TemporalField = new Field()
  private final class Field extends TemporalField {
    override def range: ValueRange = new ValueRange()
    override def rangeRefinedBy(temporal: TemporalAccessor): ValueRange =
      new ValueRange()
  }
}

import util.Try

object Test {
  def main(args: Array[String]): Unit = {
    val sample = Month.JANUARY
    val field = JulianFields.JULIAN_DAY
    assert(Try(sample.range(field)).isSuccess)
    assert(
      Try(sample.range(null)).failed.toOption
        .exists(_.isInstanceOf[NullPointerException])
    )
  }
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions