diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-12 00:49:51 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-12 00:49:51 +0800 |
| commit | deb6a9e08397083a8d23cac4cfba94345419b443 (patch) | |
| tree | 9be80ca7db7af178bf7195bcaf060b1f8f833122 /backend/unittests/MIR | |
| parent | 128a7dbac4cdb1594b3dac9144cf044695ef2ad9 (diff) | |
| download | rcc-project-deb6a9e08397083a8d23cac4cfba94345419b443.tar.gz rcc-project-deb6a9e08397083a8d23cac4cfba94345419b443.tar.xz | |
[MIR] Ignore empty YAML documents
Diffstat (limited to 'backend/unittests/MIR')
| -rw-r--r-- | backend/unittests/MIR/MIRDocumentTest.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/backend/unittests/MIR/MIRDocumentTest.cpp b/backend/unittests/MIR/MIRDocumentTest.cpp index 5855f57..88f92bc 100644 --- a/backend/unittests/MIR/MIRDocumentTest.cpp +++ b/backend/unittests/MIR/MIRDocumentTest.cpp @@ -513,6 +513,36 @@ void testDocumentTransaction(TestContext &Context) { "printer must reject output that omits required embedded LLVM IR"); } +void testEmptyYAMLDocuments(TestContext &Context) { + auto Target = createTarget(); + if (!Target) + return; + + constexpr std::string_view Boundary = "\n---\nname: documented"; + std::string WithEmptyDocuments(ValidDocument); + const std::size_t BoundaryPosition = WithEmptyDocuments.find(Boundary); + Context.expect(BoundaryPosition != std::string::npos, + "MIR empty-document fixture must find its document boundary"); + if (BoundaryPosition == std::string::npos) + return; + WithEmptyDocuments.replace(BoundaryPosition, Boundary.size(), "\n---\n---\nname: documented"); + WithEmptyDocuments.insert(0, "---\n"); + WithEmptyDocuments.append("\n...\n---\n"); + auto Parsed = + rcc::mir::parseMIRDocument(*Target, "empty-documents.mir", std::move(WithEmptyDocuments)); + Context.expect(Parsed.succeeded() && Parsed.document() != nullptr && + Parsed.document()->unit().functionCount() == 1, + "MIR must ignore leading, intermediate, and trailing empty YAML documents"); + if (!Parsed.succeeded()) + printDiagnostics(Parsed); + + std::string ExplicitNull(ValidDocument); + ExplicitNull.replace(BoundaryPosition, Boundary.size(), "\n---\nnull\n---\nname: documented"); + auto Rejected = rcc::mir::parseMIRDocument(*Target, "explicit-null.mir", std::move(ExplicitNull)); + Context.expect(!Rejected.succeeded(), + "MIR must not treat an explicit null document as an empty separator"); +} + void testHeterogeneousPointerLayout(TestContext &Context) { auto Target = createTarget(); Context.expect(Target.has_value(), "heterogeneous-layout target must be valid"); @@ -1028,6 +1058,7 @@ body: | int main() { TestContext Context; testDocumentTransaction(Context); + testEmptyYAMLDocuments(Context); testHeterogeneousPointerLayout(Context); testEmbeddedReferenceValidation(Context); testReferencesWithoutEmbeddedIR(Context); |
