@@ -1650,6 +1650,7 @@ object Parsers {
1650
1650
case PROTECTED => Mod .Protected ()
1651
1651
case SEALED => Mod .Sealed ()
1652
1652
}
1653
+ private def flagsOfModToken (tok : Int ): FlagSet = modOfToken(tok).flags
1653
1654
1654
1655
/** Drop `private' modifier when followed by a qualifier.
1655
1656
* Contract `abstract' and `override' to ABSOVERRIDE
@@ -1705,7 +1706,14 @@ object Parsers {
1705
1706
}
1706
1707
} else mods
1707
1708
1708
- /** {Annotation} {Modifier}
1709
+ /**
1710
+ * Extend the start Modifiers by parsing modifier tokens in the allowed BitSet, appearing in any order.
1711
+ * Ignore modifier tokens in the parsedSeparately BitSet, so that the caller can parse them after modifier returns
1712
+ * (suitable to parse `AllowedModifiers* lazy`).
1713
+ * Report modifier tokens that appear neither in allowed nor in parsedSeparately.
1714
+ *
1715
+ * Grammar:
1716
+ * {Annotation} {Modifier}
1709
1717
* Modifiers ::= {Modifier}
1710
1718
* LocalModifiers ::= {LocalModifier}
1711
1719
* AccessModifier ::= (private | protected) [AccessQualifier]
@@ -1714,7 +1722,7 @@ object Parsers {
1714
1722
* | override
1715
1723
* LocalModifier ::= abstract | final | sealed | implicit | lazy
1716
1724
*/
1717
- def modifiers (allowed : BitSet = modifierTokens, start : Modifiers = Modifiers ()): Modifiers = {
1725
+ def modifiers (allowed : BitSet = modifierTokens, start : Modifiers = Modifiers (), parsedSeparately : BitSet = BitSet .empty ): Modifiers = {
1718
1726
@ tailrec
1719
1727
def loop (mods : Modifiers ): Modifiers = {
1720
1728
if (allowed contains in.token) {
@@ -1725,6 +1733,8 @@ object Parsers {
1725
1733
in.nextToken()
1726
1734
loop(mods)
1727
1735
} else {
1736
+ if ((modifierTokens contains in.token) && ! (parsedSeparately contains in.token))
1737
+ syntaxError(hl " Modifier ` ${flagsOfModToken(in.token)}' not allowed at this position " )
1728
1738
mods
1729
1739
}
1730
1740
}
@@ -2471,7 +2481,7 @@ object Parsers {
2471
2481
else if (isDefIntro(localModifierTokens))
2472
2482
if (in.token == IMPLICIT || in.token == ERASED ) {
2473
2483
val start = in.offset
2474
- var imods = modifiers(funArgMods)
2484
+ var imods = modifiers(funArgMods, parsedSeparately = BitSet ( LAZY ) )
2475
2485
if (isBindingIntro) stats += implicitClosure(start, Location .InBlock , imods)
2476
2486
else stats +++= localDef(start, imods)
2477
2487
} else {
0 commit comments