diff options
Diffstat (limited to 'clang/lib/Lex/Lexer.cpp')
-rw-r--r-- | clang/lib/Lex/Lexer.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp index 648bda270578..a559ca3eac2b 100644 --- a/clang/lib/Lex/Lexer.cpp +++ b/clang/lib/Lex/Lexer.cpp @@ -29,6 +29,7 @@ #include "clang/Basic/TokenKinds.h" #include "llvm/ADT/None.h" #include "llvm/ADT/Optional.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/StringRef.h" @@ -253,7 +254,7 @@ template <typename T> static void StringifyImpl(T &Str, char Quote) { } std::string Lexer::Stringify(StringRef Str, bool Charify) { - std::string Result = Str; + std::string Result = std::string(Str); char Quote = Charify ? '\'' : '"'; StringifyImpl(Result, Quote); return Result; @@ -1861,7 +1862,7 @@ const char *Lexer::LexUDSuffix(Token &Result, const char *CurPtr, char Next = getCharAndSizeNoWarn(CurPtr + Consumed, NextSize, getLangOpts()); if (!isIdentifierBody(Next)) { - // End of suffix. Check whether this is on the whitelist. + // End of suffix. Check whether this is on the allowed list. const StringRef CompleteSuffix(Buffer, Chars); IsUDSuffix = StringLiteralParser::isValidUDSuffix(getLangOpts(), CompleteSuffix); @@ -2092,7 +2093,8 @@ void Lexer::codeCompleteIncludedFile(const char *PathStart, bool IsAngled) { // Completion only applies to the filename, after the last slash. StringRef PartialPath(PathStart, CompletionPoint - PathStart); - auto Slash = PartialPath.find_last_of(LangOpts.MSVCCompat ? "/\\" : "/"); + llvm::StringRef SlashChars = LangOpts.MSVCCompat ? "/\\" : "/"; + auto Slash = PartialPath.find_last_of(SlashChars); StringRef Dir = (Slash == StringRef::npos) ? "" : PartialPath.take_front(Slash); const char *StartOfFilename = @@ -2100,7 +2102,8 @@ void Lexer::codeCompleteIncludedFile(const char *PathStart, // Code completion filter range is the filename only, up to completion point. PP->setCodeCompletionIdentifierInfo(&PP->getIdentifierTable().get( StringRef(StartOfFilename, CompletionPoint - StartOfFilename))); - // We should replace the characters up to the closing quote, if any. + // We should replace the characters up to the closing quote or closest slash, + // if any. while (CompletionPoint < BufferEnd) { char Next = *(CompletionPoint + 1); if (Next == 0 || Next == '\r' || Next == '\n') @@ -2108,7 +2111,10 @@ void Lexer::codeCompleteIncludedFile(const char *PathStart, ++CompletionPoint; if (Next == (IsAngled ? '>' : '"')) break; + if (llvm::is_contained(SlashChars, Next)) + break; } + PP->setCodeCompletionTokenRange( FileLoc.getLocWithOffset(StartOfFilename - BufferStart), FileLoc.getLocWithOffset(CompletionPoint - BufferStart)); @@ -2552,8 +2558,8 @@ bool Lexer::SkipBlockComment(Token &Result, const char *CurPtr, '/', '/', '/', '/', '/', '/', '/', '/', '/', '/', '/', '/', '/', '/', '/', '/' }; - while (CurPtr+16 <= BufferEnd && - !vec_any_eq(*(const vector unsigned char*)CurPtr, Slashes)) + while (CurPtr + 16 <= BufferEnd && + !vec_any_eq(*(const __vector unsigned char *)CurPtr, Slashes)) CurPtr += 16; #else // Scan for '/' quickly. Many block comments are very large. @@ -3694,7 +3700,7 @@ LexNextToken: } else if (Char == '=') { char After = getCharAndSize(CurPtr+SizeTmp, SizeTmp2); if (After == '>') { - if (getLangOpts().CPlusPlus2a) { + if (getLangOpts().CPlusPlus20) { if (!isLexingRawMode()) Diag(BufferPtr, diag::warn_cxx17_compat_spaceship); CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), @@ -3705,7 +3711,7 @@ LexNextToken: // Suggest adding a space between the '<=' and the '>' to avoid a // change in semantics if this turns up in C++ <=17 mode. if (getLangOpts().CPlusPlus && !isLexingRawMode()) { - Diag(BufferPtr, diag::warn_cxx2a_compat_spaceship) + Diag(BufferPtr, diag::warn_cxx20_compat_spaceship) << FixItHint::CreateInsertion( getSourceLocation(CurPtr + SizeTmp, SizeTmp2), " "); } |