Skip to content

Commit

Permalink
Ignore override type just for whitebox expansion
Browse files Browse the repository at this point in the history
  • Loading branch information
som-snytt committed Oct 13, 2022
1 parent ee7f5fa commit d8e6e83
Show file tree
Hide file tree
Showing 11 changed files with 110 additions and 1 deletion.
14 changes: 13 additions & 1 deletion src/compiler/scala/tools/nsc/typechecker/Namers.scala
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions 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
13 changes: 13 additions & 0 deletions 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?" }"""
}
}
13 changes: 13 additions & 0 deletions 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
}
7 changes: 7 additions & 0 deletions 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)
}
13 changes: 13 additions & 0 deletions 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?" }"""
}
}
13 changes: 13 additions & 0 deletions 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
}
7 changes: 7 additions & 0 deletions 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)
}
11 changes: 11 additions & 0 deletions 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?" }"""
}
}
11 changes: 11 additions & 0 deletions 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
}
5 changes: 5 additions & 0 deletions test/files/pos/t12647b/Test_3.scala
@@ -0,0 +1,5 @@

object Test extends App {
val resolver = new ValueResolver
println(resolver.resolve.value)
}

0 comments on commit d8e6e83

Please sign in to comment.