@@ -3072,13 +3072,20 @@ void TypeConverter::verifyTrivialLowering(const TypeLowering &lowering,
3072
3072
// }
3073
3073
// (5) being defined in a different module
3074
3074
// (6) being defined in a module built from interface
3075
+ // (7) being or containing a variadic generic type which doesn't conform
3076
+ // unconditionally but does in this case
3075
3077
bool hasNoNonconformingNode = visitAggregateLeaves (
3076
3078
origType, substType, forExpansion,
3077
3079
/* isLeafAggregate=*/
3078
3080
[&](auto ty, auto origTy, auto *field, auto index) -> bool {
3081
+ // These show up in the context of non-conforming variadic generics
3082
+ // which may lack a conformance (case (7)).
3083
+ if (isa<SILPackType>(ty) || isa<PackExpansionType>(ty))
3084
+ return true ;
3085
+
3079
3086
auto *nominal = ty.getAnyNominal ();
3080
- // Non- nominal aggregates must not be responsible for non-conformance;
3081
- // walk into them .
3087
+ // Only pack-related non- nominal aggregates may be responsible for
3088
+ // non-conformance; walk into the rest .
3082
3089
if (!nominal)
3083
3090
return false ;
3084
3091
@@ -3113,6 +3120,11 @@ void TypeConverter::verifyTrivialLowering(const TypeLowering &lowering,
3113
3120
3114
3121
auto isTopLevel = !field;
3115
3122
3123
+ // These show up in the context of non-conforming variadic generics
3124
+ // which may lack a conformance (case (7)).
3125
+ if (isa<SILPackType>(ty) || isa<PackExpansionType>(ty))
3126
+ return false ;
3127
+
3116
3128
// A BitwiseCopyable conformer appearing within its layout doesn't
3117
3129
// explain why substType doesn't itself conform.
3118
3130
if (M.checkConformance (ty, bitwiseCopyableProtocol))
0 commit comments