[cfe-commits] r157064 - in /cfe/trunk: include/clang/Lex/Lexer.h lib/Lex/Lexer.cpp lib/Lex/PPDirectives.cpp
Benjamin Kramer
benny.kra at googlemail.com
Sat May 26 11:44:51 PDT 2012
On 26.05.2012, at 20:33, Igor Minin wrote:
> It breaks compilation for me:
>
> llvm[4]: Compiling PPDirectives.cpp for Debug+Asserts build
> /home/igor/SRC/llvm/tools/clang/lib/Lex/PPDirectives.cpp: In member
> function ‘void clang::Preprocessor::HandleUserDiagnosticDirective(clang::Token&,
> bool)’:
> /home/igor/SRC/llvm/tools/clang/lib/Lex/PPDirectives.cpp:1026: error:
> ‘class llvm::StringRef’ has no member named ‘ltrim’
Looks like your clang and llvm trees are not in sync. ltrim was added to llvm in r156652.
- Ben
>
>
> On Fri, May 18, 2012 at 11:32 PM, Benjamin Kramer
> <benny.kra at googlemail.com> wrote:
>>
>> Author: d0k
>> Date: Fri May 18 14:32:16 2012
>> New Revision: 157064
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=157064&view=rev
>> Log:
>> Lexer::ReadToEndOfLine: Only build the string if it's actually used and do so in a less malloc-intensive way.
>>
>> Modified:
>> cfe/trunk/include/clang/Lex/Lexer.h
>> cfe/trunk/lib/Lex/Lexer.cpp
>> cfe/trunk/lib/Lex/PPDirectives.cpp
>>
>> Modified: cfe/trunk/include/clang/Lex/Lexer.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Lexer.h?rev=157064&r1=157063&r2=157064&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Lex/Lexer.h (original)
>> +++ cfe/trunk/include/clang/Lex/Lexer.h Fri May 18 14:32:16 2012
>> @@ -200,7 +200,7 @@
>>
>> /// ReadToEndOfLine - Read the rest of the current preprocessor line as an
>> /// uninterpreted string. This switches the lexer out of directive mode.
>> - std::string ReadToEndOfLine();
>> + void ReadToEndOfLine(SmallVectorImpl<char> *Result = 0);
>>
>>
>> /// Diag - Forwarding function for diagnostics. This translate a source
>>
>> Modified: cfe/trunk/lib/Lex/Lexer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=157064&r1=157063&r2=157064&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/Lexer.cpp (original)
>> +++ cfe/trunk/lib/Lex/Lexer.cpp Fri May 18 14:32:16 2012
>> @@ -2286,10 +2286,9 @@
>>
>> /// ReadToEndOfLine - Read the rest of the current preprocessor line as an
>> /// uninterpreted string. This switches the lexer out of directive mode.
>> -std::string Lexer::ReadToEndOfLine() {
>> +void Lexer::ReadToEndOfLine(SmallVectorImpl<char> *Result) {
>> assert(ParsingPreprocessorDirective && ParsingFilename == false &&
>> "Must be in a preprocessing directive!");
>> - std::string Result;
>> Token Tmp;
>>
>> // CurPtr - Cache BufferPtr in an automatic variable.
>> @@ -2298,7 +2297,8 @@
>> char Char = getAndAdvanceChar(CurPtr, Tmp);
>> switch (Char) {
>> default:
>> - Result += Char;
>> + if (Result)
>> + Result->push_back(Char);
>> break;
>> case 0: // Null.
>> // Found end of file?
>> @@ -2306,11 +2306,12 @@
>> if (isCodeCompletionPoint(CurPtr-1)) {
>> PP->CodeCompleteNaturalLanguage();
>> cutOffLexing();
>> - return Result;
>> + return;
>> }
>>
>> // Nope, normal character, continue.
>> - Result += Char;
>> + if (Result)
>> + Result->push_back(Char);
>> break;
>> }
>> // FALL THROUGH.
>> @@ -2329,8 +2330,8 @@
>> }
>> assert(Tmp.is(tok::eod) && "Unexpected token!");
>>
>> - // Finally, we're done, return the string we found.
>> - return Result;
>> + // Finally, we're done;
>> + return;
>> }
>> }
>> }
>>
>> Modified: cfe/trunk/lib/Lex/PPDirectives.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=157064&r1=157063&r2=157064&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/PPDirectives.cpp (original)
>> +++ cfe/trunk/lib/Lex/PPDirectives.cpp Fri May 18 14:32:16 2012
>> @@ -1018,15 +1018,13 @@
>> // tokens. For example, this is allowed: "#warning ` 'foo". GCC does
>> // collapse multiple consequtive white space between tokens, but this isn't
>> // specified by the standard.
>> - std::string Message = CurLexer->ReadToEndOfLine();
>> + SmallString<128> Message;
>> + CurLexer->ReadToEndOfLine(&Message);
>>
>> // Find the first non-whitespace character, so that we can make the
>> // diagnostic more succinct.
>> - StringRef Msg(Message);
>> - size_t i = Msg.find_first_not_of(' ');
>> - if (i < Msg.size())
>> - Msg = Msg.substr(i);
>> -
>> + StringRef Msg = Message.str().ltrim(" ");
>> +
>> if (isWarning)
>> Diag(Tok, diag::pp_hash_warning) << Msg;
>> else
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list