Skip to content

Commit 198dd06

Browse files
committed
Add a new parameter convention @in_cxx for non-trivial C++ classes
that are passed indirectly and destructed by the caller Fix a bug where `@in`, which indicates the callee is responsible for destroying the passed object, was being used to pass such classes. rdar://122707697
1 parent bf58b03 commit 198dd06

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+672
-45
lines changed

SwiftCompilerSources/Sources/SIL/Argument.swift

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,12 @@ public enum ArgumentConvention : CustomStringConvertible {
347347
/// convention used by mutable captures in @noescape closures.
348348
case indirectInoutAliasable
349349

350+
/// This argument is passed indirectly, i.e. by directly passing the address
351+
/// of an object in memory. The callee may modify, but does not destroy the
352+
/// object. This corresponds to the parameter-passing convention of the
353+
/// Itanium C++ ABI, which is used ubiquitously on non-Windows targets.
354+
case indirectInCXX
355+
350356
/// This argument represents an indirect return value address. The callee stores
351357
/// the returned value to this argument. At the time when the function is called,
352358
/// the memory location referenced by the argument is uninitialized.
@@ -402,8 +408,9 @@ public enum ArgumentConvention : CustomStringConvertible {
402408
public var isIndirect: Bool {
403409
switch self {
404410
case .indirectIn, .indirectInGuaranteed,
405-
.indirectInout, .indirectInoutAliasable, .indirectOut,
406-
.packOut, .packInout, .packOwned, .packGuaranteed:
411+
.indirectInout, .indirectInoutAliasable, .indirectInCXX,
412+
.indirectOut, .packOut, .packInout, .packOwned,
413+
.packGuaranteed:
407414
return true
408415
case .directOwned, .directUnowned, .directGuaranteed:
409416
return false
@@ -412,11 +419,12 @@ public enum ArgumentConvention : CustomStringConvertible {
412419

413420
public var isIndirectIn: Bool {
414421
switch self {
415-
case .indirectIn, .indirectInGuaranteed,
422+
case .indirectIn, .indirectInGuaranteed, .indirectInCXX,
416423
.packOwned, .packGuaranteed:
417424
return true
418425
case .directOwned, .directUnowned, .directGuaranteed,
419-
.indirectInout, .indirectInoutAliasable, .indirectOut,
426+
.indirectInout, .indirectInoutAliasable,
427+
.indirectOut,
420428
.packOut, .packInout:
421429
return false
422430
}
@@ -428,7 +436,7 @@ public enum ArgumentConvention : CustomStringConvertible {
428436
return true
429437
case .indirectInGuaranteed, .directGuaranteed, .packGuaranteed,
430438
.indirectIn, .directOwned, .directUnowned,
431-
.indirectInout, .indirectInoutAliasable,
439+
.indirectInout, .indirectInoutAliasable, .indirectInCXX,
432440
.packInout, .packOwned:
433441
return false
434442
}
@@ -439,8 +447,8 @@ public enum ArgumentConvention : CustomStringConvertible {
439447
case .indirectInGuaranteed, .directGuaranteed, .packGuaranteed:
440448
return true
441449
case .indirectIn, .directOwned, .directUnowned,
442-
.indirectInout, .indirectInoutAliasable, .indirectOut,
443-
.packOut, .packInout, .packOwned:
450+
.indirectInout, .indirectInoutAliasable, .indirectInCXX,
451+
.indirectOut, .packOut, .packInout, .packOwned:
444452
return false
445453
}
446454
}
@@ -451,6 +459,7 @@ public enum ArgumentConvention : CustomStringConvertible {
451459
.indirectOut,
452460
.indirectInGuaranteed,
453461
.indirectInout,
462+
.indirectInCXX,
454463
.packOut,
455464
.packInout,
456465
.packOwned,
@@ -475,6 +484,7 @@ public enum ArgumentConvention : CustomStringConvertible {
475484
case .indirectIn,
476485
.indirectOut,
477486
.indirectInGuaranteed,
487+
.indirectInCXX,
478488
.directUnowned,
479489
.directGuaranteed,
480490
.directOwned,
@@ -495,6 +505,8 @@ public enum ArgumentConvention : CustomStringConvertible {
495505
return "indirectInout"
496506
case .indirectInoutAliasable:
497507
return "indirectInoutAliasable"
508+
case .indirectInCXX:
509+
return "indirectInCXX"
498510
case .indirectOut:
499511
return "indirectOut"
500512
case .directOwned:
@@ -529,6 +541,7 @@ extension BridgedArgumentConvention {
529541
case .Indirect_In_Guaranteed: return .indirectInGuaranteed
530542
case .Indirect_Inout: return .indirectInout
531543
case .Indirect_InoutAliasable: return .indirectInoutAliasable
544+
case .Indirect_In_CXX: return .indirectInCXX
532545
case .Indirect_Out: return .indirectOut
533546
case .Direct_Owned: return .directOwned
534547
case .Direct_Unowned: return .directUnowned
@@ -550,6 +563,7 @@ extension ArgumentConvention {
550563
case .indirectInGuaranteed: return .Indirect_In_Guaranteed
551564
case .indirectInout: return .Indirect_Inout
552565
case .indirectInoutAliasable: return .Indirect_InoutAliasable
566+
case .indirectInCXX: return .Indirect_In_CXX
553567
case .indirectOut: return .Indirect_Out
554568
case .directOwned: return .Direct_Owned
555569
case .directUnowned: return .Direct_Unowned

SwiftCompilerSources/Sources/SIL/Effects.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ public struct SideEffects : CustomStringConvertible, NoReflectionChildren {
561561
result.memory = SideEffects.Memory()
562562
}
563563

564-
case .indirectInout, .indirectInoutAliasable:
564+
case .indirectInout, .indirectInoutAliasable, .indirectInCXX:
565565
break
566566
}
567567
return result

SwiftCompilerSources/Sources/SIL/FunctionConvention.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public struct ParameterInfo : CustomStringConvertible {
164164
switch convention {
165165
case .indirectIn, .indirectInGuaranteed:
166166
return hasLoweredAddresses || type.isOpenedExistentialWithError()
167-
case .indirectInout, .indirectInoutAliasable:
167+
case .indirectInout, .indirectInoutAliasable, .indirectInCXX:
168168
return true
169169
case .directOwned, .directUnowned, .directGuaranteed:
170170
return false

docs/ABI/Mangling.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,7 @@ mangled in to disambiguate.
867867
PARAM-CONVENTION ::= 'l' // indirect inout
868868
PARAM-CONVENTION ::= 'b' // indirect inout aliasable
869869
PARAM-CONVENTION ::= 'n' // indirect in guaranteed
870+
PARAM-CONVENTION ::= 'C' // indirect in C++
870871
PARAM-CONVENTION ::= 'x' // direct owned
871872
PARAM-CONVENTION ::= 'y' // direct unowned
872873
PARAM-CONVENTION ::= 'g' // direct guaranteed

include/swift/AST/Types.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4059,6 +4059,12 @@ enum class ParameterConvention : uint8_t {
40594059
/// convention used by mutable captures in @noescape closures.
40604060
Indirect_InoutAliasable,
40614061

4062+
/// This argument is passed indirectly, i.e. by directly passing the address
4063+
/// of an object in memory. The callee may modify, but does not destroy the
4064+
/// object. This corresponds to the parameter-passing convention of the
4065+
/// Itanium C++ ABI, which is used ubiquitously on non-Windows targets.
4066+
Indirect_In_CXX,
4067+
40624068
/// This argument is passed directly. Its type is non-trivial, and the callee
40634069
/// is responsible for destroying it.
40644070
Direct_Owned,
@@ -4099,6 +4105,7 @@ inline bool isIndirectFormalParameter(ParameterConvention conv) {
40994105
case ParameterConvention::Indirect_In:
41004106
case ParameterConvention::Indirect_Inout:
41014107
case ParameterConvention::Indirect_InoutAliasable:
4108+
case ParameterConvention::Indirect_In_CXX:
41024109
case ParameterConvention::Indirect_In_Guaranteed:
41034110
return true;
41044111

@@ -4115,6 +4122,7 @@ inline bool isIndirectFormalParameter(ParameterConvention conv) {
41154122
inline bool isConsumedParameter(ParameterConvention conv) {
41164123
switch (conv) {
41174124
case ParameterConvention::Indirect_In:
4125+
case ParameterConvention::Indirect_In_CXX:
41184126
case ParameterConvention::Direct_Owned:
41194127
case ParameterConvention::Pack_Owned:
41204128
return true;
@@ -4143,6 +4151,7 @@ inline bool isGuaranteedParameter(ParameterConvention conv) {
41434151

41444152
case ParameterConvention::Indirect_Inout:
41454153
case ParameterConvention::Indirect_InoutAliasable:
4154+
case ParameterConvention::Indirect_In_CXX:
41464155
case ParameterConvention::Indirect_In:
41474156
case ParameterConvention::Direct_Unowned:
41484157
case ParameterConvention::Direct_Owned:
@@ -4157,6 +4166,7 @@ inline bool isMutatingParameter(ParameterConvention conv) {
41574166
switch (conv) {
41584167
case ParameterConvention::Indirect_Inout:
41594168
case ParameterConvention::Indirect_InoutAliasable:
4169+
case ParameterConvention::Indirect_In_CXX:
41604170
case ParameterConvention::Pack_Inout:
41614171
return true;
41624172

@@ -4183,6 +4193,7 @@ inline bool isPackParameter(ParameterConvention conv) {
41834193
case ParameterConvention::Indirect_In_Guaranteed:
41844194
case ParameterConvention::Indirect_Inout:
41854195
case ParameterConvention::Indirect_InoutAliasable:
4196+
case ParameterConvention::Indirect_In_CXX:
41864197
case ParameterConvention::Indirect_In:
41874198
case ParameterConvention::Direct_Guaranteed:
41884199
case ParameterConvention::Direct_Unowned:
@@ -4263,6 +4274,10 @@ class SILParameterInfo {
42634274
return getConvention() == ParameterConvention::Indirect_In;
42644275
}
42654276

4277+
bool isIndirectInCXX() const {
4278+
return getConvention() == ParameterConvention::Indirect_In_CXX;
4279+
}
4280+
42664281
bool isIndirectInOut() const {
42674282
return getConvention() == ParameterConvention::Indirect_Inout;
42684283
}

include/swift/SIL/ApplySite.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ class ApplySite {
412412
: SILArgumentConvention::Direct_Owned;
413413
case SILArgumentConvention::Indirect_In:
414414
case SILArgumentConvention::Indirect_In_Guaranteed:
415+
case SILArgumentConvention::Indirect_In_CXX:
415416
return pai->isOnStack() ? SILArgumentConvention::Indirect_In_Guaranteed
416417
: SILArgumentConvention::Indirect_In;
417418
case SILArgumentConvention::Pack_Guaranteed:

include/swift/SIL/SILArgumentConvention.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ struct SILArgumentConvention {
2828
Indirect_In_Guaranteed,
2929
Indirect_Inout,
3030
Indirect_InoutAliasable,
31+
Indirect_In_CXX,
3132
Indirect_Out,
3233
Direct_Owned,
3334
Direct_Unowned,
@@ -55,6 +56,9 @@ struct SILArgumentConvention {
5556
case ParameterConvention::Indirect_In_Guaranteed:
5657
Value = SILArgumentConvention::Indirect_In_Guaranteed;
5758
return;
59+
case ParameterConvention::Indirect_In_CXX:
60+
Value = SILArgumentConvention::Indirect_In_CXX;
61+
return;
5862
case ParameterConvention::Direct_Unowned:
5963
Value = SILArgumentConvention::Direct_Unowned;
6064
return;
@@ -92,6 +96,7 @@ struct SILArgumentConvention {
9296
case SILArgumentConvention::Indirect_In_Guaranteed:
9397
case SILArgumentConvention::Indirect_In:
9498
case SILArgumentConvention::Indirect_Out:
99+
case SILArgumentConvention::Indirect_In_CXX:
95100
case SILArgumentConvention::Direct_Unowned:
96101
case SILArgumentConvention::Direct_Owned:
97102
case SILArgumentConvention::Direct_Guaranteed:
@@ -106,6 +111,7 @@ struct SILArgumentConvention {
106111
bool isOwnedConvention() const {
107112
switch (Value) {
108113
case SILArgumentConvention::Indirect_In:
114+
case SILArgumentConvention::Indirect_In_CXX:
109115
case SILArgumentConvention::Direct_Owned:
110116
case SILArgumentConvention::Pack_Owned:
111117
return true;
@@ -133,6 +139,7 @@ struct SILArgumentConvention {
133139
case SILArgumentConvention::Indirect_In:
134140
case SILArgumentConvention::Indirect_Out:
135141
case SILArgumentConvention::Indirect_InoutAliasable:
142+
case SILArgumentConvention::Indirect_In_CXX:
136143
case SILArgumentConvention::Direct_Unowned:
137144
case SILArgumentConvention::Direct_Owned:
138145
case SILArgumentConvention::Pack_Inout:
@@ -150,6 +157,7 @@ struct SILArgumentConvention {
150157
case SILArgumentConvention::Indirect_Out:
151158
case SILArgumentConvention::Indirect_In_Guaranteed:
152159
case SILArgumentConvention::Indirect_Inout:
160+
case SILArgumentConvention::Indirect_In_CXX:
153161
return true;
154162

155163
case SILArgumentConvention::Indirect_InoutAliasable:
@@ -176,6 +184,7 @@ struct SILArgumentConvention {
176184
case SILArgumentConvention::Indirect_In_Guaranteed:
177185
case SILArgumentConvention::Indirect_Inout:
178186
case SILArgumentConvention::Indirect_InoutAliasable:
187+
case SILArgumentConvention::Indirect_In_CXX:
179188
case SILArgumentConvention::Direct_Unowned:
180189
case SILArgumentConvention::Direct_Guaranteed:
181190
case SILArgumentConvention::Direct_Owned:

include/swift/SIL/SILBridging.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ enum class BridgedArgumentConvention {
136136
Indirect_In_Guaranteed,
137137
Indirect_Inout,
138138
Indirect_InoutAliasable,
139+
Indirect_In_CXX,
139140
Indirect_Out,
140141
Direct_Owned,
141142
Direct_Unowned,
@@ -167,6 +168,7 @@ struct BridgedParameterInfo {
167168
case BridgedArgumentConvention::Indirect_In_Guaranteed: return swift::ParameterConvention::Indirect_In_Guaranteed;
168169
case BridgedArgumentConvention::Indirect_Inout: return swift::ParameterConvention::Indirect_Inout;
169170
case BridgedArgumentConvention::Indirect_InoutAliasable: return swift::ParameterConvention::Indirect_InoutAliasable;
171+
case BridgedArgumentConvention::Indirect_In_CXX: return swift::ParameterConvention::Indirect_In_CXX;
170172
case BridgedArgumentConvention::Indirect_Out: break;
171173
case BridgedArgumentConvention::Direct_Owned: return swift::ParameterConvention::Direct_Owned;
172174
case BridgedArgumentConvention::Direct_Unowned: return swift::ParameterConvention::Direct_Unowned;

include/swift/SIL/SILFunctionConventions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,7 @@ inline bool SILModuleConventions::isIndirectSILParam(SILParameterInfo param,
592592

593593
case ParameterConvention::Indirect_In:
594594
case ParameterConvention::Indirect_In_Guaranteed:
595+
case ParameterConvention::Indirect_In_CXX:
595596
return isTypeIndirectForIndirectParamConvention(param.getInterfaceType(),
596597
loweredAddresses);
597598
case ParameterConvention::Indirect_Inout:

lib/AST/ASTMangler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,7 @@ static char getParamConvention(ParameterConvention conv) {
11361136
case ParameterConvention::Indirect_Inout: return 'l';
11371137
case ParameterConvention::Indirect_InoutAliasable: return 'b';
11381138
case ParameterConvention::Indirect_In_Guaranteed: return 'n';
1139+
case ParameterConvention::Indirect_In_CXX: return 'C';
11391140
case ParameterConvention::Direct_Owned: return 'x';
11401141
case ParameterConvention::Direct_Unowned: return 'y';
11411142
case ParameterConvention::Direct_Guaranteed: return 'g';

lib/AST/ASTPrinter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6733,6 +6733,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
67336733
case ParameterConvention::Indirect_In:
67346734
case ParameterConvention::Indirect_Inout:
67356735
case ParameterConvention::Indirect_InoutAliasable:
6736+
case ParameterConvention::Indirect_In_CXX:
67366737
case ParameterConvention::Indirect_In_Guaranteed:
67376738
llvm_unreachable("callee convention cannot be indirect");
67386739
case ParameterConvention::Pack_Guaranteed:
@@ -7502,6 +7503,7 @@ StringRef swift::getStringForParameterConvention(ParameterConvention conv) {
75027503
case ParameterConvention::Indirect_In_Guaranteed: return "@in_guaranteed ";
75037504
case ParameterConvention::Indirect_Inout: return "@inout ";
75047505
case ParameterConvention::Indirect_InoutAliasable: return "@inout_aliasable ";
7506+
case ParameterConvention::Indirect_In_CXX: return "@in_cxx ";
75057507
case ParameterConvention::Direct_Owned: return "@owned ";
75067508
case ParameterConvention::Direct_Unowned: return "";
75077509
case ParameterConvention::Direct_Guaranteed: return "@guaranteed ";

lib/Demangling/Demangler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2160,6 +2160,7 @@ NodePointer Demangler::demangleImplParamConvention(Node::Kind ConvKind) {
21602160
case 'l': attr = "@inout"; break;
21612161
case 'b': attr = "@inout_aliasable"; break;
21622162
case 'n': attr = "@in_guaranteed"; break;
2163+
case 'C': attr = "@in_cxx"; break;
21632164
case 'x': attr = "@owned"; break;
21642165
case 'g': attr = "@guaranteed"; break;
21652166
case 'e': attr = "@deallocating"; break;

lib/Demangling/Remangler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2109,6 +2109,7 @@ ManglingError Remangler::mangleImplFunctionType(Node *node, unsigned depth) {
21092109
.Case("@inout", 'l')
21102110
.Case("@inout_aliasable", 'b')
21112111
.Case("@in_guaranteed", 'n')
2112+
.Case("@in_cxx", 'C')
21122113
.Case("@in_constant", 'c')
21132114
.Case("@owned", 'x')
21142115
.Case("@guaranteed", 'g')

lib/IRGen/GenCall.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1638,6 +1638,7 @@ const TypeInfo &SignatureExpansion::expand(SILParameterInfo param) {
16381638
switch (auto conv = param.getConvention()) {
16391639
case ParameterConvention::Indirect_In:
16401640
case ParameterConvention::Indirect_In_Guaranteed:
1641+
case ParameterConvention::Indirect_In_CXX:
16411642
addIndirectValueParameterAttributes(IGM, Attrs, ti, ParamIRTypes.size());
16421643
addPointerParameter(IGM.getStorageType(getSILFuncConventions().getSILType(
16431644
param, IGM.getMaximalTypeExpansionContext())));

lib/IRGen/GenDistributed.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ void DistributedAccessor::decodeArgument(unsigned argumentIdx,
526526
}
527527

528528
switch (param.getConvention()) {
529+
case ParameterConvention::Indirect_In_CXX:
529530
case ParameterConvention::Indirect_In: {
530531
// The only way to load opaque type is to allocate a temporary
531532
// variable on the stack for it and initialize from the given address

lib/IRGen/GenFunc.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -846,6 +846,7 @@ CanType irgen::getArgumentLoweringType(CanType type, SILParameterInfo paramInfo,
846846
// address.
847847
case ParameterConvention::Indirect_In:
848848
case ParameterConvention::Indirect_In_Guaranteed:
849+
case ParameterConvention::Indirect_In_CXX:
849850
if (isNoEscape)
850851
return CanInOutType::get(type);
851852
else
@@ -1508,6 +1509,7 @@ static llvm::Value *emitPartialApplicationForwarder(
15081509
break;
15091510
case ParameterConvention::Indirect_Inout:
15101511
case ParameterConvention::Indirect_InoutAliasable:
1512+
case ParameterConvention::Indirect_In_CXX:
15111513
case ParameterConvention::Indirect_In:
15121514
case ParameterConvention::Indirect_In_Guaranteed:
15131515
case ParameterConvention::Pack_Guaranteed:
@@ -1619,6 +1621,7 @@ static llvm::Value *emitPartialApplicationForwarder(
16191621
// - we received as unowned and are passing as guaranteed
16201622
auto argConvention = conventions[0];
16211623
switch (argConvention) {
1624+
case ParameterConvention::Indirect_In_CXX:
16221625
case ParameterConvention::Indirect_In:
16231626
case ParameterConvention::Direct_Owned:
16241627
if (!consumesContext) subIGF.emitNativeStrongRetain(rawData, subIGF.getDefaultAtomicity());
@@ -1713,6 +1716,7 @@ static llvm::Value *emitPartialApplicationForwarder(
17131716

17141717
Explosion param;
17151718
switch (fieldConvention) {
1719+
case ParameterConvention::Indirect_In_CXX:
17161720
case ParameterConvention::Indirect_In: {
17171721

17181722
auto initStackCopy = [&addressesToDeallocate, &needsAllocas, &param,
@@ -2301,6 +2305,7 @@ std::optional<StackAddress> irgen::emitFunctionPartialApplication(
23012305
switch (argConventions[i]) {
23022306
// Take indirect value arguments out of memory.
23032307
case ParameterConvention::Indirect_In:
2308+
case ParameterConvention::Indirect_In_CXX:
23042309
case ParameterConvention::Indirect_In_Guaranteed: {
23052310
if (outType->isNoEscape()) {
23062311
cast<LoadableTypeInfo>(fieldLayout.getType())

lib/IRGen/GenObjC.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,7 @@ static llvm::Function *emitObjCPartialApplicationForwarder(IRGenModule &IGM,
948948
case ParameterConvention::Indirect_In:
949949
case ParameterConvention::Indirect_Inout:
950950
case ParameterConvention::Indirect_InoutAliasable:
951+
case ParameterConvention::Indirect_In_CXX:
951952
case ParameterConvention::Pack_Guaranteed:
952953
case ParameterConvention::Pack_Owned:
953954
case ParameterConvention::Pack_Inout:

lib/IRGen/GenProto.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ void PolymorphicConvention::considerParameter(SILParameterInfo param,
393393
case ParameterConvention::Indirect_In_Guaranteed:
394394
case ParameterConvention::Indirect_Inout:
395395
case ParameterConvention::Indirect_InoutAliasable:
396+
case ParameterConvention::Indirect_In_CXX:
396397
if (!isSelfParameter) return;
397398
if (type->getNominalOrBoundGenericNominal()) {
398399
considerNewTypeSource(IsExact,

0 commit comments

Comments
 (0)