diff options
author | Lukas Rytz <lukas.rytz@epfl.ch> | 2011-01-18 15:57:47 +0000 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@epfl.ch> | 2011-01-18 15:57:47 +0000 |
commit | bdd7487b066109bc3dc740b3e14ce2adb0113620 (patch) | |
tree | 526a1220701b3029e2430ef1a78008eda3bdc00e /src/compiler | |
parent | b500a5c78d87052b8eff12f6e3eac472b257d635 (diff) | |
download | scala-bdd7487b066109bc3dc740b3e14ce2adb0113620.tar.gz scala-bdd7487b066109bc3dc740b3e14ce2adb0113620.tar.bz2 scala-bdd7487b066109bc3dc740b3e14ce2adb0113620.zip |
second version of close #3649. no review
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala index 468e2a6b20..b082cd78f5 100644 --- a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala +++ b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala @@ -369,19 +369,23 @@ trait NamesDefaults { self: Analyzer => if (givenArgs.length < params.length) { val (missing, positional) = missingParams(givenArgs, params) if (missing forall (_.hasDefaultFlag)) { - val defaultArgs = missing map (p => { - var default1 = qual match { - case Some(q) => gen.mkAttributedSelect(q.duplicate, defaultGetter(p, context)) - case None => gen.mkAttributedRef(defaultGetter(p, context)) + val defaultArgs = missing flatMap (p => { + val defGetter = defaultGetter(p, context) + if (defGetter == NoSymbol) None // prevent crash in erroneous trees, #3649 + else { + var default1 = qual match { + case Some(q) => gen.mkAttributedSelect(q.duplicate, defGetter) + case None => gen.mkAttributedRef(defGetter) - } - default1 = if (targs.isEmpty) default1 - else TypeApply(default1, targs.map(_.duplicate)) - val default2 = (default1 /: previousArgss)((tree, args) => - Apply(tree, args.map(_.duplicate))) - atPos(pos) { - if (positional) default2 - else AssignOrNamedArg(Ident(p.name), default2) + } + default1 = if (targs.isEmpty) default1 + else TypeApply(default1, targs.map(_.duplicate)) + val default2 = (default1 /: previousArgss)((tree, args) => + Apply(tree, args.map(_.duplicate))) + Some(atPos(pos) { + if (positional) default2 + else AssignOrNamedArg(Ident(p.name), default2) + }) } }) (givenArgs ::: defaultArgs, Nil) |