@@ -2353,6 +2353,50 @@ static bool parseAssignOrInitMode(AssignOrInitInst::Mode &Result,
23532353 return false ;
23542354}
23552355
2356+ static bool
2357+ parseAssignOrInitAssignments (llvm::SmallVectorImpl<unsigned > &assignments,
2358+ SILParser &SP) {
2359+ // Could be more than one [assign=<index>] attributes.
2360+ for (;;) {
2361+ SourceLoc loc;
2362+
2363+ // Consume '['
2364+ if (!SP.P .consumeIf (tok::l_square))
2365+ return false ;
2366+
2367+ // Consume the identifier which should be "assign"
2368+ {
2369+ Identifier Id;
2370+ if (SP.parseSILIdentifier (Id, loc, diag::expected_in_attribute_list))
2371+ return true ;
2372+
2373+ if (!Id.is (" assign" )) {
2374+ SP.P .diagnose (loc, diag::sil_invalid_attribute_for_expected, Id.str (),
2375+ " assign" );
2376+ return true ;
2377+ }
2378+ }
2379+
2380+ uint64_t index;
2381+
2382+ // Consume '='
2383+ if (!SP.P .consumeIf (tok::equal)) {
2384+ SP.P .diagnose (loc, diag::expected_equal_in_sil_instr);
2385+ return true ;
2386+ }
2387+
2388+ // Consume the property index.
2389+ if (SP.parseInteger (index, diag::expected_in_attribute_list))
2390+ return true ;
2391+
2392+ // Consume ']'
2393+ if (SP.P .parseToken (tok::r_square, diag::expected_in_attribute_list))
2394+ return true ;
2395+
2396+ assignments.push_back (index);
2397+ }
2398+ }
2399+
23562400// Parse a list of integer indices, prefaced with the given string label.
23572401// Returns true on error.
23582402static bool parseIndexList (Parser &P, StringRef label,
@@ -4700,16 +4744,24 @@ bool SILParser::parseSpecificSILInstruction(SILBuilder &B,
47004744 case SILInstructionKind::AssignOrInitInst: {
47014745 SILValue Src, InitFn, SetFn;
47024746 AssignOrInitInst::Mode Mode;
4747+ llvm::SmallVector<unsigned , 2 > assignments;
47034748
4704- if (parseAssignOrInitMode (Mode, *this ) || parseTypedValueRef (Src, B) ||
4749+ if (parseAssignOrInitMode (Mode, *this ) ||
4750+ parseAssignOrInitAssignments (assignments, *this ) ||
4751+ parseTypedValueRef (Src, B) ||
47054752 P.parseToken (tok::comma, diag::expected_tok_in_sil_instr, " ," ) ||
47064753 parseVerbatim (" init" ) || parseTypedValueRef (InitFn, B) ||
47074754 P.parseToken (tok::comma, diag::expected_tok_in_sil_instr, " ," ) ||
47084755 parseVerbatim (" set" ) || parseTypedValueRef (SetFn, B) ||
47094756 parseSILDebugLocation (InstLoc, B))
47104757 return true ;
47114758
4712- ResultVal = B.createAssignOrInit (InstLoc, Src, InitFn, SetFn, Mode);
4759+ auto *AI = B.createAssignOrInit (InstLoc, Src, InitFn, SetFn, Mode);
4760+
4761+ for (unsigned index : assignments)
4762+ AI->markAsInitialized (index);
4763+
4764+ ResultVal = AI;
47134765 break ;
47144766 }
47154767
0 commit comments