Author: Haojian Wu Date: 2022-01-19T14:18:38+01:00 New Revision: 6c78703e3abcd9c76aefbf066869fe6a32d59516
URL: https://github.com/llvm/llvm-project/commit/6c78703e3abcd9c76aefbf066869fe6a32d59516 DIFF: https://github.com/llvm/llvm-project/commit/6c78703e3abcd9c76aefbf066869fe6a32d59516.diff LOG: [AST] Fix the incorrect auto-keyword loc for constrained auto type loc. E.g. `Concept auto Func();` The nameLoc for the constained auto type loc pointed to the concept name loc, it should be the auto token loc. This patch fixes it, and remove a relevant hack in clang-tidy check. Reviewed By: sammccall Differential Revision: https://reviews.llvm.org/D117009 Added: Modified: clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp clang/lib/Parse/ParseDecl.cpp clang/unittests/AST/SourceLocationTest.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp index 2b9907d162664..60b80af35c7d8 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp @@ -285,31 +285,6 @@ SourceRange UseTrailingReturnTypeCheck::findReturnTypeAndCVSourceRange( return {}; } - // If the return type is a constrained 'auto', we need to include the token - // after the concept. Unfortunately, the source range of an AutoTypeLoc, if it - // is constrained, does not include the 'auto'. - // FIXME: fix the AutoTypeLoc location in clang. - auto ATL = ReturnLoc.getAs<AutoTypeLoc>(); - if (ATL && ATL.isConstrained() && !ATL.isDecltypeAuto()) { - SourceLocation End = - expandIfMacroId(ReturnLoc.getSourceRange().getEnd(), SM); - SourceLocation BeginNameF = expandIfMacroId(F.getLocation(), SM); - - // Extend the ReturnTypeRange until the last token before the function - // name. - std::pair<FileID, unsigned> Loc = SM.getDecomposedLoc(End); - StringRef File = SM.getBufferData(Loc.first); - const char *TokenBegin = File.data() + Loc.second; - Lexer Lexer(SM.getLocForStartOfFile(Loc.first), LangOpts, File.begin(), - TokenBegin, File.end()); - Token T; - SourceLocation LastTLoc = End; - while (!Lexer.LexFromRawLexer(T) && - SM.isBeforeInTranslationUnit(T.getLocation(), BeginNameF)) { - LastTLoc = T.getLocation(); - } - ReturnTypeRange.setEnd(LastTLoc); - } // If the return type has no local qualifiers, it's source range is accurate. if (!hasAnyNestedLocalQualifiers(F.getReturnType())) diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index cff8c76183f6a..f21938c81689b 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -3582,7 +3582,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, isInvalid = DS.SetTypeSpecType(TST_decltype_auto, Loc, PrevSpec, DiagID, TemplateId, Policy); } else { - isInvalid = DS.SetTypeSpecType(TST_auto, Loc, PrevSpec, DiagID, + isInvalid = DS.SetTypeSpecType(TST_auto, AutoLoc, PrevSpec, DiagID, TemplateId, Policy); } break; diff --git a/clang/unittests/AST/SourceLocationTest.cpp b/clang/unittests/AST/SourceLocationTest.cpp index a798f6b2225ba..28205c212f61d 100644 --- a/clang/unittests/AST/SourceLocationTest.cpp +++ b/clang/unittests/AST/SourceLocationTest.cpp @@ -247,6 +247,14 @@ TEST(TypeLoc, AutoTypeLocRange) { Verifier.expectRange(1, 1, 1, 14); EXPECT_TRUE(Verifier.match("decltype(auto) a = 1;", typeLoc(loc(autoType())), Lang_CXX14)); + + const char *Code = + R"cpp(template <typename T> concept C = true; +C auto abc(); +)cpp"; + // Should include "C auto" tokens. + Verifier.expectRange(2, 1, 2, 3); // token range. + EXPECT_TRUE(Verifier.match(Code, typeLoc(loc(autoType())), Lang_CXX20)); } TEST(TypeLoc, LongDoubleRange) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits