https://github.com/usx95 updated https://github.com/llvm/llvm-project/pull/94528
>From b13a663ae347649a3bcf9d6e381a5fbbfdc9ea4b Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena <u...@google.com> Date: Wed, 5 Jun 2024 19:48:48 +0000 Subject: [PATCH 1/3] [clangd] Fix crash with null check for Token at Loc --- clang-tools-extra/clangd/XRefs.cpp | 32 +++++++++++-------- .../clangd/unittests/XRefsTests.cpp | 14 +++++++- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp index cd909266489a8..f52228e599591 100644 --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -1354,6 +1354,8 @@ maybeFindIncludeReferences(ParsedAST &AST, Position Pos, ReferencesResult::Reference Result; const auto *Token = AST.getTokens().spelledTokenAt(Loc); + if (!Token) + return; Result.Loc.range = Range{sourceLocToPosition(SM, Token->location()), sourceLocToPosition(SM, Token->endLocation())}; Result.Loc.uri = URIMainFile; @@ -2012,15 +2014,15 @@ static QualType typeForNode(const SelectionTree::Node *N) { return QualType(); } -// Given a type targeted by the cursor, return one or more types that are more interesting -// to target. -static void unwrapFindType( - QualType T, const HeuristicResolver* H, llvm::SmallVector<QualType>& Out) { +// Given a type targeted by the cursor, return one or more types that are more +// interesting to target. +static void unwrapFindType(QualType T, const HeuristicResolver *H, + llvm::SmallVector<QualType> &Out) { if (T.isNull()) return; // If there's a specific type alias, point at that rather than unwrapping. - if (const auto* TDT = T->getAs<TypedefType>()) + if (const auto *TDT = T->getAs<TypedefType>()) return Out.push_back(QualType(TDT, 0)); // Pointers etc => pointee type. @@ -2044,17 +2046,18 @@ static void unwrapFindType( // For smart pointer types, add the underlying type if (H) - if (const auto* PointeeType = H->getPointeeType(T.getNonReferenceType().getTypePtr())) { - unwrapFindType(QualType(PointeeType, 0), H, Out); - return Out.push_back(T); + if (const auto *PointeeType = + H->getPointeeType(T.getNonReferenceType().getTypePtr())) { + unwrapFindType(QualType(PointeeType, 0), H, Out); + return Out.push_back(T); } return Out.push_back(T); } // Convenience overload, to allow calling this without the out-parameter -static llvm::SmallVector<QualType> unwrapFindType( - QualType T, const HeuristicResolver* H) { +static llvm::SmallVector<QualType> unwrapFindType(QualType T, + const HeuristicResolver *H) { llvm::SmallVector<QualType> Result; unwrapFindType(T, H, Result); return Result; @@ -2076,10 +2079,11 @@ std::vector<LocatedSymbol> findType(ParsedAST &AST, Position Pos, std::vector<LocatedSymbol> LocatedSymbols; // NOTE: unwrapFindType might return duplicates for something like - // unique_ptr<unique_ptr<T>>. Let's *not* remove them, because it gives you some - // information about the type you may have not known before - // (since unique_ptr<unique_ptr<T>> != unique_ptr<T>). - for (const QualType& Type : unwrapFindType(typeForNode(N), AST.getHeuristicResolver())) + // unique_ptr<unique_ptr<T>>. Let's *not* remove them, because it gives you + // some information about the type you may have not known before (since + // unique_ptr<unique_ptr<T>> != unique_ptr<T>). + for (const QualType &Type : + unwrapFindType(typeForNode(N), AST.getHeuristicResolver())) llvm::copy(locateSymbolForType(AST, Type, Index), std::back_inserter(LocatedSymbols)); diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index f53cbf01b7992..c4def624a2fcc 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -2358,7 +2358,14 @@ TEST(FindReferences, UsedSymbolsFromInclude) { R"cpp([[#in^clude <vector>]] std::[[vector]]<int> vec; - )cpp"}; + )cpp", + + R"cpp( + [[#include ^"operator_qoutes.h"]] + using ::operator_qoutes::[[operator]]"" _b; + auto x = 1_b; + )cpp", + }; for (const char *Test : Tests) { Annotations T(Test); auto TU = TestTU::withCode(T.code()); @@ -2375,6 +2382,11 @@ TEST(FindReferences, UsedSymbolsFromInclude) { class vector{}; } )cpp"); + TU.AdditionalFiles["operator_qoutes.h"] = guard(R"cpp( + namespace operator_qoutes { + bool operator"" _b(unsigned long long value); + } + )cpp"); TU.ExtraArgs.push_back("-isystem" + testPath("system")); auto AST = TU.build(); >From 3fe19589a332342abb069316224bdf9a6150c660 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena <u...@google.com> Date: Wed, 5 Jun 2024 19:59:44 +0000 Subject: [PATCH 2/3] remove unintentional format --- clang-tools-extra/clangd/XRefs.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp index f52228e599591..033c75f02d561 100644 --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -2014,15 +2014,15 @@ static QualType typeForNode(const SelectionTree::Node *N) { return QualType(); } -// Given a type targeted by the cursor, return one or more types that are more -// interesting to target. -static void unwrapFindType(QualType T, const HeuristicResolver *H, - llvm::SmallVector<QualType> &Out) { +// Given a type targeted by the cursor, return one or more types that are more interesting +// to target. +static void unwrapFindType( + QualType T, const HeuristicResolver* H, llvm::SmallVector<QualType>& Out) { if (T.isNull()) return; // If there's a specific type alias, point at that rather than unwrapping. - if (const auto *TDT = T->getAs<TypedefType>()) + if (const auto* TDT = T->getAs<TypedefType>()) return Out.push_back(QualType(TDT, 0)); // Pointers etc => pointee type. @@ -2046,18 +2046,17 @@ static void unwrapFindType(QualType T, const HeuristicResolver *H, // For smart pointer types, add the underlying type if (H) - if (const auto *PointeeType = - H->getPointeeType(T.getNonReferenceType().getTypePtr())) { - unwrapFindType(QualType(PointeeType, 0), H, Out); - return Out.push_back(T); + if (const auto* PointeeType = H->getPointeeType(T.getNonReferenceType().getTypePtr())) { + unwrapFindType(QualType(PointeeType, 0), H, Out); + return Out.push_back(T); } return Out.push_back(T); } // Convenience overload, to allow calling this without the out-parameter -static llvm::SmallVector<QualType> unwrapFindType(QualType T, - const HeuristicResolver *H) { +static llvm::SmallVector<QualType> unwrapFindType( + QualType T, const HeuristicResolver* H) { llvm::SmallVector<QualType> Result; unwrapFindType(T, H, Result); return Result; @@ -2079,11 +2078,10 @@ std::vector<LocatedSymbol> findType(ParsedAST &AST, Position Pos, std::vector<LocatedSymbol> LocatedSymbols; // NOTE: unwrapFindType might return duplicates for something like - // unique_ptr<unique_ptr<T>>. Let's *not* remove them, because it gives you - // some information about the type you may have not known before (since - // unique_ptr<unique_ptr<T>> != unique_ptr<T>). - for (const QualType &Type : - unwrapFindType(typeForNode(N), AST.getHeuristicResolver())) + // unique_ptr<unique_ptr<T>>. Let's *not* remove them, because it gives you some + // information about the type you may have not known before + // (since unique_ptr<unique_ptr<T>> != unique_ptr<T>). + for (const QualType& Type : unwrapFindType(typeForNode(N), AST.getHeuristicResolver())) llvm::copy(locateSymbolForType(AST, Type, Index), std::back_inserter(LocatedSymbols)); >From 1a2e3e4d7f381553f855389c4ff471dac5fa751d Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena <u...@google.com> Date: Thu, 6 Jun 2024 10:53:49 +0000 Subject: [PATCH 3/3] Modify spelledTokenAt to support locations in middle of a spelled token --- .../clangd/unittests/XRefsTests.cpp | 16 +++++++++------- clang/lib/Tooling/Syntax/Tokens.cpp | 4 ++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index c4def624a2fcc..cbceb9a343f87 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -2173,6 +2173,11 @@ TEST(FindReferences, WithinAST) { using $def[[MyTypeD^ef]] = int; enum MyEnum : $(MyEnum)[[MyTy^peDef]] { }; )cpp", + // UDL + R"cpp( + bool $decl[[operator]]"" _u^dl(unsigned long long value); + bool x = $(x)[[1_udl]]; + )cpp", }; for (const char *Test : Tests) checkFindRefs(Test); @@ -2361,9 +2366,8 @@ TEST(FindReferences, UsedSymbolsFromInclude) { )cpp", R"cpp( - [[#include ^"operator_qoutes.h"]] - using ::operator_qoutes::[[operator]]"" _b; - auto x = 1_b; + [[#include ^"udl_header.h"]] + auto x = [[1_b]]; )cpp", }; for (const char *Test : Tests) { @@ -2382,10 +2386,8 @@ TEST(FindReferences, UsedSymbolsFromInclude) { class vector{}; } )cpp"); - TU.AdditionalFiles["operator_qoutes.h"] = guard(R"cpp( - namespace operator_qoutes { - bool operator"" _b(unsigned long long value); - } + TU.AdditionalFiles["udl_header.h"] = guard(R"cpp( + bool operator"" _b(unsigned long long value); )cpp"); TU.ExtraArgs.push_back("-isystem" + testPath("system")); diff --git a/clang/lib/Tooling/Syntax/Tokens.cpp b/clang/lib/Tooling/Syntax/Tokens.cpp index 8d32c45a4a70c..f26e556d762c7 100644 --- a/clang/lib/Tooling/Syntax/Tokens.cpp +++ b/clang/lib/Tooling/Syntax/Tokens.cpp @@ -387,8 +387,8 @@ const syntax::Token *TokenBuffer::spelledTokenAt(SourceLocation Loc) const { assert(Loc.isFileID()); const auto *Tok = llvm::partition_point( spelledTokens(SourceMgr->getFileID(Loc)), - [&](const syntax::Token &Tok) { return Tok.location() < Loc; }); - if (!Tok || Tok->location() != Loc) + [&](const syntax::Token &Tok) { return Tok.endLocation() <= Loc; }); + if (!Tok || Tok->location() > Loc || Loc >= Tok->endLocation()) return nullptr; return Tok; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits