From ec0f5b8ed35e8677e3532f1cb13b2de119ff393e Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Fri, 26 Mar 2021 09:21:49 +0100 Subject: [PATCH] Do not drop `erased` flag from `given erased` parameters Fixes #11896 --- compiler/src/dotty/tools/dotc/parsing/Parsers.scala | 6 +++--- tests/pos-custom-args/erased/i11896.scala | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 tests/pos-custom-args/erased/i11896.scala diff --git a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala index b692774f39f5..02d6f4e81dcb 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala @@ -2910,12 +2910,12 @@ object Parsers { /** ContextTypes ::= Type {‘,’ Type} */ - def contextTypes(ofClass: Boolean, nparams: Int): List[ValDef] = + def contextTypes(ofClass: Boolean, nparams: Int, impliedMods: Modifiers): List[ValDef] = val tps = commaSeparated(typ) var counter = nparams def nextIdx = { counter += 1; counter } val paramFlags = if ofClass then Private | Local | ParamAccessor else Param - tps.map(makeSyntheticParameter(nextIdx, _, paramFlags | Synthetic | Given)) + tps.map(makeSyntheticParameter(nextIdx, _, paramFlags | Synthetic | impliedMods.flags)) /** ClsParamClause ::= ‘(’ [‘erased’] ClsParams ‘)’ | UsingClsParamClause * UsingClsParamClause::= ‘(’ ‘using’ [‘erased’] (ClsParams | ContextTypes) ‘)’ @@ -3016,7 +3016,7 @@ object Parsers { || startParamTokens.contains(in.token) || isIdent && (in.name == nme.inline || in.lookahead.isColon()) if isParams then commaSeparated(() => param()) - else contextTypes(ofClass, nparams) + else contextTypes(ofClass, nparams, impliedMods) checkVarArgsRules(clause) clause } diff --git a/tests/pos-custom-args/erased/i11896.scala b/tests/pos-custom-args/erased/i11896.scala new file mode 100644 index 000000000000..49e5307f1a49 --- /dev/null +++ b/tests/pos-custom-args/erased/i11896.scala @@ -0,0 +1,8 @@ +import scala.language.experimental.erasedDefinitions + +type X +erased def x: X = compiletime.erasedValue + +def foo(using erased X): Unit = () + +def test: Unit = foo(using x)