New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compiler crash with pattern match computing a result that is a specialized type parameter #7100

Closed
scabug opened this Issue Feb 7, 2013 · 7 comments

Comments

Projects
None yet
2 participants
@scabug
Copy link

scabug commented Feb 7, 2013

class Buffer {
  def f[@specialized(Int) T](): T = 0 match {
    case 0 => 0.asInstanceOf[T]
    case 1 => 0.asInstanceOf[T]
  }
}

causes stack overflow in 2.10.0

uncaught exception during compilation: java.lang.StackOverflowError
java.lang.StackOverflowError
	at scala.collection.mutable.FlatHashTable$HashUtils$class.elemHashCode(FlatHashTable.scala:391)
	at scala.collection.mutable.HashSet.elemHashCode(HashSet.scala:41)
	at scala.collection.mutable.FlatHashTable$class.addEntry(FlatHashTable.scala:137)
	at scala.collection.mutable.HashSet.addEntry(HashSet.scala:41)
	at scala.collection.mutable.HashSet.$plus$eq(HashSet.scala:60)
	at scala.tools.nsc.typechecker.Infer$Inferencer.checkAccessible(Infer.scala:311)
	at scala.tools.nsc.typechecker.Typers$Typer.scala$tools$nsc$typechecker$Typers$Typer$$makeAccessible(Typers.scala:598)
	at scala.tools.nsc.typechecker.Typers$Typer.typedIdent$1(Typers.scala:5031)
	at scala.tools.nsc.typechecker.Typers$Typer.typedIdentOrWildcard$1(Typers.scala:5048)
	at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:5379)
	at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:5458)
	at scala.tools.nsc.typechecker.Duplicators$BodyDuplicator.typed(Duplicators.scala:386)
	at scala.tools.nsc.typechecker.Duplicators$BodyDuplicator.typed(Duplicators.scala:352)
	at scala.tools.nsc.typechecker.Typers$Typer.typedPos(Typers.scala:5513)
	at scala.tools.nsc.typechecker.Duplicators$BodyDuplicator.typed(Duplicators.scala:373)
	at scala.tools.nsc.typechecker.Typers$Typer.typedPos(Typers.scala:5513)
	at scala.tools.nsc.typechecker.Duplicators$BodyDuplicator.typed(Duplicators.scala:373)
	at scala.tools.nsc.typechecker.Typers$Typer.typedPos(Typers.scala:5513)

Workaround:
Replacing the pattern matching with equivalent if/else statements will allow it to compile.

@scabug

This comment has been minimized.

Copy link
Author

scabug commented Feb 7, 2013

Imported From: https://issues.scala-lang.org/browse/SI-7100?orig=1
Reporter: @JamesIry
Affected Versions: 2.10.0

@scabug

This comment has been minimized.

Copy link
Author

scabug commented Feb 7, 2013

@JamesIry said:
Regression. Doesn't crash under 2.9.2 or the current 2.9.x branch (soon to be 2.9.3-RC1)

@scabug

This comment has been minimized.

Copy link
Author

scabug commented Feb 7, 2013

Jeff Olson (jdolson) said (edited on Feb 7, 2013 10:15:36 PM UTC):
This is the original code that triggered the bug (just in case the above minimization isn't entirely equivalent):

abstract class Buffer {
  def getByte(): Byte 
  def getShort(): Short
  def getInt(): Int  
  def getLong(): Long 

  def getEncoded[@specialized(Byte, Short, Int, Long) T](): T = {
    val id = getByte()
    id match {
      case 0 => getByte().asInstanceOf[T]
      case 1 => getShort().asInstanceOf[T]
      case 2 => getInt().asInstanceOf[T]
      case 3 => getLong().asInstanceOf[T]
    }
  }
}
@scabug

This comment has been minimized.

Copy link
Author

scabug commented Feb 7, 2013

@JamesIry said:
Replacing with if/else allows it to compile

class Buffer {
  def f[@specialized(Int) T](): T = 
    if (0 == 0) 0.asInstanceOf[T] 
    else if (1 == 0) 0.asInstanceOf[T] 
    else ???
}
@scabug

This comment has been minimized.

Copy link
Author

scabug commented Feb 7, 2013

@JamesIry said:
Under -Xoldpatmat it's still broken

@scabug

This comment has been minimized.

Copy link
Author

scabug commented Feb 7, 2013

@JamesIry said:
Not casting related per se, this also doesn't work whereas just returning x without pattern matching is fine.

class Buffer {
  def f[@specialized(Int) T](): T = {
    var x: T = 0.asInstanceOf[T]
    0 match {
      case 0 => x
      case 1 => x
    } 
  }
}
@scabug

This comment has been minimized.

Copy link
Author

scabug commented Feb 7, 2013

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment