File tree Expand file tree Collapse file tree 6 files changed +64
-5
lines changed
compiler/src/dotty/tools/dotc Expand file tree Collapse file tree 6 files changed +64
-5
lines changed Original file line number Diff line number Diff line change @@ -277,6 +277,9 @@ trait ConstraintHandling[AbstractContext] {
277
277
* of `scala.Singleton`, widen `tp`.
278
278
* 2. If `tp` is a union type, yet upper bound is not a union type,
279
279
* approximate the union type from above by an intersection of all common base types.
280
+ *
281
+ * At this point we also drop the @Repeated annotation to avoid inferring type arguments with it,
282
+ * as those could leak the annotation to users (see run/inferred-repeated-result).
280
283
*/
281
284
def widenInferred (tp : Type , bound : Type )(implicit actx : AbstractContext ): Type = {
282
285
def isMultiSingleton (tp : Type ): Boolean = tp.stripAnnots match {
@@ -302,7 +305,7 @@ trait ConstraintHandling[AbstractContext] {
302
305
if (isMultiSingleton(tp) && ! isMultiSingleton(bound) &&
303
306
! isSubTypeWhenFrozen(bound, defn.SingletonType )) tp.widen
304
307
else tp
305
- widenOr(widenSingle(tp))
308
+ widenOr(widenSingle(tp)).dropRepeatedAnnot
306
309
}
307
310
308
311
/** The instance type of `param` in the current constraint (which contains `param`).
Original file line number Diff line number Diff line change @@ -1485,6 +1485,13 @@ object Types {
1485
1485
*/
1486
1486
def signature (implicit ctx : Context ): Signature = Signature .NotAMethod
1487
1487
1488
+ def dropRepeatedAnnot (implicit ctx : Context ): Type = this match {
1489
+ case AnnotatedType (parent, annot) if annot.symbol eq defn.RepeatedAnnot => parent
1490
+ case tp @ AnnotatedType (parent, annot) =>
1491
+ tp.derivedAnnotatedType(parent.dropRepeatedAnnot, annot)
1492
+ case tp => tp
1493
+ }
1494
+
1488
1495
def annotatedToRepeated (implicit ctx : Context ): Type = this match {
1489
1496
case tp @ ExprType (tp1) => tp.derivedExprType(tp1.annotatedToRepeated)
1490
1497
case AnnotatedType (tp, annot) if annot matches defn.RepeatedAnnot =>
Original file line number Diff line number Diff line change @@ -1320,10 +1320,15 @@ class Namer { typer: Typer =>
1320
1320
// Widen rhs type and eliminate `|' but keep ConstantTypes if
1321
1321
// definition is inline (i.e. final in Scala2) and keep module singleton types
1322
1322
// instead of widening to the underlying module class types.
1323
- def widenRhs (tp : Type ): Type = tp.widenTermRefExpr match {
1324
- case ctp : ConstantType if isInlineVal => ctp
1325
- case ref : TypeRef if ref.symbol.is(ModuleClass ) => tp
1326
- case _ => tp.widen.widenUnion
1323
+ // We also drop the @Repeated annotation here to avoid leaking it in method result types
1324
+ // (see run/inferred-repeated-result).
1325
+ def widenRhs (tp : Type ): Type = {
1326
+ val tp1 = tp.widenTermRefExpr match {
1327
+ case ctp : ConstantType if isInlineVal => ctp
1328
+ case ref : TypeRef if ref.symbol.is(ModuleClass ) => tp
1329
+ case _ => tp.widen.widenUnion
1330
+ }
1331
+ tp1.dropRepeatedAnnot
1327
1332
}
1328
1333
1329
1334
// Replace aliases to Unit by Unit itself. If we leave the alias in
Original file line number Diff line number Diff line change
1
+ C.bar1 : scala.Option[scala.collection.Seq[scala.Predef.String]]
2
+ C.bar2 : scala.Option[scala.collection.Seq[scala.Predef.String]]
3
+ C.foo1 : scala.collection.Seq[scala.Predef.String]
4
+ C.foo2 : scala.collection.Seq[scala.Predef.String]
Original file line number Diff line number Diff line change
1
+ object Macros {
2
+ import scala .quoted ._
3
+ import scala .quoted .autolift ._
4
+ import scala .tasty ._
5
+
6
+ inline def go [T ](t : => T ) = $ { impl(' t ) }
7
+ def impl [T ](expr : Expr [T ])(implicit reflect : Reflection ): Expr [Unit ] = {
8
+ import reflect ._
9
+
10
+ val tree = expr.unseal
11
+
12
+ val methods =
13
+ tree.tpe.classSymbol.get.classMethods.map { m =>
14
+ val name = m.showCode
15
+ val returnType = m.tree.returnTpt.tpe.showCode
16
+ s " $name : $returnType"
17
+ }.sorted
18
+
19
+ methods.foldLeft(' {}) { (res, m) => ' { $res; println($ {m}) } }
20
+ }
21
+ }
Original file line number Diff line number Diff line change
1
+ class C {
2
+ def foo1 (s : String * ) = s
3
+ def foo2 (s : String * ) = {
4
+ val s1 = s
5
+ s
6
+ }
7
+
8
+ def bar1 (s : String * ) = Option (s)
9
+ def bar2 (s : String * ) = {
10
+ val o = Option (s)
11
+ o
12
+ }
13
+ }
14
+
15
+ object Test {
16
+ def main (args : Array [String ]): Unit = {
17
+ Macros .go(new C )
18
+ }
19
+ }
You can’t perform that action at this time.
0 commit comments