@@ -113,7 +113,7 @@ struct UnqualNameVisitor : public RecursiveASTVisitor<UnqualNameVisitor> {
113113};
114114} // namespace
115115
116- constexpr llvm::StringLiteral Message =
116+ constexpr llvm::StringLiteral ErrorMessageOnFunction =
117117 " use a trailing return type for this function" ;
118118
119119static SourceLocation expandIfMacroId (SourceLocation Loc,
@@ -125,7 +125,7 @@ static SourceLocation expandIfMacroId(SourceLocation Loc,
125125 return Loc;
126126}
127127
128- SourceLocation UseTrailingReturnTypeCheck:: findTrailingReturnTypeSourceLocation (
128+ static SourceLocation findTrailingReturnTypeSourceLocation (
129129 const FunctionDecl &F, const FunctionTypeLoc &FTL, const ASTContext &Ctx,
130130 const SourceManager &SM, const LangOptions &LangOpts) {
131131 // We start with the location of the closing parenthesis.
@@ -217,10 +217,11 @@ classifyToken(const FunctionDecl &F, Preprocessor &PP, Token Tok) {
217217 return CT;
218218}
219219
220- std::optional<SmallVector<ClassifiedToken, 8 >>
221- UseTrailingReturnTypeCheck::classifyTokensBeforeFunctionName (
222- const FunctionDecl &F, const ASTContext &Ctx, const SourceManager &SM,
223- const LangOptions &LangOpts) {
220+ static std::optional<SmallVector<ClassifiedToken, 8 >>
221+ classifyTokensBeforeFunctionName (const FunctionDecl &F, const ASTContext &Ctx,
222+ const SourceManager &SM,
223+ const LangOptions &LangOpts,
224+ Preprocessor *PP) {
224225 SourceLocation BeginF = expandIfMacroId (F.getBeginLoc (), SM);
225226 SourceLocation BeginNameF = expandIfMacroId (F.getLocation (), SM);
226227
@@ -242,7 +243,6 @@ UseTrailingReturnTypeCheck::classifyTokensBeforeFunctionName(
242243 const MacroInfo *MI = PP->getMacroInfo (&Info);
243244 if (!MI || MI->isFunctionLike ()) {
244245 // Cannot handle function style macros.
245- diag (F.getLocation (), Message);
246246 return std::nullopt ;
247247 }
248248 }
@@ -253,10 +253,8 @@ UseTrailingReturnTypeCheck::classifyTokensBeforeFunctionName(
253253
254254 if (std::optional<ClassifiedToken> CT = classifyToken (F, *PP, T))
255255 ClassifiedTokens.push_back (*CT);
256- else {
257- diag (F.getLocation (), Message);
256+ else
258257 return std::nullopt ;
259- }
260258 }
261259
262260 return ClassifiedTokens;
@@ -273,17 +271,17 @@ static bool hasAnyNestedLocalQualifiers(QualType Type) {
273271 return Result;
274272}
275273
276- SourceRange UseTrailingReturnTypeCheck::findReturnTypeAndCVSourceRange (
277- const FunctionDecl &F, const TypeLoc &ReturnLoc, const ASTContext &Ctx,
278- const SourceManager &SM, const LangOptions &LangOpts) {
274+ static SourceRange
275+ findReturnTypeAndCVSourceRange (const FunctionDecl &F, const TypeLoc &ReturnLoc,
276+ const ASTContext &Ctx, const SourceManager &SM,
277+ const LangOptions &LangOpts, Preprocessor *PP) {
279278
280279 // We start with the range of the return type and expand to neighboring
281280 // qualifiers (const, volatile and restrict).
282281 SourceRange ReturnTypeRange = F.getReturnTypeSourceRange ();
283282 if (ReturnTypeRange.isInvalid ()) {
284283 // Happens if e.g. clang cannot resolve all includes and the return type is
285284 // unknown.
286- diag (F.getLocation (), Message);
287285 return {};
288286 }
289287
@@ -294,7 +292,7 @@ SourceRange UseTrailingReturnTypeCheck::findReturnTypeAndCVSourceRange(
294292
295293 // Include qualifiers to the left and right of the return type.
296294 std::optional<SmallVector<ClassifiedToken, 8 >> MaybeTokens =
297- classifyTokensBeforeFunctionName (F, Ctx, SM, LangOpts);
295+ classifyTokensBeforeFunctionName (F, Ctx, SM, LangOpts, PP );
298296 if (!MaybeTokens)
299297 return {};
300298 const SmallVector<ClassifiedToken, 8 > &Tokens = *MaybeTokens;
@@ -331,10 +329,11 @@ SourceRange UseTrailingReturnTypeCheck::findReturnTypeAndCVSourceRange(
331329 return ReturnTypeRange;
332330}
333331
334- void UseTrailingReturnTypeCheck::keepSpecifiers (
335- std::string &ReturnType, std::string &Auto, SourceRange ReturnTypeCVRange,
336- const FunctionDecl &F, const FriendDecl *Fr, const ASTContext &Ctx,
337- const SourceManager &SM, const LangOptions &LangOpts) {
332+ static void keepSpecifiers (std::string &ReturnType, std::string &Auto,
333+ SourceRange ReturnTypeCVRange, const FunctionDecl &F,
334+ const FriendDecl *Fr, const ASTContext &Ctx,
335+ const SourceManager &SM, const LangOptions &LangOpts,
336+ Preprocessor *PP) {
338337 // Check if there are specifiers inside the return type. E.g. unsigned
339338 // inline int.
340339 const auto *M = dyn_cast<CXXMethodDecl>(&F);
@@ -346,7 +345,7 @@ void UseTrailingReturnTypeCheck::keepSpecifiers(
346345 // Tokenize return type. If it contains macros which contain a mix of
347346 // qualifiers, specifiers and types, give up.
348347 std::optional<SmallVector<ClassifiedToken, 8 >> MaybeTokens =
349- classifyTokensBeforeFunctionName (F, Ctx, SM, LangOpts);
348+ classifyTokensBeforeFunctionName (F, Ctx, SM, LangOpts, PP );
350349 if (!MaybeTokens)
351350 return ;
352351
@@ -423,7 +422,7 @@ void UseTrailingReturnTypeCheck::check(const MatchFinder::MatchResult &Result) {
423422 if (F->getDeclaredReturnType ()->isFunctionPointerType () ||
424423 F->getDeclaredReturnType ()->isMemberFunctionPointerType () ||
425424 F->getDeclaredReturnType ()->isMemberPointerType ()) {
426- diag (F->getLocation (), Message );
425+ diag (F->getLocation (), ErrorMessageOnFunction );
427426 return ;
428427 }
429428
@@ -440,24 +439,26 @@ void UseTrailingReturnTypeCheck::check(const MatchFinder::MatchResult &Result) {
440439 // FIXME: This may happen if we have __attribute__((...)) on the function.
441440 // We abort for now. Remove this when the function type location gets
442441 // available in clang.
443- diag (F->getLocation (), Message );
442+ diag (F->getLocation (), ErrorMessageOnFunction );
444443 return ;
445444 }
446445
447446 SourceLocation InsertionLoc =
448447 findTrailingReturnTypeSourceLocation (*F, FTL, Ctx, SM, LangOpts);
449448 if (InsertionLoc.isInvalid ()) {
450- diag (F->getLocation (), Message );
449+ diag (F->getLocation (), ErrorMessageOnFunction );
451450 return ;
452451 }
453452
454453 // Using the declared return type via F->getDeclaredReturnType().getAsString()
455454 // discards user formatting and order of const, volatile, type, whitespace,
456455 // space before & ... .
457- SourceRange ReturnTypeCVRange =
458- findReturnTypeAndCVSourceRange (*F, FTL.getReturnLoc (), Ctx, SM, LangOpts);
459- if (ReturnTypeCVRange.isInvalid ())
456+ SourceRange ReturnTypeCVRange = findReturnTypeAndCVSourceRange (
457+ *F, FTL.getReturnLoc (), Ctx, SM, LangOpts, PP);
458+ if (ReturnTypeCVRange.isInvalid ()) {
459+ diag (F->getLocation (), ErrorMessageOnFunction);
460460 return ;
461+ }
461462
462463 // Check if unqualified names in the return type conflict with other entities
463464 // after the rewrite.
@@ -470,7 +471,7 @@ void UseTrailingReturnTypeCheck::check(const MatchFinder::MatchResult &Result) {
470471 UnqualNameVisitor UNV{*F};
471472 UNV.TraverseTypeLoc (FTL.getReturnLoc ());
472473 if (UNV.Collision ) {
473- diag (F->getLocation (), Message );
474+ diag (F->getLocation (), ErrorMessageOnFunction );
474475 return ;
475476 }
476477
@@ -486,10 +487,10 @@ void UseTrailingReturnTypeCheck::check(const MatchFinder::MatchResult &Result) {
486487 std::string Auto = NeedSpaceAfterAuto ? " auto " : " auto" ;
487488 std::string ReturnType =
488489 std::string (tooling::fixit::getText (ReturnTypeCVRange, Ctx));
489- keepSpecifiers (ReturnType, Auto, ReturnTypeCVRange, *F, Fr, Ctx, SM,
490- LangOpts );
490+ keepSpecifiers (ReturnType, Auto, ReturnTypeCVRange, *F, Fr, Ctx, SM, LangOpts,
491+ PP );
491492
492- diag (F->getLocation (), Message )
493+ diag (F->getLocation (), ErrorMessageOnFunction )
493494 << FixItHint::CreateReplacement (ReturnTypeCVRange, Auto)
494495 << FixItHint::CreateInsertion (InsertionLoc, " -> " + ReturnType);
495496}
0 commit comments