diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2014-08-06 10:02:00 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2014-08-06 10:02:00 +1000 |
commit | 1f3319c83721401e31642c1515bd9be7c567abc1 (patch) | |
tree | c24897559afb6744233228208ccc0643fde34d6f /test/files | |
parent | 84d4ebc19a1e54dbe446ef35b71efa7ad3890c19 (diff) | |
download | scala-1f3319c83721401e31642c1515bd9be7c567abc1.tar.gz scala-1f3319c83721401e31642c1515bd9be7c567abc1.tar.bz2 scala-1f3319c83721401e31642c1515bd9be7c567abc1.zip |
SI-8781 Avoid double-expansion under -Ymacro-expand:discard
This mode of macro expansion is used by the presentation compiler to
leave the original macro applications ("expandees") in the type
checked trees, annotated with the types of the expansions.
However, under some circumstances involving implicits, we would
re-expand the macro. If the macro wasn't stable, this could lead
to a type mismatch.
The originally reported problem was with the shapeless
`mkSingletonOps` macro. Its expansion had the type of a freshly-named
class local to the expansion. Upon the re-expansion, a new class
was generated, which lead to errors like:
client/Client.scala:4: error: type mismatch;
found : fresh$macro$2
required: fresh$macro$1
This commit suppressed re-expansion of the expandee by use of
the existing, tree attachment driven mechanism.
Diffstat (limited to 'test/files')
-rw-r--r-- | test/files/pos/t8781/Macro_1.scala | 13 | ||||
-rw-r--r-- | test/files/pos/t8781/Test_2.flags | 1 | ||||
-rw-r--r-- | test/files/pos/t8781/Test_2.scala | 5 |
3 files changed, 19 insertions, 0 deletions
diff --git a/test/files/pos/t8781/Macro_1.scala b/test/files/pos/t8781/Macro_1.scala new file mode 100644 index 0000000000..ecd9c5e8d5 --- /dev/null +++ b/test/files/pos/t8781/Macro_1.scala @@ -0,0 +1,13 @@ +import scala.reflect.macros.whitebox.Context +import language.experimental.macros + +object Macros { + def impl(c: Context) = { + import c.universe._ + val name = TypeName(c.freshName()) + q"class $name extends T; new $name" + } + def fresh: Any = macro impl +} + +trait T diff --git a/test/files/pos/t8781/Test_2.flags b/test/files/pos/t8781/Test_2.flags new file mode 100644 index 0000000000..24e2109690 --- /dev/null +++ b/test/files/pos/t8781/Test_2.flags @@ -0,0 +1 @@ +-Ymacro-expand:discard -Ystop-after:typer diff --git a/test/files/pos/t8781/Test_2.scala b/test/files/pos/t8781/Test_2.scala new file mode 100644 index 0000000000..3ca6406599 --- /dev/null +++ b/test/files/pos/t8781/Test_2.scala @@ -0,0 +1,5 @@ +object Test { + implicit class RichT(t: T) { def augmented = "" } + + Macros.fresh.augmented +} |