diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -14,6 +14,7 @@ #include "clang/AST/DeclarationName.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/RecursiveASTVisitor.h" +#include "clang/Basic/Builtins.h" #include "clang/Basic/SourceManager.h" #include "llvm/ADT/ScopeExit.h" @@ -400,8 +401,9 @@ NameVec ParameterNames = chooseParameterNames(Callee, ArgCount); // Exclude setters (i.e. functions with one argument whose name begins with - // "set"), as their parameter name is also not likely to be interesting. - if (isSetter(Callee, ParameterNames)) + // "set"), and builtins like std::move/forward/... as their parameter name + // is also not likely to be interesting. + if (isSetter(Callee, ParameterNames) || isSimpleBuiltin(Callee)) return; for (size_t I = 0; I < ArgCount; ++I) { @@ -440,6 +442,21 @@ return WhatItIsSetting.equals_insensitive(ParamNames[0]); } + // Checks if the callee is one of the builtins + // addressof, as_const, forward, move(_if_noexcept) + static bool isSimpleBuiltin(const FunctionDecl *Callee) { + switch (Callee->getBuiltinID()) { + case Builtin::BIaddressof: + case Builtin::BIas_const: + case Builtin::BIforward: + case Builtin::BImove: + case Builtin::BImove_if_noexcept: + return true; + default: + return false; + } + } + bool shouldHintName(const Expr *Arg, StringRef ParamName) { if (ParamName.empty()) return false; diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -555,6 +555,17 @@ ExpectedHint{"timeout_millis: ", "timeout_millis"}); } +TEST(ParameterHints, BuiltinFunctions) { + // This prototype of std::forward is sufficient for clang to recognize it + assertParameterHints(R"cpp( + namespace std { template T&& forward(T&); } + void foo() { + int i; + std::forward(i); + } + )cpp"); +} + TEST(ParameterHints, IncludeAtNonGlobalScope) { Annotations FooInc(R"cpp( void bar() { foo(42); }