From b3a0cc693c2f8449dd3549dab3537387c4bd41c2 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Thu, 25 Nov 2021 13:28:19 +0100 Subject: [PATCH] Show inlined positions with source code This gives more context to the users on what happen and where the code came from. --- .../dotc/reporting/MessageRendering.scala | 22 +-- .../dotty/tools/dotc/transform/Splicer.scala | 2 +- .../src/dotty/tools/dotc/typer/Inliner.scala | 2 +- compiler/test-resources/repl/i9227 | 4 +- tests/neg-macros/delegate-match-1.check | 4 +- tests/neg-macros/delegate-match-2.check | 4 +- tests/neg-macros/delegate-match-3.check | 4 +- tests/neg-macros/i11386.check | 16 ++- tests/neg-macros/i13991.check | 11 ++ tests/neg-macros/i13991/Macro_1.scala | 10 ++ tests/neg-macros/i13991/Test_2.scala | 6 + tests/neg-macros/i6432.check | 12 +- tests/neg-macros/i6432b.check | 12 +- tests/neg-macros/i6976.check | 4 +- tests/neg-macros/i9014.check | 4 +- tests/neg-macros/ill-abort.check | 4 +- .../neg-macros/macro-class-not-found-1.check | 4 +- .../neg-macros/macro-class-not-found-2.check | 4 +- .../neg-macros/macros-in-same-project-6.check | 4 +- tests/neg/cannot-reduce-inline-match.check | 6 +- tests/neg/i11225.check | 4 +- tests/neg/i13044.check | 128 +++++++++++++----- tests/neg/i13570.check | 7 +- tests/neg/i13991.check | 10 ++ tests/neg/i13991.scala | 8 ++ tests/neg/inline-error-pos.check | 5 +- tests/neg/summonInline.check | 8 +- 27 files changed, 239 insertions(+), 70 deletions(-) create mode 100644 tests/neg-macros/i13991.check create mode 100644 tests/neg-macros/i13991/Macro_1.scala create mode 100644 tests/neg-macros/i13991/Test_2.scala create mode 100644 tests/neg/i13991.check create mode 100644 tests/neg/i13991.scala mode change 100755 => 100644 tests/neg/summonInline.check diff --git a/compiler/src/dotty/tools/dotc/reporting/MessageRendering.scala b/compiler/src/dotty/tools/dotc/reporting/MessageRendering.scala index f5b566f3ba60..f7661098b893 100644 --- a/compiler/src/dotty/tools/dotc/reporting/MessageRendering.scala +++ b/compiler/src/dotty/tools/dotc/reporting/MessageRendering.scala @@ -25,15 +25,9 @@ trait MessageRendering { def stripColor(str: String): String = str.replaceAll("\u001b\\[.*?m", "") - /** When inlining a method call, if there's an error we'd like to get the - * outer context and the `pos` at which the call was inlined. - * - * @return a list of strings with inline locations - */ - def outer(pos: SourcePosition, prefix: String)(using Context): List[String] = - if (pos.outer.exists) - i"$prefix| This location contains code that was inlined from $pos" :: - outer(pos.outer, prefix) + /** List of all the inline calls that surround the position */ + def inlinePosStack(pos: SourcePosition): List[SourcePosition] = + if pos.outer.exists then pos :: inlinePosStack(pos.outer) else Nil /** Get the sourcelines before and after the position, as well as the offset @@ -173,10 +167,18 @@ trait MessageRendering { if (pos.exists) { val pos1 = pos.nonInlined if (pos1.exists && pos1.source.file.exists) { + // Print error message at inline position val (srcBefore, srcAfter, offset) = sourceLines(pos1, levelString) val marker = columnMarker(pos1, offset, levelString) val err = errorMsg(pos1, msg.message, offset) - sb.append((srcBefore ::: marker :: err :: outer(pos, " " * (offset - 1)) ::: srcAfter).mkString(EOL)) + sb.append((srcBefore ::: marker :: err :: srcAfter).mkString(EOL)) + // print inline stack trace + for inlinedPos <- inlinePosStack(pos) do + val (srcBefore, srcAfter, offset) = sourceLines(inlinedPos, levelString) + val marker = columnMarker(inlinedPos, offset, levelString) + val prefix = " " * (offset - 1) + sb.append((i"\nThis location contains code that was inlined from $pos" :: srcBefore ::: marker :: srcAfter).mkString(EOL)) + } else sb.append(msg.message) } diff --git a/compiler/src/dotty/tools/dotc/transform/Splicer.scala b/compiler/src/dotty/tools/dotc/transform/Splicer.scala index 49b6f5564620..dcd5b8d8c4b5 100644 --- a/compiler/src/dotty/tools/dotc/transform/Splicer.scala +++ b/compiler/src/dotty/tools/dotc/transform/Splicer.scala @@ -49,7 +49,7 @@ object Splicer { val oldContextClassLoader = Thread.currentThread().getContextClassLoader Thread.currentThread().setContextClassLoader(classLoader) try { - val interpreter = new Interpreter(spliceExpansionPos, classLoader) + val interpreter = new Interpreter(splicePos, classLoader) // Some parts of the macro are evaluated during the unpickling performed in quotedExprToTree val interpretedExpr = interpreter.interpret[Quotes => scala.quoted.Expr[Any]](tree) diff --git a/compiler/src/dotty/tools/dotc/typer/Inliner.scala b/compiler/src/dotty/tools/dotc/typer/Inliner.scala index 722e3abfec85..c99ccbd24428 100644 --- a/compiler/src/dotty/tools/dotc/typer/Inliner.scala +++ b/compiler/src/dotty/tools/dotc/typer/Inliner.scala @@ -853,7 +853,7 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(using Context) { evidence.tpe match case fail: Implicits.SearchFailureType => val msg = evTyper.missingArgMsg(evidence, tpt.tpe, "") - errorTree(tpt, em"$msg") + errorTree(call, em"$msg") case _ => evidence return searchImplicit(callTypeArgs.head) diff --git a/compiler/test-resources/repl/i9227 b/compiler/test-resources/repl/i9227 index 45d1731dae39..02f80be7a44e 100644 --- a/compiler/test-resources/repl/i9227 +++ b/compiler/test-resources/repl/i9227 @@ -3,5 +3,7 @@ scala> import scala.quoted._; inline def myMacro[T]: Unit = ${ myMacroImpl[T] }; 1 | import scala.quoted._; inline def myMacro[T]: Unit = ${ myMacroImpl[T] }; def myMacroImpl[T](using Quotes): Expr[Unit] = '{}; println(myMacro[Int]) | ^^^^^^^^^^^^ | Cannot call macro method myMacroImpl defined in the same source file - | This location contains code that was inlined from rs$line$1:1 +This location contains code that was inlined from rs$line$1:1 +1 | import scala.quoted._; inline def myMacro[T]: Unit = ${ myMacroImpl[T] }; def myMacroImpl[T](using Quotes): Expr[Unit] = '{}; println(myMacro[Int]) + | ^^^^^^^^^^^^ 1 error found diff --git a/tests/neg-macros/delegate-match-1.check b/tests/neg-macros/delegate-match-1.check index 6d88d021416f..db6c55d1e3f6 100644 --- a/tests/neg-macros/delegate-match-1.check +++ b/tests/neg-macros/delegate-match-1.check @@ -4,4 +4,6 @@ | ^ | AmbiguousImplicits | both value a1 in class Test1 and value a2 in class Test1 match type A - | This location contains code that was inlined from Test_2.scala:6 +This location contains code that was inlined from Test_2.scala:6 +6 | f // error + | ^ diff --git a/tests/neg-macros/delegate-match-2.check b/tests/neg-macros/delegate-match-2.check index 112e5ee00474..e6d2ede601e2 100644 --- a/tests/neg-macros/delegate-match-2.check +++ b/tests/neg-macros/delegate-match-2.check @@ -4,4 +4,6 @@ | ^ | DivergingImplicit | method a1 in class Test produces a diverging implicit search when trying to match type A - | This location contains code that was inlined from Test_2.scala:5 +This location contains code that was inlined from Test_2.scala:5 +5 | f // error + | ^ diff --git a/tests/neg-macros/delegate-match-3.check b/tests/neg-macros/delegate-match-3.check index 278aa92a4117..4a2424ecf515 100644 --- a/tests/neg-macros/delegate-match-3.check +++ b/tests/neg-macros/delegate-match-3.check @@ -4,4 +4,6 @@ | ^ | NoMatchingImplicits | no implicit values were found that match type A - | This location contains code that was inlined from Test_2.scala:3 +This location contains code that was inlined from Test_2.scala:3 +3 | f // error + | ^ diff --git a/tests/neg-macros/i11386.check b/tests/neg-macros/i11386.check index 0377ca6389db..df094716a969 100644 --- a/tests/neg-macros/i11386.check +++ b/tests/neg-macros/i11386.check @@ -3,11 +3,19 @@ 6 | dummy(0) // error | ^ | test - | This location contains code that was inlined from Test_2.scala:6 - | This location contains code that was inlined from Macro_1.scala:7 +This location contains code that was inlined from Test_2.scala:6 +6 | dummy(0) // error + | ^ +This location contains code that was inlined from Test_2.scala:6 +7 | notNull(i) + | ^^^^^^^^^^ -- Error: tests/neg-macros/i11386/Test_2.scala:8:20 -------------------------------------------------------------------- 8 | dummy(int2String(0)) // error | ^^^^^^^^^^^^^ | test - | This location contains code that was inlined from Test_2.scala:8 - | This location contains code that was inlined from Macro_1.scala:7 +This location contains code that was inlined from Test_2.scala:8 +8 | dummy(int2String(0)) // error + | ^^^^^^^^^^^^^ +This location contains code that was inlined from Test_2.scala:8 +7 | notNull(i) + | ^^^^^^^^^^ diff --git a/tests/neg-macros/i13991.check b/tests/neg-macros/i13991.check new file mode 100644 index 000000000000..27ac41cd8df2 --- /dev/null +++ b/tests/neg-macros/i13991.check @@ -0,0 +1,11 @@ + +-- Error: tests/neg-macros/i13991/Test_2.scala:6:5 --------------------------------------------------------------------- +6 | v2 // error + | ^^ + | Error +This location contains code that was inlined from Test_2.scala:3 +3 | inline def v2 = InlineMac.sample("foo") + | ^^^^^ +This location contains code that was inlined from Test_2.scala:3 +3 | inline def v2 = InlineMac.sample("foo") + | ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/neg-macros/i13991/Macro_1.scala b/tests/neg-macros/i13991/Macro_1.scala new file mode 100644 index 000000000000..76cfa93cdde5 --- /dev/null +++ b/tests/neg-macros/i13991/Macro_1.scala @@ -0,0 +1,10 @@ +import scala.quoted.* + +object InlineMac: + + inline def sample(inline expr: String): Int = + ${ sampleImpl('expr) } + + def sampleImpl(expr: Expr[String])(using Quotes): Expr[Int] = + import quotes.reflect.* + report.errorAndAbort("Error", expr) diff --git a/tests/neg-macros/i13991/Test_2.scala b/tests/neg-macros/i13991/Test_2.scala new file mode 100644 index 000000000000..572ad324b129 --- /dev/null +++ b/tests/neg-macros/i13991/Test_2.scala @@ -0,0 +1,6 @@ +object Main: + def main(args: Array[String]): Unit = + inline def v2 = InlineMac.sample("foo") + inline def v1 = v2 + + v2 // error diff --git a/tests/neg-macros/i6432.check b/tests/neg-macros/i6432.check index 0e01f99be404..44c746e52642 100644 --- a/tests/neg-macros/i6432.check +++ b/tests/neg-macros/i6432.check @@ -3,14 +3,20 @@ 4 | foo"abc${"123"}xyz${"456"}fgh" // error // error // error | ^^^ | abc - | This location contains code that was inlined from Test_2.scala:4 +This location contains code that was inlined from Test_2.scala:4 +4 | foo"abc${"123"}xyz${"456"}fgh" // error // error // error + | ^^^ -- Error: tests/neg-macros/i6432/Test_2.scala:4:17 --------------------------------------------------------------------- 4 | foo"abc${"123"}xyz${"456"}fgh" // error // error // error | ^^^ | xyz - | This location contains code that was inlined from Test_2.scala:4 +This location contains code that was inlined from Test_2.scala:4 +4 | foo"abc${"123"}xyz${"456"}fgh" // error // error // error + | ^^^ -- Error: tests/neg-macros/i6432/Test_2.scala:4:28 --------------------------------------------------------------------- 4 | foo"abc${"123"}xyz${"456"}fgh" // error // error // error | ^^^ | fgh - | This location contains code that was inlined from Test_2.scala:4 +This location contains code that was inlined from Test_2.scala:4 +4 | foo"abc${"123"}xyz${"456"}fgh" // error // error // error + | ^^^ diff --git a/tests/neg-macros/i6432b.check b/tests/neg-macros/i6432b.check index 4dd1be84fa3c..ad55980ecf01 100644 --- a/tests/neg-macros/i6432b.check +++ b/tests/neg-macros/i6432b.check @@ -3,14 +3,20 @@ 4 | foo"""abc${"123"}xyz${"456"}fgh""" // error // error // error | ^^^ | abc - | This location contains code that was inlined from Test_2.scala:4 +This location contains code that was inlined from Test_2.scala:4 +4 | foo"""abc${"123"}xyz${"456"}fgh""" // error // error // error + | ^^^ -- Error: tests/neg-macros/i6432b/Test_2.scala:4:19 -------------------------------------------------------------------- 4 | foo"""abc${"123"}xyz${"456"}fgh""" // error // error // error | ^^^ | xyz - | This location contains code that was inlined from Test_2.scala:4 +This location contains code that was inlined from Test_2.scala:4 +4 | foo"""abc${"123"}xyz${"456"}fgh""" // error // error // error + | ^^^ -- Error: tests/neg-macros/i6432b/Test_2.scala:4:30 -------------------------------------------------------------------- 4 | foo"""abc${"123"}xyz${"456"}fgh""" // error // error // error | ^^^ | fgh - | This location contains code that was inlined from Test_2.scala:4 +This location contains code that was inlined from Test_2.scala:4 +4 | foo"""abc${"123"}xyz${"456"}fgh""" // error // error // error + | ^^^ diff --git a/tests/neg-macros/i6976.check b/tests/neg-macros/i6976.check index 2057e55550b4..39062bf01411 100644 --- a/tests/neg-macros/i6976.check +++ b/tests/neg-macros/i6976.check @@ -6,4 +6,6 @@ | scala.MatchError: Inlined(EmptyTree,List(),Literal(Constant(2))) (of class dotty.tools.dotc.ast.Trees$Inlined) | at playground.macros$.mcrImpl(Macro_1.scala:10) | - | This location contains code that was inlined from Test_2.scala:5 +This location contains code that was inlined from Macro_1.scala:6 +6 | inline def mcr(x: => Any) = ${mcrImpl('x)} + | ^^^^^^^^^^^^^^ diff --git a/tests/neg-macros/i9014.check b/tests/neg-macros/i9014.check index 509eac067fc8..4779a8a5a1e2 100644 --- a/tests/neg-macros/i9014.check +++ b/tests/neg-macros/i9014.check @@ -3,4 +3,6 @@ 1 |val tests = summon[Bar] // error | ^ | Failed to expand! - | This location contains code that was inlined from Test_2.scala:1 +This location contains code that was inlined from Test_2.scala:1 +1 |val tests = summon[Bar] // error + | ^ diff --git a/tests/neg-macros/ill-abort.check b/tests/neg-macros/ill-abort.check index 25d7654b1b69..17abfccbb39f 100644 --- a/tests/neg-macros/ill-abort.check +++ b/tests/neg-macros/ill-abort.check @@ -3,4 +3,6 @@ 1 |def test = fail() // error | ^^^^^^ |Macro expansion was aborted by the macro without any errors reported. Macros should issue errors to end-users to facilitate debugging when aborting a macro expansion. - | This location contains code that was inlined from quoted_1.scala:3 +This location contains code that was inlined from quoted_1.scala:3 +3 |inline def fail(): Unit = ${ impl } + | ^^^^^^^^^ diff --git a/tests/neg-macros/macro-class-not-found-1.check b/tests/neg-macros/macro-class-not-found-1.check index 445523c6ade2..ea27cb073dfc 100644 --- a/tests/neg-macros/macro-class-not-found-1.check +++ b/tests/neg-macros/macro-class-not-found-1.check @@ -5,4 +5,6 @@ | java.lang.NoClassDefFoundError | at Foo$.aMacroImplementation(Foo.scala:8) | - | This location contains code that was inlined from Bar.scala:4 +This location contains code that was inlined from Foo.scala:5 +5 | inline def myMacro(): Unit = ${ aMacroImplementation } + | ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/neg-macros/macro-class-not-found-2.check b/tests/neg-macros/macro-class-not-found-2.check index 3cb7506e6bb2..7323d62036f8 100644 --- a/tests/neg-macros/macro-class-not-found-2.check +++ b/tests/neg-macros/macro-class-not-found-2.check @@ -5,4 +5,6 @@ | java.lang.NoClassDefFoundError: this.is.not.a.Class | at Foo$.aMacroImplementation(Foo.scala:8) | - | This location contains code that was inlined from Bar.scala:4 +This location contains code that was inlined from Foo.scala:5 +5 | inline def myMacro(): Unit = ${ aMacroImplementation } + | ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/neg-macros/macros-in-same-project-6.check b/tests/neg-macros/macros-in-same-project-6.check index 485f5062db92..462ffc6df65c 100644 --- a/tests/neg-macros/macros-in-same-project-6.check +++ b/tests/neg-macros/macros-in-same-project-6.check @@ -2,4 +2,6 @@ 4 | Foo.myMacro() // error | ^^^^^^^^^^^^^ | some error - | This location contains code that was inlined from Bar.scala:4 +This location contains code that was inlined from Bar.scala:4 +4 | Foo.myMacro() // error + | ^^^^^^^^^^^^^ diff --git a/tests/neg/cannot-reduce-inline-match.check b/tests/neg/cannot-reduce-inline-match.check index ceca40a74cbd..6096d6806ff9 100644 --- a/tests/neg/cannot-reduce-inline-match.check +++ b/tests/neg/cannot-reduce-inline-match.check @@ -4,4 +4,8 @@ | cannot reduce inline match with | scrutinee: "f" : ("f" : String) | patterns : case _:Int - | This location contains code that was inlined from cannot-reduce-inline-match.scala:3 +This location contains code that was inlined from cannot-reduce-inline-match.scala:3 +3 | inline x match { + | ^ +4 | case _: Int => +5 | } diff --git a/tests/neg/i11225.check b/tests/neg/i11225.check index 60805a27b22d..cac8e09f2a3f 100644 --- a/tests/neg/i11225.check +++ b/tests/neg/i11225.check @@ -42,4 +42,6 @@ 30 | var x7: Int = uni // error | ^^^ | `uninitialized` can only be used as the right hand side of a mutable field definition - | This location contains code that was inlined from i11225.scala:25 +This location contains code that was inlined from i11225.scala:25 +25 | transparent inline def uni = uninitialized + | ^^^^^^^^^^^^^ diff --git a/tests/neg/i13044.check b/tests/neg/i13044.check index 87b8a1fe9ae2..95e272c36e12 100644 --- a/tests/neg/i13044.check +++ b/tests/neg/i13044.check @@ -4,41 +4,105 @@ | given instance gen is declared as `inline`, but was not inlined | | Try increasing `-Xmax-inlines` above 32 - | This location contains code that was inlined from i13044.scala:17 - | This location contains code that was inlined from i13044.scala:31 - | This location contains code that was inlined from i13044.scala:37 - | This location contains code that was inlined from i13044.scala:17 - | This location contains code that was inlined from i13044.scala:31 - | This location contains code that was inlined from i13044.scala:37 - | This location contains code that was inlined from i13044.scala:17 - | This location contains code that was inlined from i13044.scala:31 - | This location contains code that was inlined from i13044.scala:37 - | This location contains code that was inlined from i13044.scala:17 - | This location contains code that was inlined from i13044.scala:31 - | This location contains code that was inlined from i13044.scala:37 - | This location contains code that was inlined from i13044.scala:17 - | This location contains code that was inlined from i13044.scala:18 - | This location contains code that was inlined from i13044.scala:31 - | This location contains code that was inlined from i13044.scala:37 +This location contains code that was inlined from i13044.scala:17 +17 | val builder = summonInline[Schema[t]].asInstanceOf[Schema[Any]] + | ^ +This location contains code that was inlined from i13044.scala:17 +31 | lazy val fields = recurse[m.MirroredElemTypes] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:17 +37 | inline given gen[A]: Schema[A] = derived + | ^^^^^^^ +This location contains code that was inlined from i13044.scala:17 +17 | val builder = summonInline[Schema[t]].asInstanceOf[Schema[Any]] + | ^ +This location contains code that was inlined from i13044.scala:17 +31 | lazy val fields = recurse[m.MirroredElemTypes] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:17 +37 | inline given gen[A]: Schema[A] = derived + | ^^^^^^^ +This location contains code that was inlined from i13044.scala:17 +17 | val builder = summonInline[Schema[t]].asInstanceOf[Schema[Any]] + | ^ +This location contains code that was inlined from i13044.scala:17 +31 | lazy val fields = recurse[m.MirroredElemTypes] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:17 +37 | inline given gen[A]: Schema[A] = derived + | ^^^^^^^ +This location contains code that was inlined from i13044.scala:17 +17 | val builder = summonInline[Schema[t]].asInstanceOf[Schema[Any]] + | ^ +This location contains code that was inlined from i13044.scala:17 +31 | lazy val fields = recurse[m.MirroredElemTypes] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:17 +37 | inline given gen[A]: Schema[A] = derived + | ^^^^^^^ +This location contains code that was inlined from i13044.scala:17 +17 | val builder = summonInline[Schema[t]].asInstanceOf[Schema[Any]] + | ^ +This location contains code that was inlined from i13044.scala:17 +18 | builder :: recurse[ts] + | ^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:17 +31 | lazy val fields = recurse[m.MirroredElemTypes] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:17 +37 | inline given gen[A]: Schema[A] = derived + | ^^^^^^^ -- Error: tests/neg/i13044.scala:50:40 --------------------------------------------------------------------------------- 50 | implicit def typeSchema: Schema[A] = Schema.gen // error // error | ^^^^^^^^^^ | method recurse is declared as `inline`, but was not inlined | | Try increasing `-Xmax-inlines` above 32 - | This location contains code that was inlined from i13044.scala:18 - | This location contains code that was inlined from i13044.scala:31 - | This location contains code that was inlined from i13044.scala:37 - | This location contains code that was inlined from i13044.scala:17 - | This location contains code that was inlined from i13044.scala:31 - | This location contains code that was inlined from i13044.scala:37 - | This location contains code that was inlined from i13044.scala:17 - | This location contains code that was inlined from i13044.scala:31 - | This location contains code that was inlined from i13044.scala:37 - | This location contains code that was inlined from i13044.scala:17 - | This location contains code that was inlined from i13044.scala:31 - | This location contains code that was inlined from i13044.scala:37 - | This location contains code that was inlined from i13044.scala:17 - | This location contains code that was inlined from i13044.scala:18 - | This location contains code that was inlined from i13044.scala:31 - | This location contains code that was inlined from i13044.scala:37 +This location contains code that was inlined from i13044.scala:18 +18 | builder :: recurse[ts] + | ^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +31 | lazy val fields = recurse[m.MirroredElemTypes] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +37 | inline given gen[A]: Schema[A] = derived + | ^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +17 | val builder = summonInline[Schema[t]].asInstanceOf[Schema[Any]] + | ^ +This location contains code that was inlined from i13044.scala:18 +31 | lazy val fields = recurse[m.MirroredElemTypes] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +37 | inline given gen[A]: Schema[A] = derived + | ^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +17 | val builder = summonInline[Schema[t]].asInstanceOf[Schema[Any]] + | ^ +This location contains code that was inlined from i13044.scala:18 +31 | lazy val fields = recurse[m.MirroredElemTypes] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +37 | inline given gen[A]: Schema[A] = derived + | ^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +17 | val builder = summonInline[Schema[t]].asInstanceOf[Schema[Any]] + | ^ +This location contains code that was inlined from i13044.scala:18 +31 | lazy val fields = recurse[m.MirroredElemTypes] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +37 | inline given gen[A]: Schema[A] = derived + | ^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +17 | val builder = summonInline[Schema[t]].asInstanceOf[Schema[Any]] + | ^ +This location contains code that was inlined from i13044.scala:18 +18 | builder :: recurse[ts] + | ^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +31 | lazy val fields = recurse[m.MirroredElemTypes] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13044.scala:18 +37 | inline given gen[A]: Schema[A] = derived + | ^^^^^^^ diff --git a/tests/neg/i13570.check b/tests/neg/i13570.check index 90e29476b7b1..6ce819f7d5af 100644 --- a/tests/neg/i13570.check +++ b/tests/neg/i13570.check @@ -6,4 +6,9 @@ | patterns : case s @ _:Seq[Int] if s.isEmpty | case s @ _:Seq[Int] | case _ - | This location contains code that was inlined from i13570.scala:3 +This location contains code that was inlined from i13570.scala:3 +3 | inline seq match + | ^ +4 | case s: Seq[Int] if s.isEmpty => println("seq is empty") +5 | case s: Seq[Int] => println("seq is not empty") +6 | case _ => println("somthing hinky happened") diff --git a/tests/neg/i13991.check b/tests/neg/i13991.check new file mode 100644 index 000000000000..4c506d488166 --- /dev/null +++ b/tests/neg/i13991.check @@ -0,0 +1,10 @@ +-- Error: tests/neg/i13991.scala:8:15 ---------------------------------------------------------------------------------- +8 |def foo = first[String] // error + | ^^^^^^^^^^^^^ + | no implicit argument of type Foo[String] was found +This location contains code that was inlined from i13991.scala:4 +4 |inline def second[A]: Int = compiletime.summonInline[Foo[A]].foo + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This location contains code that was inlined from i13991.scala:4 +6 |inline def first[A]: Int = second[A] + 42 + | ^^^^^^^^^ diff --git a/tests/neg/i13991.scala b/tests/neg/i13991.scala new file mode 100644 index 000000000000..2367498cabdc --- /dev/null +++ b/tests/neg/i13991.scala @@ -0,0 +1,8 @@ +trait Foo[X]: + def foo: Int + +inline def second[A]: Int = compiletime.summonInline[Foo[A]].foo + +inline def first[A]: Int = second[A] + 42 + +def foo = first[String] // error diff --git a/tests/neg/inline-error-pos.check b/tests/neg/inline-error-pos.check index 121684fe14d6..56417ce56cbe 100644 --- a/tests/neg/inline-error-pos.check +++ b/tests/neg/inline-error-pos.check @@ -4,4 +4,7 @@ | cannot reduce inline match with | scrutinee: 2 : (2 : Int) | patterns : case 1 - | This location contains code that was inlined from inline-error-pos.scala:3 +This location contains code that was inlined from inline-error-pos.scala:3 +3 | inline x match + | ^ +4 | case 1 => 9 diff --git a/tests/neg/summonInline.check b/tests/neg/summonInline.check old mode 100755 new mode 100644 index d118299d6dc5..ac59b837a00b --- a/tests/neg/summonInline.check +++ b/tests/neg/summonInline.check @@ -2,9 +2,13 @@ 19 |val missing1 = summonInlineCheck(1) // error | ^^^^^^^^^^^^^^^^^^^^ | Missing One - | This location contains code that was inlined from summonInline.scala:15 +This location contains code that was inlined from summonInline.scala:15 +15 | case 1 => summonInline[Missing1] + | ^^^^^^^^^^^^^^^^^^^^^^ -- Error: tests/neg/summonInline.scala:20:32 --------------------------------------------------------------------------- 20 |val missing2 = summonInlineCheck(2) // error | ^^^^^^^^^^^^^^^^^^^^ | Missing Two - | This location contains code that was inlined from summonInline.scala:16 +This location contains code that was inlined from summonInline.scala:16 +16 | case 2 => summonInline[Missing2] + | ^^^^^^^^^^^^^^^^^^^^^^