[clang-tools-extra] [clangd] Guard against trivial FunctionProtoTypeLoc when creating inlay hints (PR #143087)

Nathan Ridge via cfe-commits cfe-commits at lists.llvm.org
Sat Jun 7 00:36:08 PDT 2025


================
@@ -368,6 +368,14 @@ static FunctionProtoTypeLoc getPrototypeLoc(Expr *Fn) {
   }
 
   if (auto F = Target.getAs<FunctionProtoTypeLoc>()) {
+    // In some edge cases the AST can contain a "trivial" FunctionProtoTypeLoc
+    // which has null parameters. Avoid these as they don't contain useful
+    // information.
+    for (const auto *Param : F.getParams()) {
----------------
HighCommander4 wrote:

My impression from having read some of the related code is that it's a known deficiency that having null parameters can sometimes happen.

`TypeLoc` has a method named [`initialize()`](https://searchfox.org/llvm/rev/269c29ae67e54bd3243535a7c58d0f30d1eb9036/clang/include/clang/AST/TypeLoc.h#201), which is described as follows:

```c++
  /// Initializes this to state that every location in this
  /// type is the given location.
  ///
  /// This method exists to provide a simple transition for code that
  /// relies on location-less types.
  void initialize(ASTContext &Context, SourceLocation Loc) const {
```

The implementation of `initialize` for `FunctionTypeLoc` [does set the parameters to null](https://searchfox.org/llvm/rev/269c29ae67e54bd3243535a7c58d0f30d1eb9036/clang/include/clang/AST/TypeLoc.h#1579).

And there are various places in the code where we call `initialize`. In addition to the `noreturn` scenario exercised in this patch's testcase, which will be improved in https://github.com/llvm/llvm-project/pull/143143, another notable call site is [`ASTContext::getTrivialTypeSourceInfo`](https://searchfox.org/llvm/rev/269c29ae67e54bd3243535a7c58d0f30d1eb9036/clang/lib/AST/ASTContext.cpp#3132). That in turn has [many callers](https://searchfox.org/llvm/search?q=symbol:_ZNK5clang10ASTContext24getTrivialTypeSourceInfoENS_8QualTypeENS_14SourceLocationE&redirect=false), including [this one](https://searchfox.org/llvm/rev/269c29ae67e54bd3243535a7c58d0f30d1eb9036/clang/lib/Sema/SemaType.cpp#5679) used to handle an invalid declarator.

https://github.com/llvm/llvm-project/pull/143087


More information about the cfe-commits mailing list