summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIulian Dragos <jaguarul@gmail.com>2010-05-20 16:47:11 +0000
committerIulian Dragos <jaguarul@gmail.com>2010-05-20 16:47:11 +0000
commit20919ccb1a571bf0f0251c9c59413c1969d6d359 (patch)
treea44aa68e15843b1092e5d2d69ffb13ac9c0be696
parent6c1a68c847b2126f3e97bf65b539eff34b104a86 (diff)
downloadscala-20919ccb1a571bf0f0251c9c59413c1969d6d359.tar.gz
scala-20919ccb1a571bf0f0251c9c59413c1969d6d359.tar.bz2
scala-20919ccb1a571bf0f0251c9c59413c1969d6d359.zip
Closes #3449. no review.
-rw-r--r--src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala22
-rw-r--r--test/files/pos/spec-multiplectors.scala3
2 files changed, 17 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
index ede742bcf7..b96a8c373f 100644
--- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
+++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala
@@ -1117,8 +1117,12 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
val superRef: Tree = Select(Super(nme.EMPTY.toTypeName, nme.EMPTY.toTypeName), nme.CONSTRUCTOR)
forwardCall(tree.pos, superRef, vparamss)
}
- val tree1 = atPos(symbol.pos)(treeCopy.DefDef(tree, mods, name, tparams, vparamss, tpt, Block(List(t), Literal(()))))
- localTyper.typed(tree1)
+ if (symbol.isPrimaryConstructor) localTyper typed {
+ atPos(symbol.pos)(treeCopy.DefDef(tree, mods, name, tparams, vparamss, tpt, Block(List(t), Literal(()))))
+ } else {
+ // duplicate the original constructor
+ duplicateBody(ddef, info(symbol).target)
+ }
} else info(symbol) match {
case Implementation(target) =>
@@ -1294,19 +1298,21 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
if (info(m).target.isGetterOrSetter) hasSpecializedFields = true
if (m.isClassConstructor) {
val origParamss = parameters(info(m).target)
- assert(origParamss.length == 1) // we are after uncurry
val vparams =
for ((tp, sym) <- m.info.paramTypes zip origParamss(0))
yield m.newValue(sym.pos, specializedName(sym, typeEnv(cls)))
.setInfo(tp)
.setFlag(sym.flags)
+
// param accessors for private members (the others are inherited from the generic class)
- for (param <- vparams if cls.info.nonPrivateMember(param.name) == NoSymbol;
- val acc = param.cloneSymbol(cls).setFlag(PARAMACCESSOR | PRIVATE)) {
- cls.info.decls.enter(acc)
- mbrs += ValDef(acc, EmptyTree).setType(NoType).setPos(m.pos)
- }
+ if (m.isPrimaryConstructor)
+ for (param <- vparams if cls.info.nonPrivateMember(param.name) == NoSymbol;
+ val acc = param.cloneSymbol(cls).setFlag(PARAMACCESSOR | PRIVATE)) {
+ cls.info.decls.enter(acc)
+ mbrs += ValDef(acc, EmptyTree).setType(NoType).setPos(m.pos)
+ }
+
// ctor
mbrs += atPos(m.pos)(DefDef(m, Modifiers(m.flags), List(vparams) map (_ map ValDef), EmptyTree))
} else {
diff --git a/test/files/pos/spec-multiplectors.scala b/test/files/pos/spec-multiplectors.scala
new file mode 100644
index 0000000000..8434a13936
--- /dev/null
+++ b/test/files/pos/spec-multiplectors.scala
@@ -0,0 +1,3 @@
+class Spec[@specialized(Int) A]() {
+ def this(n: Int) = this()
+}