@@ -132,7 +132,7 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
132
132
def mappedInfo =
133
133
if toBeUpdated.contains(sym)
134
134
then symd.info // don't transform symbols that will anyway be updated
135
- else Fresh .fromCap(transformExplicitType(symd.info), sym)
135
+ else Fresh .fromCap(transformExplicitType(symd.info, sym ), sym)
136
136
if Synthetics .needsTransform(symd) then
137
137
Synthetics .transform(symd, mappedInfo)
138
138
else if isPreCC(sym) then
@@ -302,7 +302,7 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
302
302
* 5. Schedule deferred well-formed tests for types with retains annotations.
303
303
* 6. Perform normalizeCaptures
304
304
*/
305
- private def transformExplicitType (tp : Type , tptToCheck : Tree = EmptyTree )(using Context ): Type =
305
+ private def transformExplicitType (tp : Type , sym : Symbol , tptToCheck : Tree = EmptyTree )(using Context ): Type =
306
306
307
307
def fail (msg : Message ) =
308
308
if ! tptToCheck.isEmpty then report.error(msg, tptToCheck.srcPos)
@@ -387,7 +387,11 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
387
387
this (expandThrowsAlias(res, exc, Nil ))
388
388
case t =>
389
389
// Map references to capability classes C to C^
390
- if t.derivesFromCapability && ! t.isSingleton && t.typeSymbol != defn.Caps_Exists
390
+ if t.derivesFromCapability
391
+ && ! t.isSingleton
392
+ && t.typeSymbol != defn.Caps_Exists
393
+ && (! sym.isConstructor || (t ne tp.finalResultType))
394
+ // Don't add ^ to result types of class constructors deriving from Capability
391
395
then CapturingType (t, defn.universalCSImpliedByCapability, boxed = false )
392
396
else normalizeCaptures(mapFollowingAliases(t))
393
397
end toCapturing
@@ -460,7 +464,7 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
460
464
var transformed =
461
465
if tree.isInferred
462
466
then transformInferredType(tree.tpe)
463
- else transformExplicitType(tree.tpe, tptToCheck = tree)
467
+ else transformExplicitType(tree.tpe, sym, tptToCheck = tree)
464
468
if boxed then transformed = box(transformed)
465
469
if sym.is(Param ) && (transformed ne tree.tpe) then
466
470
paramSigChange += tree
@@ -685,7 +689,7 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
685
689
686
690
// Compute new parent types
687
691
val ps1 = inContext(ctx.withOwner(cls)):
688
- ps.mapConserve(transformExplicitType(_))
692
+ ps.mapConserve(transformExplicitType(_, NoSymbol ))
689
693
690
694
// Install new types and if it is a module class also update module object
691
695
if (selfInfo1 ne selfInfo) || (ps1 ne ps) then
0 commit comments