Author: Viktoriia Bakalova Date: 2023-06-16T12:09:28Z New Revision: c9888dce44748bfbf3719351c3feb3359eaba017
URL: https://github.com/llvm/llvm-project/commit/c9888dce44748bfbf3719351c3feb3359eaba017 DIFF: https://github.com/llvm/llvm-project/commit/c9888dce44748bfbf3719351c3feb3359eaba017.diff LOG: [clangd] Skip function parameter decls when evaluating variables on hover. Differential Revision: https://reviews.llvm.org/D153015 Added: Modified: clang-tools-extra/clangd/Hover.cpp clang-tools-extra/clangd/unittests/HoverTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp index d7a249c6bc21f..5184fcbe4b581 100644 --- a/clang-tools-extra/clangd/Hover.cpp +++ b/clang-tools-extra/clangd/Hover.cpp @@ -659,7 +659,7 @@ HoverInfo getHoverContents(const NamedDecl *D, const PrintingPolicy &PP, HI.Type = printType(TAT->getTemplatedDecl()->getUnderlyingType(), Ctx, PP); // Fill in value with evaluated initializer if possible. - if (const auto *Var = dyn_cast<VarDecl>(D)) { + if (const auto *Var = dyn_cast<VarDecl>(D); Var && !Var->isInvalidDecl()) { if (const Expr *Init = Var->getInit()) HI.Value = printExprValue(Init, Ctx); } else if (const auto *ECD = dyn_cast<EnumConstantDecl>(D)) { diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp index 583310f29b63f..5338a680b787a 100644 --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -22,6 +22,7 @@ #include "gtest/gtest.h" #include <functional> +#include <optional> #include <string> #include <vector> @@ -3722,6 +3723,34 @@ TEST(Hover, ForwardStructNoCrash) { EXPECT_EQ(*HI->Value, "&bar"); } +TEST(Hover, FunctionParameterDefaulValueNotEvaluatedOnInvalidDecls) { + struct { + const char *const Code; + const std::optional<std::string> HoverValue; + } Cases[] = { + {R"cpp( + // error-ok testing behavior on invalid decl + class Foo {}; + void foo(Foo p^aram = nullptr); + )cpp", + std::nullopt}, + {R"cpp( + class Foo {}; + void foo(Foo *p^aram = nullptr); + )cpp", + "nullptr"}, + }; + + for (const auto &C : Cases) { + Annotations T(C.Code); + TestTU TU = TestTU::withCode(T.code()); + auto AST = TU.build(); + auto HI = getHover(AST, T.point(), format::getLLVMStyle(), nullptr); + ASSERT_TRUE(HI); + ASSERT_EQ(HI->Value, C.HoverValue); + } +} + TEST(Hover, DisableShowAKA) { Annotations T(R"cpp( using m_int = int; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits