diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2014-01-19 23:00:09 +0300 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2014-01-20 09:48:12 +0300 |
commit | 936d60a2621088ba463a44c2f2d6450986022169 (patch) | |
tree | 4137839890784150dfc2f18c308ed1ae33a10a42 /test/files/neg/t8158/Macros_1.scala | |
parent | 6a6b485fe98890f73a03753e3981be5fa580ed02 (diff) | |
download | scala-936d60a2621088ba463a44c2f2d6450986022169.tar.gz scala-936d60a2621088ba463a44c2f2d6450986022169.tar.bz2 scala-936d60a2621088ba463a44c2f2d6450986022169.zip |
SI-8158 compiler hangs printing out fancy types
Apparently, even though the compiler has safeguards against infinite type
printouts, having a depth counter, we didn’t account for the cases when
printouts are both self-referential and self-multiplying.
For one, SI-8158 provides an example of such a type, which is a structural
type that refers to itself twice in return types of its methods. At first,
printing such a type would go deeper and deeper, but then it will hit
the depth limit and start multiply indefinitely.
This commit fixes this particular problem by recognizing self-references
as this.type’s and printing them out as such. The subsequent commit will
introduce a more general facility.
Diffstat (limited to 'test/files/neg/t8158/Macros_1.scala')
-rw-r--r-- | test/files/neg/t8158/Macros_1.scala | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/test/files/neg/t8158/Macros_1.scala b/test/files/neg/t8158/Macros_1.scala new file mode 100644 index 0000000000..b84e3ed8d3 --- /dev/null +++ b/test/files/neg/t8158/Macros_1.scala @@ -0,0 +1,34 @@ +import scala.language.experimental.macros +import scala.reflect.macros.whitebox.Context + +object Max { + def impl(c: Context)(any: c.Expr[Any]): c.Expr[Any] = { + import c.universe._ + def fail(msg: String) = c.abort(c.enclosingPosition, msg) + val t = c.macroApplication match { + case q"$_.unapply($unargs)" => + /* hangs + */ + q""" + new { + def isEmpty = false + def get = this + def unapply(x: String) = this + }.unapply($unargs) + """ + /* + if get returns Unit or Boolean: + wrong number of patterns for <$anon: AnyRef> offering Unit: expected 1, found 0 + */ + /* straightforward + q""" + new { + def unapply(x: String) = true + }.unapply($unargs) + """ + */ + case _ => fail("bad appl") + } + c.Expr[Any](t) + } +}
\ No newline at end of file |