Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions compiler/src/dotty/tools/dotc/typer/RefChecks.scala
Original file line number Diff line number Diff line change
Expand Up @@ -760,7 +760,9 @@ object RefChecks {
def showDclAndLocation(sym: Symbol) =
s"${sym.showDcl} in ${sym.owner.showLocated}"
def undefined(msg: String) =
abstractClassError(false, s"${showDclAndLocation(member)} is not defined $msg")
val notdefined = s"${showDclAndLocation(member)} is not defined"
val text = if !msg.isEmpty then s"$notdefined $msg" else notdefined
abstractClassError(mustBeMixin = false, text)
val underlying = member.underlyingSymbol

// Give a specific error message for abstract vars based on why it fails:
Expand Down Expand Up @@ -926,8 +928,19 @@ object RefChecks {
if (abstractErrors.isEmpty)
checkNoAbstractDecls(clazz)

if (abstractErrors.nonEmpty)
report.error(abstractErrorMessage, clazzNamePos)
def errorPos(cls: ClassSymbol) =
val isEnumAnonCls = // courtesy of Checking.checkEnum
cls.isAnonymousClass
&& cls.owner.isTerm
&& (cls.owner.flagsUNSAFE.isAllOf(EnumCase)
|| ((cls.owner.name eq nme.DOLLAR_NEW) && cls.owner.flagsUNSAFE.isAllOf(Private | Synthetic)))
if isEnumAnonCls then
cls.parentSyms.head.children.filterNot(_.isClass).head.srcPos
else
clazzNamePos

if abstractErrors.nonEmpty then
report.error(abstractErrorMessage, errorPos(clazz))

checkMemberTypesOK()
checkCaseClassInheritanceInvariant()
Expand Down
12 changes: 9 additions & 3 deletions compiler/test/dotty/tools/vulpix/ParallelTesting.scala
Original file line number Diff line number Diff line change
Expand Up @@ -947,16 +947,22 @@ trait ParallelTesting extends RunnerOrchestration:

Option {
if actualErrors == 0 then s"\nNo errors found when compiling neg test $testSource"
else if expectedErrors == 0 then s"\nNo errors expected/defined in $testSource -- use // error or // nopos-error"
else if expectedErrors == 0 then
s"""|
|No errors expected/defined in $testSource -- use // error or // nopos-error"
|$showErrors
|""".stripMargin.trim.linesIterator.mkString("\n", "\n", "")
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the most important part of this PR.

else if expectedErrors != actualErrors then
s"""|Wrong number of errors encountered when compiling $testSource
|expected: $expectedErrors, actual: $actualErrors
|${expected.mkString("Unfulfilled expectations:\n", "\n", "")}
|${unexpected.mkString("Unexpected errors:\n", "\n", "")}
|$showErrors
|""".stripMargin.trim.linesIterator.mkString("\n", "\n", "")
else if hasMissingAnnotations then s"\nErrors found on incorrect row numbers when compiling $testSource\n$showErrors"
else if !errorMap.isEmpty then s"\nExpected error(s) have {<error position>=<unreported error>}: $errorMap"
else if hasMissingAnnotations then
s"\nErrors found on incorrect row numbers when compiling $testSource\n$showErrors"
else if !errorMap.isEmpty then
s"\nExpected error(s) have {<error position>=<unreported error>}: $errorMap"
else null
}
end maybeFailureMessage
Expand Down
2 changes: 1 addition & 1 deletion tests/neg/abstract-givens.check
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
-- Error: tests/neg/abstract-givens.scala:11:8 -------------------------------------------------------------------------
11 | given s: [T] => T => Seq[T]: // error
| ^
|instance cannot be created, since def iterator: Iterator[A] in trait IterableOnce in package scala.collection is not defined
|instance cannot be created, since def iterator: Iterator[A] in trait IterableOnce in package scala.collection is not defined
-- [E164] Declaration Error: tests/neg/abstract-givens.scala:8:8 -------------------------------------------------------
8 | given y(using Int): String = summon[Int].toString * 22 // error
| ^
Expand Down
2 changes: 1 addition & 1 deletion tests/neg/i19731.check
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
-- Error: tests/neg/i19731.scala:4:6 -----------------------------------------------------------------------------------
4 |class F1 extends Foo: // error
| ^^
| class F1 needs to be abstract, since def foo(): Unit in class F1 is not defined
| class F1 needs to be abstract, since def foo(): Unit in class F1 is not defined
-- Error: tests/neg/i19731.scala:7:6 -----------------------------------------------------------------------------------
7 |class F2 extends Foo: // error
| ^^
Expand Down
4 changes: 2 additions & 2 deletions tests/neg/i21335.check
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
-- Error: tests/neg/i21335.scala:7:6 -----------------------------------------------------------------------------------
7 |class Z1 extends Bar1 // error
| ^^
| class Z1 needs to be abstract, since override def bar(): Bar1 in trait Bar1 is not defined
| class Z1 needs to be abstract, since override def bar(): Bar1 in trait Bar1 is not defined
-- Error: tests/neg/i21335.scala:12:6 ----------------------------------------------------------------------------------
12 |class Z2 extends Bar2 // error
| ^^
| class Z2 needs to be abstract, since def bar(): Bar2 in trait Bar2 is not defined
| class Z2 needs to be abstract, since def bar(): Bar2 in trait Bar2 is not defined
8 changes: 8 additions & 0 deletions tests/neg/i22734.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- Error: tests/neg/i22734.scala:4:7 -----------------------------------------------------------------------------------
4 |object X extends T // error via refchecks
| ^
| object creation impossible, since def item: String in trait T is not defined
-- Error: tests/neg/i22734.scala:7:7 -----------------------------------------------------------------------------------
7 | case Empty // error via refchecks
| ^
| object creation impossible, since def item: String in class Foo is not defined
23 changes: 23 additions & 0 deletions tests/neg/i22734.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
trait T:
def item: String

object X extends T // error via refchecks

enum Foo {
case Empty // error via refchecks
case NonEmpty(item: String)
case Decoy // missing error

def item: String
}

trait TCell extends T:
override def item: String = "tcell"

enum Bar:
case Baz extends Bar, TCell // simple case inherits definition
def item: String

@main def test =
println:
Bar.Baz.item
2 changes: 1 addition & 1 deletion tests/neg/i22941.check
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
-- Error: tests/neg/i22941.scala:4:6 -----------------------------------------------------------------------------------
4 |class Baz extends Foo: // error
| ^^^
| class Baz needs to be abstract, since def bar: String in trait Foo is not defined
| class Baz needs to be abstract, since def bar: String in trait Foo is not defined
Loading