[clang] [Clang] enhance diagnostic by attaching source location to deduced type in trailing return without auto (PR #115786)

Oleksandr T. via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 12 08:07:02 PST 2024


================
@@ -4887,9 +4887,18 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state,
                       cast<AutoType>(T)->getKeyword() !=
                           AutoTypeKeyword::Auto ||
                       cast<AutoType>(T)->isConstrained())) {
-            S.Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
-                   diag::err_trailing_return_without_auto)
-                << T << D.getDeclSpec().getSourceRange();
+            SourceLocation Loc = D.getDeclSpec().getTypeSpecTypeLoc();
+            SourceRange SR = D.getDeclSpec().getSourceRange();
+            if (Loc.isInvalid()) {
+              TypeSourceInfo *TSI = nullptr;
+              S.GetTypeFromParser(FTI.getTrailingReturnType(), &TSI);
+              if (TSI) {
+                TypeLoc TSILoc = TSI->getTypeLoc();
+                Loc = TSILoc.getBeginLoc();
+                SR = TSILoc.getSourceRange();
+              }
+            }
+            S.Diag(Loc, diag::err_trailing_return_without_auto) << T << SR;
----------------
a-tarasyuk wrote:

@Fznamznon @Sirraide Is the following range acceptable?

```cpp
template <typename T> struct B {
  // CHECK:      error: function with trailing return type must specify return type 'auto', not 'void'
  // CHECK-NEXT: {{^}}  template <class U> B(U) -> B<int>;
  // CHECK-NEXT: {{^}}                     ~~~~~~~~^~~~~~{{$}}
  template <class U> B(U) -> B<int>;
};
```

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


More information about the cfe-commits mailing list