Index: clangd/XRefs.cpp =================================================================== --- clangd/XRefs.cpp +++ clangd/XRefs.cpp @@ -37,6 +37,11 @@ return nullptr; } +void logIfOverflow(const SymbolLocation &Loc) { + if (Loc.Start.hasOverflow() || Loc.End.hasOverflow()) + log("Possible overflow in symbol location: {0}", Loc); +} + // Convert a SymbolLocation to LSP's Location. // HintPath is used to resolve the path of URI. // FIXME: figure out a good home for it, and share the implementation with @@ -61,6 +66,7 @@ LSPLoc.range.start.character = Loc.Start.column(); LSPLoc.range.end.line = Loc.End.line(); LSPLoc.range.end.character = Loc.End.column(); + logIfOverflow(Loc); return LSPLoc; } Index: clangd/index/Index.h =================================================================== --- clangd/index/Index.h +++ clangd/index/Index.h @@ -43,6 +43,10 @@ void setColumn(uint32_t Column); uint32_t column() const { return Column; } + bool hasOverflow() const { + return Line >= MaxLine || Column >= MaxColumn; + } + static constexpr uint32_t MaxLine = (1 << 20) - 1; static constexpr uint32_t MaxColumn = (1 << 12) - 1; Index: clangd/index/Index.cpp =================================================================== --- clangd/index/Index.cpp +++ clangd/index/Index.cpp @@ -23,7 +23,6 @@ constexpr uint32_t SymbolLocation::Position::MaxColumn; void SymbolLocation::Position::setLine(uint32_t L) { if (L > MaxLine) { - log("Set an overflowed Line {0}", L); Line = MaxLine; return; } @@ -31,7 +30,6 @@ } void SymbolLocation::Position::setColumn(uint32_t Col) { if (Col > MaxColumn) { - log("Set an overflowed Column {0}", Col); Column = MaxColumn; return; } Index: unittests/clangd/IndexTests.cpp =================================================================== --- unittests/clangd/IndexTests.cpp +++ unittests/clangd/IndexTests.cpp @@ -46,10 +46,15 @@ EXPECT_EQ(1u, Pos.line()); Pos.setColumn(2); EXPECT_EQ(2u, Pos.column()); + EXPECT_FALSE(Pos.hasOverflow()); Pos.setLine(Position::MaxLine + 1); // overflow + EXPECT_TRUE(Pos.hasOverflow()); EXPECT_EQ(Pos.line(), Position::MaxLine); + Pos.setLine(1); // reset the overflowed line. + Pos.setColumn(Position::MaxColumn + 1); // overflow + EXPECT_TRUE(Pos.hasOverflow()); EXPECT_EQ(Pos.column(), Position::MaxColumn); }