https://github.com/Lancern updated https://github.com/llvm/llvm-project/pull/75937
>From 36f970d7ecd4e68c73eaae7d82c7f6c6f6b037db Mon Sep 17 00:00:00 2001 From: Sirui Mu <msrlanc...@gmail.com> Date: Sat, 28 Jun 2025 01:44:44 +0800 Subject: [PATCH] [clangd][Sema] add noexcept to override functions during code completion --- clang/lib/Sema/SemaCodeComplete.cpp | 27 +++++++++++++++++++++++++ clang/test/CodeCompletion/overrides.cpp | 14 +++++++++++++ 2 files changed, 41 insertions(+) diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index f9f7c192f19d2..78d4586e45978 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -26,6 +26,7 @@ #include "clang/AST/Type.h" #include "clang/Basic/AttributeCommonInfo.h" #include "clang/Basic/CharInfo.h" +#include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/OperatorKinds.h" #include "clang/Basic/Specifiers.h" #include "clang/Lex/HeaderSearch.h" @@ -3427,6 +3428,25 @@ AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result, Result.AddInformativeChunk(Result.getAllocator().CopyString(QualsStr)); } +static void +AddFunctionExceptSpecToCompletionString(std::string &NameAndSignature, + const FunctionDecl *Function) { + const auto *Proto = Function->getType()->getAs<FunctionProtoType>(); + if (!Proto) + return; + + auto ExceptInfo = Proto->getExceptionSpecInfo(); + switch (ExceptInfo.Type) { + case EST_BasicNoexcept: + case EST_NoexceptTrue: + NameAndSignature += " noexcept"; + break; + + default: + break; + } +} + /// Add the name of the given declaration static void AddTypedNameChunk(ASTContext &Context, const PrintingPolicy &Policy, const NamedDecl *ND, @@ -3642,6 +3662,13 @@ CodeCompletionResult::createCodeCompletionStringForOverride( std::string NameAndSignature; // For overrides all chunks go into the result, none are informative. printOverrideString(*CCS, BeforeName, NameAndSignature); + + // If the virtual function is declared with "noexcept", add it in the result + // code completion string. + const auto *VirtualFunc = dyn_cast<FunctionDecl>(Declaration); + assert(VirtualFunc && "overridden decl must be a function"); + AddFunctionExceptSpecToCompletionString(NameAndSignature, VirtualFunc); + NameAndSignature += " override"; Result.AddTextChunk(Result.getAllocator().CopyString(BeforeName)); diff --git a/clang/test/CodeCompletion/overrides.cpp b/clang/test/CodeCompletion/overrides.cpp index 7f330904eede9..fcafe03021f1a 100644 --- a/clang/test/CodeCompletion/overrides.cpp +++ b/clang/test/CodeCompletion/overrides.cpp @@ -41,3 +41,17 @@ void func() { // Runs completion at empty line on line 37. // RUN: not %clang_cc1 -fsyntax-only -code-completion-at=%s:%(line-5):1 %s -o - | FileCheck -check-prefix=CHECK-CC4 %s // CHECK-CC4: COMPLETION: Pattern : void vfunc(bool param, int p) override{{$}} + +class NoexceptBase { + public: + virtual void method() noexcept; +}; + +class NoexceptDerived : public NoexceptBase { + public: + met; +}; + +// Runs completion at met^ in the body of NoexceptDerived. +// RUN: not %clang_cc1 -fsyntax-only -code-completion-at=%s:%(line-4):6 %s -o - | FileCheck -check-prefix=CHECK-CC5 %s +// CHECK-CC5: COMPLETION: Pattern : void method() noexcept override{{$}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits