From d8e6e83b36503952a88071c9a878bb2313f5ffe1 Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Wed, 12 Oct 2022 16:38:38 -0700 Subject: [PATCH] Ignore override type just for whitebox expansion --- .../scala/tools/nsc/typechecker/Namers.scala | 14 +++++++++++++- test/files/neg/t12647.check | 4 ++++ test/files/neg/t12647/Macro_1.scala | 13 +++++++++++++ test/files/neg/t12647/Resolve_2.scala | 13 +++++++++++++ test/files/neg/t12647/Test_3.scala | 7 +++++++ test/files/pos/t12647/Macro_1.scala | 13 +++++++++++++ test/files/pos/t12647/Resolve_2.scala | 13 +++++++++++++ test/files/pos/t12647/Test_3.scala | 7 +++++++ test/files/pos/t12647b/Macro_1.scala | 11 +++++++++++ test/files/pos/t12647b/Resolve_2.scala | 11 +++++++++++ test/files/pos/t12647b/Test_3.scala | 5 +++++ 11 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 test/files/neg/t12647.check create mode 100644 test/files/neg/t12647/Macro_1.scala create mode 100644 test/files/neg/t12647/Resolve_2.scala create mode 100644 test/files/neg/t12647/Test_3.scala create mode 100644 test/files/pos/t12647/Macro_1.scala create mode 100644 test/files/pos/t12647/Resolve_2.scala create mode 100644 test/files/pos/t12647/Test_3.scala create mode 100644 test/files/pos/t12647b/Macro_1.scala create mode 100644 test/files/pos/t12647b/Resolve_2.scala create mode 100644 test/files/pos/t12647b/Test_3.scala diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 89b110ab2ece..f84057e40903 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -1127,7 +1127,19 @@ trait Namers extends MethodSynthesis { case _ => defnTyper.computeType(tree.rhs, pt) } tree.tpt.defineType { - if (currentRun.isScala3 && !pt.isWildcard && pt != NoType && !pt.isErroneous && openMacros.isEmpty) pt + val inferOverridden = currentRun.isScala3 && + !pt.isWildcard && pt != NoType && !pt.isErroneous && { + context.unit.transformed.get(tree.rhs) match { + case Some(t) if t.hasAttachment[MacroExpansionAttachment] => + val xp = macroExpandee(t) + openMacros.isEmpty && ( + xp.symbol == null || + isBlackbox(xp.symbol) + ) + case _ => true + } + } + if (inferOverridden) pt else dropIllegalStarTypes(widenIfNecessary(tree.symbol, rhsTpe, pt)) }.setPos(tree.pos.focus) tree.tpt.tpe diff --git a/test/files/neg/t12647.check b/test/files/neg/t12647.check new file mode 100644 index 000000000000..7b0f04dc8b10 --- /dev/null +++ b/test/files/neg/t12647.check @@ -0,0 +1,4 @@ +Test_3.scala:6: error: value value is not a member of Result + println(resolver.resolve.value) + ^ +1 error diff --git a/test/files/neg/t12647/Macro_1.scala b/test/files/neg/t12647/Macro_1.scala new file mode 100644 index 000000000000..748657682eec --- /dev/null +++ b/test/files/neg/t12647/Macro_1.scala @@ -0,0 +1,13 @@ + +// scalac: -Xsource:3 + +import scala.reflect.macros.blackbox.Context + +trait Result + +object Macros { + def impl(c: Context) = { + import c.universe._ + q"""new Result { def value = "Was this the answer you sought?" }""" + } +} diff --git a/test/files/neg/t12647/Resolve_2.scala b/test/files/neg/t12647/Resolve_2.scala new file mode 100644 index 000000000000..dab65c6a310b --- /dev/null +++ b/test/files/neg/t12647/Resolve_2.scala @@ -0,0 +1,13 @@ + +// scalac: -Xsource:3 + +import language.experimental.macros + +trait Resolver { + def resolve: Result = ??? +} + +class ValueResolver extends Resolver { + override def resolve = valueResult + def valueResult: Result = macro Macros.impl +} diff --git a/test/files/neg/t12647/Test_3.scala b/test/files/neg/t12647/Test_3.scala new file mode 100644 index 000000000000..152e5ddc4aa4 --- /dev/null +++ b/test/files/neg/t12647/Test_3.scala @@ -0,0 +1,7 @@ + +// scalac: -Xsource:3 + +object Test extends App { + val resolver = new ValueResolver + println(resolver.resolve.value) +} diff --git a/test/files/pos/t12647/Macro_1.scala b/test/files/pos/t12647/Macro_1.scala new file mode 100644 index 000000000000..a808e46089a3 --- /dev/null +++ b/test/files/pos/t12647/Macro_1.scala @@ -0,0 +1,13 @@ + +// scalac: -Xsource:3 + +import scala.reflect.macros.whitebox.Context + +trait Result + +object Macros { + def impl(c: Context) = { + import c.universe._ + q"""new Result { def value = "Was this the answer you sought?" }""" + } +} diff --git a/test/files/pos/t12647/Resolve_2.scala b/test/files/pos/t12647/Resolve_2.scala new file mode 100644 index 000000000000..dab65c6a310b --- /dev/null +++ b/test/files/pos/t12647/Resolve_2.scala @@ -0,0 +1,13 @@ + +// scalac: -Xsource:3 + +import language.experimental.macros + +trait Resolver { + def resolve: Result = ??? +} + +class ValueResolver extends Resolver { + override def resolve = valueResult + def valueResult: Result = macro Macros.impl +} diff --git a/test/files/pos/t12647/Test_3.scala b/test/files/pos/t12647/Test_3.scala new file mode 100644 index 000000000000..152e5ddc4aa4 --- /dev/null +++ b/test/files/pos/t12647/Test_3.scala @@ -0,0 +1,7 @@ + +// scalac: -Xsource:3 + +object Test extends App { + val resolver = new ValueResolver + println(resolver.resolve.value) +} diff --git a/test/files/pos/t12647b/Macro_1.scala b/test/files/pos/t12647b/Macro_1.scala new file mode 100644 index 000000000000..e54621c987e4 --- /dev/null +++ b/test/files/pos/t12647b/Macro_1.scala @@ -0,0 +1,11 @@ + +import scala.reflect.macros.whitebox.Context + +trait Result + +object Macros { + def impl(c: Context): c.Tree = { + import c.universe._ + q"""new Result { def value = "Was this the answer you sought?" }""" + } +} diff --git a/test/files/pos/t12647b/Resolve_2.scala b/test/files/pos/t12647b/Resolve_2.scala new file mode 100644 index 000000000000..cbf1457b8635 --- /dev/null +++ b/test/files/pos/t12647b/Resolve_2.scala @@ -0,0 +1,11 @@ + +import language.experimental.macros + +abstract class Resolver { + def resolve: Result = ??? +} + +class ValueResolver extends Resolver { + override def resolve = valueResult + def valueResult: Result = macro Macros.impl +} diff --git a/test/files/pos/t12647b/Test_3.scala b/test/files/pos/t12647b/Test_3.scala new file mode 100644 index 000000000000..16149d9965bc --- /dev/null +++ b/test/files/pos/t12647b/Test_3.scala @@ -0,0 +1,5 @@ + +object Test extends App { + val resolver = new ValueResolver + println(resolver.resolve.value) +}