diff --git a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala index c26da80b0db3..f38a40d6e3a1 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala @@ -782,9 +782,18 @@ trait Implicits { } } - if (context.reporter.hasErrors) - fail("hasMatchingSymbol reported error: " + context.reporter.firstError.get.errMsg) - else if (itree3.isErroneous) + if (context.reporter.hasErrors) { + val msg = context.reporter.firstError.get.errMsg + val isTopLevelWhiteboxMacro = info.sym.isMacro && !isBlackbox(info.sym) && msg.contains("during macro expansion") && context.openImplicits.lengthCompare(1) == 0 + if (isTopLevelWhiteboxMacro) { + val saved = settings.XlogImplicits.value + if (info.sym.isMacro && !isBlackbox(info.sym) && msg.contains("during macro expansion") && context.openImplicits.lengthCompare(1) == 0) settings.XlogImplicits.value = true + try fail("exception typechecking implicit candidate (a whitebox macro): " + msg) + finally settings.XlogImplicits.value = saved + } else { + fail("error typechecking implicit candidate: " + msg) + } + } else if (itree3.isErroneous) fail("error typechecking implicit candidate") else if (isLocalToCallsite && !hasMatchingSymbol(itree2)) fail("candidate implicit %s is shadowed by %s".format( diff --git a/src/compiler/scala/tools/nsc/typechecker/Macros.scala b/src/compiler/scala/tools/nsc/typechecker/Macros.scala index c72d6f570a49..1f05d4c3f26a 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Macros.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Macros.scala @@ -868,7 +868,10 @@ trait Macros extends MacroRuntimes with Traces with Helpers { case ex: AbortMacroException => MacroGeneratedAbort(expandee, ex) case ex: ControlThrowable => throw ex case ex: TypeError => MacroGeneratedTypeError(expandee, ex) - case NonFatal(_) => MacroGeneratedException(expandee, realex) + case NonFatal(_) => + if (typer.context.isSearchingForImplicitParam) + typer.context.openImplicits + MacroGeneratedException(expandee, realex) case fatal => throw fatal } } finally {