Skip to content

Commit 6b50086

Browse files
committed
Disallow opaque as a local modifier
1 parent e81fa4a commit 6b50086

File tree

3 files changed

+8
-4
lines changed

3 files changed

+8
-4
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,11 @@ object Parsers {
201201
canStartExpressionTokens.contains(in.token) &&
202202
!in.isSoftModifierInModifierPosition
203203

204-
def isDefIntro(allowedMods: BitSet): Boolean =
204+
def isDefIntro(allowedMods: BitSet, excludedSoftModifiers: Set[TermName] = Set.empty): Boolean =
205205
in.token == AT ||
206206
(defIntroTokens `contains` in.token) ||
207207
(allowedMods `contains` in.token) ||
208-
in.isSoftModifierInModifierPosition
208+
in.isSoftModifierInModifierPosition && !excludedSoftModifiers.contains(in.name)
209209

210210
def isStatSep: Boolean =
211211
in.token == NEWLINE || in.token == NEWLINES || in.token == SEMI
@@ -3014,7 +3014,7 @@ object Parsers {
30143014
stats += implicitClosure(in.offset, Location.InBlock, modifiers(closureMods))
30153015
else if (isExprIntro)
30163016
stats += expr(Location.InBlock)
3017-
else if (isDefIntro(localModifierTokens))
3017+
else if (isDefIntro(localModifierTokens, excludedSoftModifiers = Set(nme.`opaque`)))
30183018
if (closureMods.contains(in.token)) {
30193019
val start = in.offset
30203020
var imods = modifiers(closureMods)

docs/docs/internals/syntax.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,12 +320,12 @@ Binding ::= (id | ‘_’) [‘:’ Type]
320320
Modifier ::= LocalModifier
321321
| AccessModifier
322322
| ‘override’
323+
| ‘opaque’
323324
LocalModifier ::= ‘abstract’
324325
| ‘final’
325326
| ‘sealed’
326327
| ‘implicit’
327328
| ‘lazy’
328-
| ‘opaque’
329329
| ‘inline’
330330
| ‘erased’
331331
AccessModifier ::= (‘private’ | ‘protected’) [AccessQualifier]

tests/neg/opaque.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ object opaquetypes {
1818
val s: O = "" // should be OK
1919
}
2020

21+
def foo() = {
22+
opaque type X = Int // error
23+
}
24+
2125
}
2226

2327
object logs {

0 commit comments

Comments
 (0)