================ @@ -27,51 +36,68 @@ RootSignatureParser::RootSignatureParser( bool RootSignatureParser::parse() { // Iterate as many RootSignatureElements as possible, until we hit the // end of the stream + bool HadError = false; while (!peekExpectedToken(TokenKind::end_of_stream)) { + bool HadLocalError = false; if (tryConsumeExpectedToken(TokenKind::kw_RootFlags)) { SourceLocation ElementLoc = getTokenLocation(CurToken); auto Flags = parseRootFlags(); - if (!Flags.has_value()) - return true; - Elements.emplace_back(RootSignatureElement(ElementLoc, *Flags)); + if (Flags.has_value()) + Elements.emplace_back(RootSignatureElement(ElementLoc, *Flags)); + else + HadLocalError = true; } else if (tryConsumeExpectedToken(TokenKind::kw_RootConstants)) { SourceLocation ElementLoc = getTokenLocation(CurToken); auto Constants = parseRootConstants(); - if (!Constants.has_value()) - return true; - Elements.emplace_back(RootSignatureElement(ElementLoc, *Constants)); + if (Constants.has_value()) + Elements.emplace_back(RootSignatureElement(ElementLoc, *Constants)); + else + HadLocalError = true; } else if (tryConsumeExpectedToken(TokenKind::kw_DescriptorTable)) { SourceLocation ElementLoc = getTokenLocation(CurToken); auto Table = parseDescriptorTable(); - if (!Table.has_value()) - return true; - Elements.emplace_back(RootSignatureElement(ElementLoc, *Table)); + if (Table.has_value()) + Elements.emplace_back(RootSignatureElement(ElementLoc, *Table)); + else { + HadLocalError = true; + // We are within a DescriptorTable, we will do our best to recover + // by skipping until we encounter the expected closing ')'. + skipUntilExpectedToken(TokenKind::pu_r_paren); ---------------- inbelic wrote:
This is only done on the descriptor table because we want to avoid accidently parsing an element of the descriptor table as a root element. So we need to "exit" the descriptor table scope. For instance: ``` DescriptorTable( SRV(s0, invalid), CBV(b0, numDescriptor = 2) ), UAV(u0) ``` Parsing would fail here on the invalid token. We don't want to keep parsing the CBV as a root element, but we do want to try again starting at UAV. This is done because they have the same token. Typing this out, I realized though that we actually need to skip until it is closed, not just to the next one. Updated for this and added a test-case. https://github.com/llvm/llvm-project/pull/147832 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits