Skip to content
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 scala.tools.nsc.symtab.Types$$TypeError #3714

Closed
scabug opened this issue Jul 30, 2010 · 12 comments
Closed

Compiler crash with scala.tools.nsc.symtab.Types$$TypeError #3714

scabug opened this issue Jul 30, 2010 · 12 comments
Assignees

Comments

@scabug
Copy link

scabug commented Jul 30, 2010

Given this code:

object CompilerBreak {
  def main(args: Array[String]) {
    val break = BreakImpl(1)
    break match {
      case b: BreakImpl => println("BreakImpl")
      case b => println("Other")
    }
  }
}

trait Break {
  protected val break: Int;
}

case class BreakImpl(protected val break: Int) extends Break

the compiler crashes with:

scala.tools.nsc.symtab.Types$$TypeError: value break$$1 cannot be accessed in BreakImpl
	at scala.tools.nsc.typechecker.Contexts$$Context.error(Contexts.scala:273)
	at scala.tools.nsc.typechecker.Infer$$Inferencer.error(Infer.scala:213)
	at scala.tools.nsc.typechecker.Infer$$Inferencer.errorTree(Infer.scala:217)
	at scala.tools.nsc.typechecker.Infer$$Inferencer.accessError$$1(Infer.scala:255)
	at scala.tools.nsc.typechecker.Infer$$Inferencer.checkAccessible(Infer.scala:272)
	at scala.tools.nsc.typechecker.Typers$$Typer.makeAccessible(Typers.scala:591)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedSelect$$1(Typers.scala:3509)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3985)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:4078)
	at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$typedApply$$1$$1.apply(Typers.scala:3284)
	at scala.tools.nsc.typechecker.Typers$$Typer$$$$anonfun$$typedApply$$1$$1.apply(Typers.scala:3284)
	at scala.tools.nsc.typechecker.Typers$$Typer.silent(Typers.scala:705)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedApply$$1(Typers.scala:3284)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed1(Typers.scala:3924)
	at scala.tools.nsc.typechecker.Typers$$Typer.typed(Typers.scala:4078)
	at scala.tools.nsc.typechecker.Typers$$Typer.transformedOrTyped(Typers.scala:4222)
	at scala.tools.nsc.typechecker.Typers$$Typer.typedValDef(Typers.scala:1562)
	at scala.tools.nsc.matching.Matrix$$MatrixContext$$PatternVar.valDef(Matrix.scala:159)
	at scala.tools.nsc.matching.Matrix$$MatrixContext$$PatternVarGroup$$$$anonfun$$valDefs$$2.apply(Matrix.scala:126)
	at scala.tools.nsc.matching.Matrix$$MatrixContext$$PatternVarGroup$$$$anonfun$$valDefs$$2.apply(Matrix.scala:126)
	at scala.collection.TraversableLike$$$$anonfun$$map$$1.apply(TraversableLike.scala:206)
	at scala.collection.TraversableLike$$$$anonfun$$map$$1.apply(TraversableLike.scala:206)
	at scala.collection.LinearSeqOptimized$$class.foreach(LinearSeqOptimized.scala:61)
	at scala.collection.immutable.List.foreach(List.scala:45)
	at scala.collection.TraversableLike$$class.map(TraversableLike.scala:206)
	at scala.collection.immutable.List.map(List.scala:45)
	at scala.tools.nsc.matching.Matrix$$MatrixContext$$PatternVarGroup.valDefs(Matrix.scala:126)
	at scala.tools.nsc.matching.ParallelMatching$$MatchMatrix$$Scrutinee.allValDefs(ParallelMatching.scala:108)
	at scala.tools.nsc.matching.ParallelMatching$$MatchMatrix$$MixTypes.success(ParallelMatching.scala:644)
	at scala.tools.nsc.matching.ParallelMatching$$MatchMatrix$$RuleApplication.codegen(ParallelMatching.scala:247)
	at scala.tools.nsc.matching.ParallelMatching$$MatchMatrix$$MixTypes.tree(ParallelMatching.scala:650)
	at scala.tools.nsc.matching.ParallelMatching$$MatchMatrix$$Rep.applyRule(ParallelMatching.scala:838)
	at scala.tools.nsc.matching.TransMatcher$$class.handlePattern(TransMatcher.scala:80)
	at scala.tools.nsc.transform.ExplicitOuter.handlePattern(ExplicitOuter.scala:19)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer.matchTranslation(ExplicitOuter.scala:399)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer.transform(ExplicitOuter.scala:488)
	at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:766)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.transform(TypingTransformers.scala:53)
	at scala.tools.nsc.transform.ExplicitOuter$$OuterPathTransformer.transform(ExplicitOuter.scala:239)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer.transform(ExplicitOuter.scala:498)
	at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$5.apply(Trees.scala:750)
	at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$5.apply(Trees.scala:748)
	at scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:864)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.atOwner(TypingTransformers.scala:38)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.atOwner(TypingTransformers.scala:31)
	at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:747)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.transform(TypingTransformers.scala:53)
	at scala.tools.nsc.transform.ExplicitOuter$$OuterPathTransformer.transform(ExplicitOuter.scala:239)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer.transform(ExplicitOuter.scala:457)
	at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:856)
	at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:854)
	at scala.collection.immutable.List.loop$$1(List.scala:115)
	at scala.collection.immutable.List.mapConserve(List.scala:132)
	at scala.tools.nsc.ast.Trees$$Transformer.transformStats(Trees.scala:854)
	at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:764)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.scala$$tools$$nsc$$transform$$TypingTransformers$$TypingTransformer$$$$super$$transform(TypingTransformers.scala:49)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer$$$$anonfun$$transform$$1.apply(TypingTransformers.scala:49)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer$$$$anonfun$$transform$$1.apply(TypingTransformers.scala:49)
	at scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:864)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.atOwner(TypingTransformers.scala:38)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.atOwner(TypingTransformers.scala:31)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.transform(TypingTransformers.scala:49)
	at scala.tools.nsc.transform.ExplicitOuter$$OuterPathTransformer.transform(ExplicitOuter.scala:239)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer.transform(ExplicitOuter.scala:437)
	at scala.tools.nsc.ast.Trees$$Transformer.transformTemplate(Trees.scala:840)
	at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:734)
	at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$2.apply(Trees.scala:733)
	at scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:864)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.atOwner(TypingTransformers.scala:38)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.atOwner(TypingTransformers.scala:31)
	at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:732)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.transform(TypingTransformers.scala:53)
	at scala.tools.nsc.transform.ExplicitOuter$$OuterPathTransformer.transform(ExplicitOuter.scala:239)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer.transform(ExplicitOuter.scala:498)
	at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:856)
	at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transformStats$$1.apply(Trees.scala:854)
	at scala.collection.immutable.List.loop$$1(List.scala:115)
	at scala.collection.immutable.List.mapConserve(List.scala:132)
	at scala.tools.nsc.ast.Trees$$Transformer.transformStats(Trees.scala:854)
	at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$1.apply(Trees.scala:728)
	at scala.tools.nsc.ast.Trees$$Transformer$$$$anonfun$$transform$$1.apply(Trees.scala:728)
	at scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:864)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.atOwner(TypingTransformers.scala:38)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.atOwner(TypingTransformers.scala:31)
	at scala.tools.nsc.ast.Trees$$Transformer.transform(Trees.scala:727)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.scala$$tools$$nsc$$transform$$TypingTransformers$$TypingTransformer$$$$super$$transform(TypingTransformers.scala:49)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer$$$$anonfun$$transform$$2.apply(TypingTransformers.scala:51)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer$$$$anonfun$$transform$$2.apply(TypingTransformers.scala:51)
	at scala.tools.nsc.ast.Trees$$Transformer.atOwner(Trees.scala:864)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.atOwner(TypingTransformers.scala:38)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.atOwner(TypingTransformers.scala:31)
	at scala.tools.nsc.transform.TypingTransformers$$TypingTransformer.transform(TypingTransformers.scala:51)
	at scala.tools.nsc.transform.ExplicitOuter$$OuterPathTransformer.transform(ExplicitOuter.scala:239)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer.transform(ExplicitOuter.scala:498)
	at scala.tools.nsc.ast.Trees$$Transformer.transformUnit(Trees.scala:857)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer.scala$$tools$$nsc$$transform$$ExplicitOuter$$ExplicitOuterTransformer$$$$super$$transformUnit(ExplicitOuter.scala:507)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer$$$$anonfun$$transformUnit$$1.apply(ExplicitOuter.scala:507)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer$$$$anonfun$$transformUnit$$1.apply(ExplicitOuter.scala:507)
	at scala.tools.nsc.symtab.SymbolTable.atPhase(SymbolTable.scala:103)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer.transformUnit(ExplicitOuter.scala:507)
	at scala.tools.nsc.transform.ExplicitOuter$$ExplicitOuterTransformer.transformUnit(ExplicitOuter.scala:302)
	at scala.tools.nsc.transform.Transform$$Phase.apply(Transform.scala:30)
	at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$applyPhase$$1.apply(Global.scala:276)
	at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$applyPhase$$1.apply(Global.scala:276)
	at scala.tools.nsc.reporters.Reporter.withSource(Reporter.scala:48)
	at scala.tools.nsc.Global$$GlobalPhase.applyPhase(Global.scala:276)
	at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$run$$1.apply(Global.scala:252)
	at scala.tools.nsc.Global$$GlobalPhase$$$$anonfun$$run$$1.apply(Global.scala:252)
	at scala.collection.Iterator$$class.foreach(Iterator.scala:631)
	at scala.collection.mutable.ListBuffer$$$$anon$$1.foreach(ListBuffer.scala:304)
	at scala.tools.nsc.Global$$GlobalPhase.run(Global.scala:252)
	at scala.tools.nsc.Global$$Run.compileSources(Global.scala:733)
	at scala.tools.nsc.Global$$Run.compile(Global.scala:813)

Defining the same classes and executing the code using the REPL succeeds. Changing the implementation of BreakImpl to

case class BreakImpl(break2: Int) extends Break {
  override protected val break = break2
}

also seems to compile correctly.

All of this was tested on Scala 2.8.0.final.

@scabug
Copy link
Author

scabug commented Jul 30, 2010

Imported From: https://issues.scala-lang.org/browse/SI-3714?orig=1
Reporter: Chris Conrad (cconrad)

@scabug
Copy link
Author

scabug commented Aug 8, 2010

@lrytz said:
looks like a bug in the pattern matcher.

@scabug
Copy link
Author

scabug commented Sep 29, 2010

@paulp said:
I need to know what we expect to happen with case classes which have members with less than public visibility. Right now scalac goes around it and creates a public accessor. This strikes me as surprising at least.

class A {
  def f(x: Any) = x match {
    case BreakImpl(z) => z
  }
}

case class BreakImpl(private val break: Int) 

object Test {
  def main(args: Array[String]): Unit = {
    println(new A f BreakImpl(55))
  }
}  

% scala Test
55

@scabug
Copy link
Author

scabug commented Sep 29, 2010

@paulp said:
Kicking back to reviewer to try to get that question into the meeting, but it can be reassigned to me.

@scabug
Copy link
Author

scabug commented Oct 12, 2010

@odersky said:
I think we should outlaw private and protected modifiers on case class parameters.

@scabug
Copy link
Author

scabug commented Oct 12, 2010

@paulp said:
Replying to [comment:6 odersky]:

I think we should outlaw private and protected modifiers on case class parameters.

SOOOOOOOOOOOOOOOOOOLD. Always wanted!

@scabug
Copy link
Author

scabug commented Oct 13, 2010

@paulp said:
Replying to [comment:6 odersky]:

I think we should outlaw private and protected modifiers on case class parameters.

OK, so it quickly became clear this was going to make for interesting times. Let's start with this little fellow, because either he nixes the whole deal or the theory will need a few refinements.

final case class ::[B](private var hd: B, private[scala] var tl: List[B]) extends List[B]

@scabug
Copy link
Author

scabug commented Oct 13, 2010

@paulp said:
Thought: this is the motivation we've been waiting for to break down case classes into something more a la carte, and we could work in some accessor control at the same time. Not to mention: we could make it so there wasn't such a huge either/or going between case classes and extractors in terms of match efficiency, exhaustiveness checking, and so on. I'm guessing nobody is too keen to give up any :: performance.

@scabug
Copy link
Author

scabug commented Oct 13, 2010

@paulp said:
I hesitate to even put a toe in this water, but: vars with private setters and public getters are something I'm pretty sure everyone wishes were a lot easier to come by than they are. The boilerplate tax is presently in the triple digits. The case class issues all vanish if we have a simple way to achieve that. :: is welcome to its access restricted vars so long as those restrictions only apply to the setters. "All case class first argument list getters must be public" is just as good, and might even be better.

@scabug
Copy link
Author

scabug commented Oct 17, 2010

@cunei said:
Back to scala_meeting for discussion.

@scabug
Copy link
Author

scabug commented Oct 19, 2010

@odersky said:
OK, back to square one. We need to allow private and protected in case class parameters, so the pattern matcher needs to be able to avoid dereferencing them if it is not permitted. I reassign to you, Paul, for further deliberation.

@scabug
Copy link
Author

scabug commented Oct 26, 2010

@paulp said:
(In r23359) Case accessors are always public else the pattern matcher goes south.
A more discriminating fix may be possible at some point, but it looks
to be an involved endeavor. Closes #3714, review by odersky.

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

No branches or pull requests

2 participants