https://github.com/Qwinci updated https://github.com/llvm/llvm-project/pull/69011
>From e7380b096db802072d75d3bc48971d9758b704cf Mon Sep 17 00:00:00 2001 From: Qwinci <32550582+qwi...@users.noreply.github.com> Date: Fri, 13 Oct 2023 19:38:19 +0300 Subject: [PATCH] clangd: Show argument names for function pointer struct fields --- .../clangd/unittests/CodeCompleteTests.cpp | 17 +++++++++++++++++ clang/lib/Sema/SemaCodeComplete.cpp | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp index 766998eb4f3c71..bd88a0912b537d 100644 --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -1462,6 +1462,23 @@ TEST(SignatureHelpTest, FunctionPointers) { typedef void (__stdcall *fn)(int x, int y); fn foo; int main() { foo(^); } + )cpp", + // Field of function pointer type + R"cpp( + struct S { + void (*foo)(int x, int y); + }; + S s; + int main() { s.foo(^); } + )cpp", + // Field of function pointer typedef type + R"cpp( + typedef void (*fn)(int x, int y); + struct S { + fn foo; + }; + S s; + int main() { s.foo(^); } )cpp"}; for (auto Test : Tests) EXPECT_THAT(signatures(Test).signatures, diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index adb82d3f6d176a..4cff91e05ba11b 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -6133,6 +6133,7 @@ ProduceSignatureHelp(Sema &SemaRef, MutableArrayRef<ResultCandidate> Candidates, // so that we can recover argument names from it. static FunctionProtoTypeLoc GetPrototypeLoc(Expr *Fn) { TypeLoc Target; + if (const auto *T = Fn->getType().getTypePtr()->getAs<TypedefType>()) { Target = T->getDecl()->getTypeSourceInfo()->getTypeLoc(); @@ -6143,6 +6144,13 @@ static FunctionProtoTypeLoc GetPrototypeLoc(Expr *Fn) { } } + if (const auto *ME = dyn_cast<MemberExpr>(Fn)) { + const auto *MD = ME->getMemberDecl(); + if (const auto *FD = dyn_cast<FieldDecl>(MD); !Target && FD) { + Target = FD->getTypeSourceInfo()->getTypeLoc(); + } + } + if (!Target) return {}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits