[cfe-commits] r119471 - in /cfe/trunk: include/clang/Lex/LiteralSupport.h lib/Lex/LiteralSupport.cpp lib/Sema/SemaChecking.cpp

Chris Lattner sabre at nondot.org
Tue Nov 16 22:46:14 PST 2010


Author: lattner
Date: Wed Nov 17 00:46:14 2010
New Revision: 119471

URL: http://llvm.org/viewvc/llvm-project?rev=119471&view=rev
Log:
push use of Preprocessor out farther.

Modified:
    cfe/trunk/include/clang/Lex/LiteralSupport.h
    cfe/trunk/lib/Lex/LiteralSupport.cpp
    cfe/trunk/lib/Sema/SemaChecking.cpp

Modified: cfe/trunk/include/clang/Lex/LiteralSupport.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/LiteralSupport.h?rev=119471&r1=119470&r2=119471&view=diff
==============================================================================
--- cfe/trunk/include/clang/Lex/LiteralSupport.h (original)
+++ cfe/trunk/include/clang/Lex/LiteralSupport.h Wed Nov 17 00:46:14 2010
@@ -141,7 +141,11 @@
 /// literals) (C99 5.1.1.2p1).
 class StringLiteralParser {
   Preprocessor &PP;
-
+  const SourceManager &SM;
+  const LangOptions &Features;
+  const TargetInfo &Target;
+  Diagnostic *Diags;
+  
   unsigned MaxTokenLength;
   unsigned SizeBound;
   unsigned wchar_tByteWidth;
@@ -168,11 +172,7 @@
   ///
   /// If the Diagnostics pointer is non-null, then this will do semantic
   /// checking of the string literal and emit errors and warnings.
-  static unsigned getOffsetOfStringByte(const Token &TheTok, unsigned ByteNo,
-                                        const SourceManager &SM,
-                                        const LangOptions &Features,
-                                        const TargetInfo &Target,
-                                        Diagnostic *Diags = 0);
+  unsigned getOffsetOfStringByte(const Token &TheTok, unsigned ByteNo) const;
 };
 
 }  // end namespace clang

Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=119471&r1=119470&r2=119471&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/LiteralSupport.cpp (original)
+++ cfe/trunk/lib/Lex/LiteralSupport.cpp Wed Nov 17 00:46:14 2010
@@ -168,8 +168,9 @@
 static bool ProcessUCNEscape(const char *&ThisTokBuf, const char *ThisTokEnd,
                              uint32_t &UcnVal, unsigned short &UcnLen,
                              SourceLocation Loc, Preprocessor &PP,
-                             bool Complain) {
-  if (!PP.getLangOptions().CPlusPlus && !PP.getLangOptions().C99)
+                             Diagnostic *Diags, 
+                             const LangOptions &Features) {
+  if (!Features.CPlusPlus && !Features.C99 && Diags)
     PP.Diag(Loc, diag::warn_ucn_not_valid_in_c89);
 
   // Save the beginning of the string (for error diagnostics).
@@ -179,7 +180,7 @@
   ThisTokBuf += 2;
 
   if (ThisTokBuf == ThisTokEnd || !isxdigit(*ThisTokBuf)) {
-    if (Complain)
+    if (Diags)
       PP.Diag(Loc, diag::err_ucn_escape_no_digits);
     return false;
   }
@@ -193,7 +194,7 @@
   }
   // If we didn't consume the proper number of digits, there is a problem.
   if (UcnLenSave) {
-    if (Complain)
+    if (Diags)
       PP.Diag(PP.AdvanceToTokenCharacter(Loc, ThisTokBuf-ThisTokBegin),
               diag::err_ucn_escape_incomplete);
     return false;
@@ -203,7 +204,7 @@
       (UcnVal != 0x24 && UcnVal != 0x40 && UcnVal != 0x60 )) // $, @, `
       || (UcnVal >= 0xD800 && UcnVal <= 0xDFFF)
       || (UcnVal > 0x10FFFF)) /* the maximum legal UTF32 value */ {
-    if (Complain)
+    if (Diags)
       PP.Diag(Loc, diag::err_ucn_escape_invalid);
     return false;
   }
@@ -217,13 +218,13 @@
 static void EncodeUCNEscape(const char *&ThisTokBuf, const char *ThisTokEnd,
                              char *&ResultBuf, bool &HadError,
                              SourceLocation Loc, Preprocessor &PP,
-                             bool wide,
-                             bool Complain) {
+                             bool wide, bool Complain) {
   typedef uint32_t UTF32;
   UTF32 UcnVal = 0;
   unsigned short UcnLen = 0;
-  if (!ProcessUCNEscape(ThisTokBuf, ThisTokEnd,
-                        UcnVal, UcnLen, Loc, PP, Complain)) {
+  if (!ProcessUCNEscape(ThisTokBuf, ThisTokEnd, UcnVal, UcnLen, Loc, PP,
+                        Complain ? &PP.getDiagnostics() : 0,
+                        PP.getLangOptions())){
     HadError = 1;
     return;
   }
@@ -723,8 +724,8 @@
       if (begin[1] == 'u' || begin[1] == 'U') {
         uint32_t utf32 = 0;
         unsigned short UcnLen = 0;
-        if (!ProcessUCNEscape(begin, end, utf32, UcnLen,
-                              Loc, PP, /*Complain=*/true)) {
+        if (!ProcessUCNEscape(begin, end, utf32, UcnLen, Loc, PP,
+                              &PP.getDiagnostics(), PP.getLangOptions())) {
           HadError = 1;
         }
         ResultChar = utf32;
@@ -824,7 +825,9 @@
 ///
 StringLiteralParser::
 StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
-                    Preprocessor &pp, bool Complain) : PP(pp) {
+                    Preprocessor &pp, bool Complain)
+  : PP(pp), SM(PP.getSourceManager()), Features(PP.getLangOptions()),
+    Target(PP.getTargetInfo()), Diags(Complain ? &PP.getDiagnostics() : 0) {
   // Scan all of the string portions, remember the max individual token length,
   // computing a bound on the concatenated string length, and see whether any
   // piece is a wide-string.  If any of the string portions is a wide-string
@@ -953,13 +956,10 @@
         continue;
       }
       // Otherwise, this is a non-UCN escape character.  Process it.
-      Diagnostic *Diags = Complain ? &PP.getDiagnostics() : 0;
       unsigned ResultChar =
         ProcessCharEscape(ThisTokBuf, ThisTokEnd, hadError,
-                          FullSourceLoc(StringToks[i].getLocation(),
-                                        PP.getSourceManager()),
-                          AnyWide, Diags,
-                          PP.getTargetInfo());
+                          FullSourceLoc(StringToks[i].getLocation(), SM),
+                          AnyWide, Diags, Target);
 
       // Note: our internal rep of wide char tokens is always little-endian.
       *ResultPtr++ = ResultChar & 0xFF;
@@ -1006,11 +1006,7 @@
 /// specified byte of the string data represented by Token.  This handles
 /// advancing over escape sequences in the string.
 unsigned StringLiteralParser::getOffsetOfStringByte(const Token &Tok,
-                                                    unsigned ByteNo,
-                                                    const SourceManager &SM,
-                                                    const LangOptions &Features, 
-                                                    const TargetInfo &Target,
-                                                    Diagnostic *Diags) {
+                                                    unsigned ByteNo) const {
   // Get the spelling of the token.
   llvm::SmallString<32> SpellingBuffer;
   SpellingBuffer.resize(Tok.getLength());

Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=119471&r1=119470&r2=119471&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Nov 17 00:46:14 2010
@@ -84,16 +84,13 @@
 
     // Use the StringLiteralParser to compute the length of the string in bytes.
     StringLiteralParser SLP(&TheTok, 1, PP, /*Complain=*/false);
+    // PP.getSourceManager(), PP.getLangOptions(), PP.getTargetInfo());
     unsigned TokNumBytes = SLP.GetStringLength();
 
     // If the byte is in this token, return the location of the byte.
     if (ByteNo < TokNumBytes ||
         (ByteNo == TokNumBytes && TokNo == SL->getNumConcatenated())) {
-      unsigned Offset =
-        StringLiteralParser::getOffsetOfStringByte(TheTok, ByteNo, 
-                                                   PP.getSourceManager(),
-                                                   PP.getLangOptions(),
-                                                   PP.getTargetInfo());
+      unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo); 
 
       // Now that we know the offset of the token in the spelling, use the
       // preprocessor to get the offset in the original source.





More information about the cfe-commits mailing list