@@ -35,12 +35,6 @@ using namespace Lowering;
3535// Helper Routines
3636// ===----------------------------------------------------------------------===//
3737
38- static unsigned getTupleSize (CanType t) {
39- if (auto tt = dyn_cast<TupleType>(t))
40- return tt->getNumElements ();
41- return 1 ;
42- }
43-
4438unsigned RValue::getRValueSize (AbstractionPattern pattern, CanType formalType) {
4539 if (pattern.isTuple ()) {
4640 if (pattern.doesTupleContainPackExpansionType ())
@@ -483,7 +477,7 @@ RValue::RValue(SILGenFunction &SGF, Expr *expr, ManagedValue v)
483477}
484478
485479RValue::RValue (CanType type)
486- : type(type), elementsToBeAdded(getTupleSize (type)) {
480+ : type(type), elementsToBeAdded(getRValueSize (type)) {
487481}
488482
489483RValue::RValue (AbstractionPattern pattern, CanType type)
@@ -493,12 +487,14 @@ RValue::RValue(AbstractionPattern pattern, CanType type)
493487void RValue::addElement (RValue &&element) & {
494488 assert (!element.isUsed () && " adding consumed value to r-value" );
495489 assert (!element.isInSpecialState () && " adding special value to r-value" );
496- assert (!isComplete () && " rvalue already complete" );
497- assert (!isInSpecialState () && " cannot add elements to a special r-value" );
498- --elementsToBeAdded;
499- values.insert (values.end (),
500- element.values .begin (), element.values .end ());
501- element.makeUsed ();
490+ assert (elementsToBeAdded >= element.values .size () && " rvalue too full" );
491+ if (!element.values .empty ()) {
492+ assert (!isInSpecialState () && " cannot add elements to a special r-value" );
493+ elementsToBeAdded -= element.values .size ();
494+ values.insert (values.end (),
495+ element.values .begin (), element.values .end ());
496+ element.makeUsed ();
497+ }
502498
503499 assert (!isComplete () || values.size () == getRValueSize (type));
504500 // Call into the verifier helper directly without an SGF since we know that
0 commit comments