From ad79d74deef6e624aa7048543207ec97810f07f5 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Mon, 25 Mar 2013 08:53:24 +0100 Subject: SI-7296 Avoid crash with nested 23-param case class The implementation restriction doesn't stop subsequent typechecking in the same compilation unit from triggering type completion which tries to synthesize the unapply method. This commit predicates generation of the unapply method on having 22 or fewer parameters. --- src/compiler/scala/tools/nsc/typechecker/Namers.scala | 4 +++- test/files/neg/t7296.check | 4 ++++ test/files/neg/t7296.scala | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 test/files/neg/t7296.check create mode 100644 test/files/neg/t7296.scala diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index e966cc9060..1f54671ad0 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -1373,7 +1373,9 @@ trait Namers extends MethodSynthesis { if (!cdef.symbol.hasAbstractFlag) namer.enterSyntheticSym(caseModuleApplyMeth(cdef)) - namer.enterSyntheticSym(caseModuleUnapplyMeth(cdef)) + val primaryConstructorArity = treeInfo.firstConstructorArgs(cdef.impl.body).size + if (primaryConstructorArity <= MaxTupleArity) + namer.enterSyntheticSym(caseModuleUnapplyMeth(cdef)) } def addCopyMethod(cdef: ClassDef, namer: Namer) { diff --git a/test/files/neg/t7296.check b/test/files/neg/t7296.check new file mode 100644 index 0000000000..66e8353ee3 --- /dev/null +++ b/test/files/neg/t7296.check @@ -0,0 +1,4 @@ +t7296.scala:5: error: Implementation restriction: case classes cannot have more than 22 parameters. + case class Foo(a: A, b: A, c: A, d: A, e: A, f: A, g: A, h: A, i: A, j: A, k: A, l: A, m: A, n: A, o: A, p: A, q: A, r: A, s: A, t: A, u: A, v: A, w: A, x: A, y: A, Z: A) + ^ +one error found diff --git a/test/files/neg/t7296.scala b/test/files/neg/t7296.scala new file mode 100644 index 0000000000..0c078d3657 --- /dev/null +++ b/test/files/neg/t7296.scala @@ -0,0 +1,6 @@ +object Test { + type A = Int + // Emits the implementation restriction but then proceeds to crash + // when creating the Foo.unapply. + case class Foo(a: A, b: A, c: A, d: A, e: A, f: A, g: A, h: A, i: A, j: A, k: A, l: A, m: A, n: A, o: A, p: A, q: A, r: A, s: A, t: A, u: A, v: A, w: A, x: A, y: A, Z: A) +} -- cgit v1.2.3