@@ -3590,10 +3590,21 @@ RValue RValueEmitter::visitArrayExpr(ArrayExpr *E, SGFContext C) {
3590
3590
auto loc = SILLocation (E);
3591
3591
ArgumentScope scope (SGF, loc);
3592
3592
3593
- CanType elementType = E->getElementType ()->getCanonicalType ();
3594
- CanType arrayTy = ArraySliceType::get (elementType)->getCanonicalType ();
3593
+ // CSApply builds ArrayExprs without an initializer for the trivial case
3594
+ // of emitting varargs.
3595
+ CanType arrayType, elementType;
3596
+ if (E->getInitializer ()) {
3597
+ elementType = E->getElementType ()->getCanonicalType ();
3598
+ arrayType = ArraySliceType::get (elementType)->getCanonicalType ();
3599
+ } else {
3600
+ arrayType = E->getType ()->getCanonicalType ();
3601
+ auto genericType = cast<BoundGenericStructType>(arrayType);
3602
+ assert (genericType->getDecl () == SGF.getASTContext ().getArrayDecl ());
3603
+ elementType = genericType.getGenericArgs ()[0 ];
3604
+ }
3605
+
3595
3606
VarargsInfo varargsInfo =
3596
- emitBeginVarargs (SGF, loc, elementType, arrayTy ,
3607
+ emitBeginVarargs (SGF, loc, elementType, arrayType ,
3597
3608
E->getNumElements ());
3598
3609
3599
3610
// Cleanups for any elements that have been initialized so far.
@@ -3628,14 +3639,14 @@ RValue RValueEmitter::visitArrayExpr(ArrayExpr *E, SGFContext C) {
3628
3639
for (auto destCleanup : cleanups)
3629
3640
SGF.Cleanups .setCleanupState (destCleanup, CleanupState::Dead);
3630
3641
3631
- RValue arg (SGF, loc, arrayTy ,
3642
+ RValue arg (SGF, loc, arrayType ,
3632
3643
emitEndVarargs (SGF, loc, std::move (varargsInfo)));
3633
3644
3634
3645
arg = scope.popPreservingValue (std::move (arg));
3635
3646
3636
3647
// If we're building an array, we don't have to call the initializer;
3637
3648
// we've already built one.
3638
- if (arrayTy ->isEqual (E->getType ()))
3649
+ if (arrayType ->isEqual (E->getType ()))
3639
3650
return arg;
3640
3651
3641
3652
// Call the builtin initializer.
0 commit comments