Skip to content

Commit 3badc4d

Browse files
committed
Deal gracefully with missing return types of abstract menthods.
1) Better error message: "missing return type" instead of `=' expected. 2) Allow them under language:Scala2 Fixes #871
1 parent 08e8802 commit 3badc4d

File tree

5 files changed

+30
-4
lines changed

5 files changed

+30
-4
lines changed

src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1741,10 +1741,22 @@ object Parsers {
17411741
val vparamss = paramClauses(name)
17421742
var tpt = fromWithinReturnType(typedOpt())
17431743
val rhs =
1744-
if (tpt.isEmpty || in.token == EQUALS) {
1745-
if (atScala2Brace) tpt = scalaUnit else accept(EQUALS)
1744+
if (in.token == EQUALS) {
1745+
in.nextToken()
1746+
expr
1747+
}
1748+
else if (!tpt.isEmpty)
1749+
EmptyTree
1750+
else if (scala2mode) {
1751+
tpt = scalaUnit
1752+
if (in.token == LBRACE) expr()
1753+
else EmptyTree
1754+
}
1755+
else {
1756+
if (!isExprIntro) syntaxError("missing return type", in.lastOffset)
1757+
accept(EQUALS)
17461758
expr()
1747-
} else EmptyTree
1759+
}
17481760
DefDef(name, tparams, vparamss, tpt, rhs).withMods(mods1)
17491761
}
17501762
}

test/dotc/tests.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class tests extends CompilerTest {
3535

3636
val allowDeepSubtypes = defaultOptions diff List("-Yno-deep-subtypes")
3737
val allowDoubleBindings = defaultOptions diff List("-Yno-double-bindings")
38+
val scala2mode = List("-language:Scala2")
3839

3940
val testsDir = "./tests/"
4041
val posDir = testsDir + "pos/"
@@ -90,14 +91,16 @@ class tests extends CompilerTest {
9091
@Test def pos_valueclasses = compileFiles(posDir + "valueclasses/", twice)
9192
@Test def pos_nullarify = compileFile(posDir, "nullarify", args = "-Ycheck:nullarify" :: Nil)
9293
@Test def pos_subtyping = compileFile(posDir, "subtyping", twice)
93-
@Test def pos_t2613 = compileFile(posSpecialDir, "t2613")(allowDeepSubtypes)
9494
@Test def pos_packageObj = compileFile(posDir, "i0239", twice)
9595
@Test def pos_anonClassSubtyping = compileFile(posDir, "anonClassSubtyping", twice)
9696
@Test def pos_extmethods = compileFile(posDir, "extmethods", twice)
9797
@Test def pos_companions = compileFile(posDir, "companions", twice)
9898

9999
@Test def pos_all = compileFiles(posDir) // twice omitted to make tests run faster
100100

101+
@Test def pos_t2613 = compileFile(posSpecialDir, "t2613")(allowDeepSubtypes)
102+
@Test def pos_i871 = compileFile(posSpecialDir, "i871", scala2mode)
103+
101104
@Test def new_all = compileFiles(newDir, twice)
102105

103106
@Test def neg_abstractOverride() = compileFile(negDir, "abstract-override", xerrors = 2)
@@ -132,6 +135,7 @@ class tests extends CompilerTest {
132135
@Test def neg_t2994 = compileFile(negDir, "t2994", xerrors = 2)
133136
@Test def neg_subtyping = compileFile(negDir, "subtyping", xerrors = 5)
134137
@Test def neg_variances = compileFile(negDir, "variances", xerrors = 2)
138+
@Test def neg_i871_missingReturnType = compileFile(negDir, "i871", xerrors = 2)
135139
@Test def neg_badAuxConstr = compileFile(negDir, "badAuxConstr", xerrors = 2)
136140
@Test def neg_typetest = compileFile(negDir, "typetest", xerrors = 1)
137141
@Test def neg_t1569_failedAvoid = compileFile(negDir, "t1569-failedAvoid", xerrors = 1)

tests/neg/i871.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
trait Message {
2+
def first(x: Int)
3+
def second
4+
1
5+
}

tests/pos-special/i871.flags

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-language:Scala2

tests/pos-special/i871.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
trait Message {
2+
def first(x: Int)
3+
def second
4+
}

0 commit comments

Comments
 (0)