Skip to content

Commit

Permalink
Fix #4803: Remove restriction
Browse files Browse the repository at this point in the history
Allow top-level ~ in and non static inline method:
* Class methods (including inner and anonymous classes)
* Methods in def/val/var
  • Loading branch information
nicolasstucki committed Jul 26, 2018
1 parent 2f85824 commit e11b714
Show file tree
Hide file tree
Showing 12 changed files with 112 additions and 6 deletions.
2 changes: 1 addition & 1 deletion bench/tests/power-macro/PowerMacro.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ object PowerMacro {

def powerCode(n: Long, x: Expr[Double]): Expr[Double] =
if (n == 0) '(1.0)
else if (n % 2 == 0) '{ { val y = ~x * ~x; ~powerCode(n / 2, '(y)) } }
else if (n % 2 == 0) '{ val y = ~x * ~x; ~powerCode(n / 2, '(y)) }
else '{ ~x * ~powerCode(n - 1, x) }

}
2 changes: 0 additions & 2 deletions compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala
Original file line number Diff line number Diff line change
Expand Up @@ -568,8 +568,6 @@ class ReifyQuotes extends MacroTransformWithImplicits {
markDef(tree)
tree.rhs match {
case InlineSplice(_) =>
if (!tree.symbol.isStatic)
ctx.error("Transparent macro method must be a static method.", tree.pos)
mapOverTree(enteredSyms) // Ignore output, only check PCP
cpy.DefDef(tree)(rhs = defaultValue(tree.rhs.tpe))
case _ =>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import scala.quoted._

class Foo {
transparent def foo: Unit = ~Foo.impl // error
transparent def foo: Unit = ~Foo.impl
object Bar {
transparent def foo: Unit = ~Foo.impl // error
transparent def foo: Unit = ~Foo.impl
}
}

object Foo {
class Baz {
transparent def foo: Unit = ~impl // error
transparent def foo: Unit = ~impl
}
object Quox {
transparent def foo: Unit = ~Foo.impl
Expand Down
8 changes: 8 additions & 0 deletions tests/run/i4803.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
1.0
1.5
2.25
7.59375
1.0
1.5
2.25
7.59375
20 changes: 20 additions & 0 deletions tests/run/i4803/App_2.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

class Num2(x: Double) {
inline def power(inline n: Long) = ~PowerMacro.powerCode('(x), n)
}

object Test {
def main(args: Array[String]): Unit = {
val n = new Num(1.5)
println(n.power(0))
println(n.power(1))
println(n.power(2))
println(n.power(5))

val n2 = new Num2(1.5)
println(n.power(0))
println(n.power(1))
println(n.power(2))
println(n.power(5))
}
}
12 changes: 12 additions & 0 deletions tests/run/i4803/Macro_1.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import scala.quoted._

object PowerMacro {
def powerCode(x: Expr[Double], n: Long): Expr[Double] =
if (n == 0) '(1.0)
else if (n % 2 == 0) '{ val y = ~x * ~x; ~powerCode('(y), n / 2) }
else '{ ~x * ~powerCode(x, n - 1) }
}

class Num(x: Double) {
inline def power(inline n: Long) = ~PowerMacro.powerCode('(x), n)
}
4 changes: 4 additions & 0 deletions tests/run/i4803b.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
1.0
1.5
2.25
7.59375
18 changes: 18 additions & 0 deletions tests/run/i4803b/App_2.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@


class Nums {
class Num(x: Double) {
inline def power(inline n: Long) = ~PowerMacro.powerCode('(x), n)
}
}

object Test {
def main(args: Array[String]): Unit = {
val nums = new Nums
val n = new nums.Num(1.5)
println(n.power(0))
println(n.power(1))
println(n.power(2))
println(n.power(5))
}
}
8 changes: 8 additions & 0 deletions tests/run/i4803b/Macro_1.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import scala.quoted._

object PowerMacro {
def powerCode(x: Expr[Double], n: Long): Expr[Double] =
if (n == 0) '(1.0)
else if (n % 2 == 0) '{ val y = ~x * ~x; ~powerCode('(y), n / 2) }
else '{ ~x * ~powerCode(x, n - 1) }
}
8 changes: 8 additions & 0 deletions tests/run/i4803c.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
1.0
1.5
2.25
7.59375
1.0
1.5
2.25
7.59375
22 changes: 22 additions & 0 deletions tests/run/i4803c/App_2.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

object Test {
def main(args: Array[String]): Unit = {
class Num(x: Double) {
inline def power(inline n: Long) = ~PowerMacro.powerCode('(x), n)
}
val n = new Num(1.5)
println(n.power(0))
println(n.power(1))
println(n.power(2))
println(n.power(5))

inline def power(x: Double, inline n: Long) = ~PowerMacro.powerCode('(x), n)

val x: Double = 1.5

println(power(x, 0))
println(power(x, 1))
println(power(x, 2))
println(power(x, 5))
}
}
8 changes: 8 additions & 0 deletions tests/run/i4803c/Macro_1.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import scala.quoted._

object PowerMacro {
def powerCode(x: Expr[Double], n: Long): Expr[Double] =
if (n == 0) '(1.0)
else if (n % 2 == 0) '{ val y = ~x * ~x; ~powerCode('(y), n / 2) }
else '{ ~x * ~powerCode(x, n - 1) }
}

0 comments on commit e11b714

Please sign in to comment.