[cfe-commits] r64941 - /cfe/trunk/lib/Sema/SemaChecking.cpp

Chris Lattner sabre at nondot.org
Wed Feb 18 11:26:43 PST 2009


Author: lattner
Date: Wed Feb 18 13:26:42 2009
New Revision: 64941

URL: http://llvm.org/viewvc/llvm-project?rev=64941&view=rev
Log:
final string diagnostic issue (that I know about):
we used to not account for escapes in strings with
string concat.  Before:

t.m:5:20: warning: field width should have type 'int', but argument has type 'unsigned int'
  printf("\n\n" "\n\n%*d", (unsigned) 1, 1);
                   ^       ~~~~~~~~~~~~

after:

t.m:5:23: warning: field width should have type 'int', but argument has type 'unsigned int'
  printf("\n\n" "\n\n%*d", (unsigned) 1, 1);
                      ^    ~~~~~~~~~~~~


Modified:
    cfe/trunk/lib/Sema/SemaChecking.cpp

Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=64941&r1=64940&r2=64941&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Feb 18 13:26:42 2009
@@ -32,8 +32,6 @@
                                                     unsigned ByteNo) const {
   assert(!SL->isWide() && "This doesn't work for wide strings yet");
   
-  llvm::SmallString<16> SpellingBuffer;
-  
   // Loop over all of the tokens in this string until we find the one that
   // contains the byte we're looking for.
   unsigned TokNo = 0;
@@ -64,21 +62,10 @@
     Token TheTok;
     TheLexer.LexFromRawLexer(TheTok);
     
-    // We generally care about the length of the token, which is known by the 
-    // lexer as long as we don't need to clean it (trigraphs/newlines).
-    unsigned TokNumBytes;
-    if (!TheTok.needsCleaning()) {
-      TokNumBytes = TheTok.getLength();
-    } else {
-      // Get the spelling of the token to remove trigraphs and escaped newlines.
-      SpellingBuffer.resize(TheTok.getLength());
-      const char *SpellingPtr = &SpellingBuffer[0];
-      TokNumBytes = PP.getSpelling(TheTok, SpellingPtr);
-    }
+    // Use the StringLiteralParser to compute the length of the string in bytes.
+    StringLiteralParser SLP(&TheTok, 1, PP);
+    unsigned TokNumBytes = SLP.GetStringLength();
     
-    // The length of the string is the token length minus the two quotes.
-    TokNumBytes -= 2;
-
     // If the byte is in this token, return the location of the byte.
     if (ByteNo < TokNumBytes ||
         (ByteNo == TokNumBytes && TokNo == SL->getNumConcatenated())) {





More information about the cfe-commits mailing list