From 1ceaaa8a7e5fac829f4f641c177456fbce46fc3e Mon Sep 17 00:00:00 2001 From: Dolphin von Chips Date: Mon, 12 May 2025 18:58:32 +0300 Subject: [PATCH] Disallow empty parameter clauses in `extension` definition [Cherry-picked 004579e201db041b7a0bcf42e761afcfe7c87daf] --- compiler/src/dotty/tools/dotc/parsing/Parsers.scala | 10 ++++++++-- tests/neg/extensions-can-only-have-using.scala | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 tests/neg/extensions-can-only-have-using.scala diff --git a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala index 628fa50211c3..26dded203710 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala @@ -3412,7 +3412,10 @@ object Parsers { // begin termParamClause inParensWithCommas { if in.token == RPAREN && paramOwner != ParamOwner.ExtensionPrefix && !impliedMods.is(Given) - then Nil + then + if paramOwner.takesOnlyUsingClauses then + syntaxError(em"`using` expected") + Nil else val clause = if paramOwner == ParamOwner.ExtensionPrefix @@ -4060,7 +4063,10 @@ object Parsers { leadParamss += extParams isUsingClause(extParams) do () - leadParamss ++= termParamClauses(ParamOwner.ExtensionFollow, numLeadParams) + // Empty parameter clauses are filtered out. They are already reported as syntax errors and are not + // allowed here. + val extFollowParams = termParamClauses(ParamOwner.ExtensionFollow, numLeadParams).filterNot(_.isEmpty) + leadParamss ++= extFollowParams if in.isColon then syntaxError(em"no `:` expected here") in.nextToken() diff --git a/tests/neg/extensions-can-only-have-using.scala b/tests/neg/extensions-can-only-have-using.scala new file mode 100644 index 000000000000..fcf451fc7258 --- /dev/null +++ b/tests/neg/extensions-can-only-have-using.scala @@ -0,0 +1,3 @@ +extension(x: Any)() // error + def f = 42 +val x = Nil.f