[clangd] Handle an expanded token range that ends in the `eof` token in TokenBuffer::spelledForExpanded() (#78092)
Such ranges can legitimately arise in the case of invalid code, such as
a declaration missing an ending brace.
Fixes https://github.com/clangd/clangd/issues/1559
GitOrigin-RevId: 9d1dada57741d204f8a95aa2b0c89a7242e101f1
diff --git a/clangd/unittests/DumpASTTests.cpp b/clangd/unittests/DumpASTTests.cpp
index d1b8f21..3046821 100644
--- a/clangd/unittests/DumpASTTests.cpp
+++ b/clangd/unittests/DumpASTTests.cpp
@@ -186,6 +186,17 @@
EXPECT_THAT(Node.children.front().arcana, testing::StartsWith("QualType "));
}
+TEST(DumpASTTests, UnbalancedBraces) {
+ // Test that we don't crash while trying to compute a source range for the
+ // node whose ending brace is missing, and also that the source range is
+ // not empty.
+ Annotations Case("/*error-ok*/ $func[[int main() {]]");
+ ParsedAST AST = TestTU::withCode(Case.code()).build();
+ auto Node = dumpAST(DynTypedNode::create(findDecl(AST, "main")),
+ AST.getTokens(), AST.getASTContext());
+ ASSERT_EQ(Node.range, Case.range("func"));
+}
+
} // namespace
} // namespace clangd
} // namespace clang