diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-04-30 05:25:48 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-04-30 05:25:48 +0000 |
| commit | b5f8171a1b955e07c13226d353f4ca53f75a0e8a (patch) | |
| tree | ee5ec5faca7f0d2d43d989d9134938fb80037073 /clang/lib/ARCMigrate | |
| parent | 64e7a16fe4e8e16792aae1469f298ab658a13454 (diff) | |
| download | bcm5719-llvm-b5f8171a1b955e07c13226d353f4ca53f75a0e8a.tar.gz bcm5719-llvm-b5f8171a1b955e07c13226d353f4ca53f75a0e8a.zip | |
PR37189 Fix incorrect end source location and spelling for a split '>>' token.
When a '>>' token is split into two '>' tokens (in C++11 onwards), or (as an
extension) when we do the same for other tokens starting with a '>', we can't
just use a location pointing to the first '>' as the location of the split
token, because that would result in our miscomputing the length and spelling
for the token. As a consequence, for example, a refactoring replacing 'A<X>'
with something else would sometimes replace one character too many, and
similarly diagnostics highlighting a template-id source range would highlight
one character too many.
Fix this by creating an expansion range covering the first character of the
'>>' token, whose spelling is '>'. For this to work, we generalize the
expansion range of a macro FileID to be either a token range (the common case)
or a character range (used in this new case).
llvm-svn: 331155
Diffstat (limited to 'clang/lib/ARCMigrate')
| -rw-r--r-- | clang/lib/ARCMigrate/PlistReporter.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/ARCMigrate/TransGCAttrs.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/ARCMigrate/TransUnbridgedCasts.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/ARCMigrate/TransformActions.cpp | 8 |
4 files changed, 12 insertions, 9 deletions
diff --git a/clang/lib/ARCMigrate/PlistReporter.cpp b/clang/lib/ARCMigrate/PlistReporter.cpp index 9a51690c0ce..2ad1c8591a9 100644 --- a/clang/lib/ARCMigrate/PlistReporter.cpp +++ b/clang/lib/ARCMigrate/PlistReporter.cpp @@ -107,8 +107,7 @@ void arcmt::writeARCDiagsToPlist(const std::string &outPath, o << " <key>ranges</key>\n"; o << " <array>\n"; for (auto &R : D.getRanges()) { - CharSourceRange ExpansionRange(SM.getExpansionRange(R.getAsRange()), - R.isTokenRange()); + CharSourceRange ExpansionRange = SM.getExpansionRange(R); EmitRange(o, SM, Lexer::getAsCharRange(ExpansionRange, SM, LangOpts), FM, 4); } diff --git a/clang/lib/ARCMigrate/TransGCAttrs.cpp b/clang/lib/ARCMigrate/TransGCAttrs.cpp index 2ae6b78a463..a8ca14b19bb 100644 --- a/clang/lib/ARCMigrate/TransGCAttrs.cpp +++ b/clang/lib/ARCMigrate/TransGCAttrs.cpp @@ -92,7 +92,7 @@ public: ASTContext &Ctx = MigrateCtx.Pass.Ctx; SourceManager &SM = Ctx.getSourceManager(); if (Loc.isMacroID()) - Loc = SM.getImmediateExpansionRange(Loc).first; + Loc = SM.getImmediateExpansionRange(Loc).getBegin(); SmallString<32> Buf; bool Invalid = false; StringRef Spell = Lexer::getSpelling( @@ -287,7 +287,8 @@ static void checkAllAtProps(MigrationContext &MigrateCtx, SourceLocation Loc = ATLs[i].first.getAttrNameLoc(); if (Loc.isMacroID()) Loc = MigrateCtx.Pass.Ctx.getSourceManager() - .getImmediateExpansionRange(Loc).first; + .getImmediateExpansionRange(Loc) + .getBegin(); TA.remove(Loc); TA.clearDiagnostic(diag::err_objc_property_attr_mutually_exclusive, AtLoc); TA.clearDiagnostic(diag::err_arc_inconsistent_property_ownership, diff --git a/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp b/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp index 7ca49558a7f..de52bef4d20 100644 --- a/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp +++ b/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp @@ -283,13 +283,12 @@ private: SourceManager &SM = Pass.Ctx.getSourceManager(); SourceLocation Loc = E->getExprLoc(); assert(Loc.isMacroID()); - SourceLocation MacroBegin, MacroEnd; - std::tie(MacroBegin, MacroEnd) = SM.getImmediateExpansionRange(Loc); + CharSourceRange MacroRange = SM.getImmediateExpansionRange(Loc); SourceRange SubRange = E->getSubExpr()->IgnoreParenImpCasts()->getSourceRange(); SourceLocation InnerBegin = SM.getImmediateMacroCallerLoc(SubRange.getBegin()); SourceLocation InnerEnd = SM.getImmediateMacroCallerLoc(SubRange.getEnd()); - Outer = SourceRange(MacroBegin, MacroEnd); + Outer = MacroRange.getAsRange(); Inner = SourceRange(InnerBegin, InnerEnd); } diff --git a/clang/lib/ARCMigrate/TransformActions.cpp b/clang/lib/ARCMigrate/TransformActions.cpp index 4f3fb584592..7439eb28594 100644 --- a/clang/lib/ARCMigrate/TransformActions.cpp +++ b/clang/lib/ARCMigrate/TransformActions.cpp @@ -590,8 +590,12 @@ StringRef TransformActionsImpl::getUniqueText(StringRef text) { SourceLocation TransformActionsImpl::getLocForEndOfToken(SourceLocation loc, SourceManager &SM, Preprocessor &PP) { - if (loc.isMacroID()) - loc = SM.getExpansionRange(loc).second; + if (loc.isMacroID()) { + CharSourceRange Exp = SM.getExpansionRange(loc); + if (Exp.isCharRange()) + return Exp.getEnd(); + loc = Exp.getEnd(); + } return PP.getLocForEndOfToken(loc); } |

