From f94e3901f6f2d65946f1ff5dd159583ffcc8947c Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sun, 3 Oct 2021 11:09:59 +0200 Subject: [PATCH] Allow using clauses to introduce Scala-2 conversions Notably, `(using A <:< B)` should introduce an implicit conversion. Previously that did not work since we tried to elaborate the context parameter as a `scala.Conversion`. --- compiler/src/dotty/tools/dotc/typer/Implicits.scala | 6 +++++- tests/pos/i12955.scala | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 tests/pos/i12955.scala diff --git a/compiler/src/dotty/tools/dotc/typer/Implicits.scala b/compiler/src/dotty/tools/dotc/typer/Implicits.scala index 2c8064ca23b4..cd69a1b97dd1 100644 --- a/compiler/src/dotty/tools/dotc/typer/Implicits.scala +++ b/compiler/src/dotty/tools/dotc/typer/Implicits.scala @@ -1041,9 +1041,13 @@ trait Implicits: adapt(generated, pt.widenExpr, locked) else { def untpdGenerated = untpd.TypedSplice(generated) + def producesConversion(info: Type): Boolean = info match + case info: PolyType => producesConversion(info.resType) + case info: MethodType if info.isImplicitMethod => producesConversion(info.resType) + case _ => info.derivesFrom(defn.ConversionClass) def tryConversion(using Context) = { val untpdConv = - if (ref.symbol.is(Given)) + if ref.symbol.is(Given) && producesConversion(ref.symbol.info) then untpd.Select( untpd.TypedSplice( adapt(generated, diff --git a/tests/pos/i12955.scala b/tests/pos/i12955.scala new file mode 100644 index 000000000000..32ce3eb3b0ad --- /dev/null +++ b/tests/pos/i12955.scala @@ -0,0 +1,2 @@ +def test[A, B](using c: A <:< B) = + val b: B = ??? : A