[PATCH] Protect uses of <cctype> in LLVM by casting to unsigned char

Jordan Rose jordan_rose at apple.com
Tue Feb 12 09:28:29 PST 2013


Looks good to me. There are a lot of things in here that could get cleaned up, but for now the mechanical fix is fine. Please commit.

(Does this get your builder back online?)
Jordan


On Feb 12, 2013, at 1:50 , "Benyei, Guy" <guy.benyei at intel.com> wrote:

> Hi,
> Attached a patch for this rather mechanic fix.
> Please review.
> 
> Thanks
>    Guy
> 
> 
> -----Original Message-----
> From: cfe-commits-bounces at cs.uiuc.edu [mailto:cfe-commits-bounces at cs.uiuc.edu] On Behalf Of Benyei, Guy
> Sent: Monday, February 11, 2013 13:23
> To: Jordan Rose
> Cc: cfe-commits at cs.uiuc.edu
> Subject: RE: r174768 - Excise <cctype> from Clang (except clang-tblgen) in favor of CharInfo.h.
> 
> OK, I'll take care of it.
> 
> Thanks
>    Guy
> 
> 
> -----Original Message-----
> From: Jordan Rose [mailto:jordan_rose at apple.com] 
> Sent: Sunday, February 10, 2013 20:56
> To: Benyei, Guy
> Cc: cfe-commits at cs.uiuc.edu
> Subject: Re: r174768 - Excise <cctype> from Clang (except clang-tblgen) in favor of CharInfo.h.
> 
> I don't think we can switch LLVM over to CharInfo just yet, so I guess we'll just have to use the static_cast<unsigned char> trick for now. Can you take care of these? If not, I'll get to them some time next week.
> 
> isalnum
> isalpha
> isdigit
> islower
> isprint
> isspace
> isupper
> isxdigit
> tolower
> toupper
> 
> Note that I left the clang-tblgen functions alone; for now we'll just assume TableGen files are ASCII-only.
> 
> Thank you,
> Jordan
> 
> 
> 
> On Feb 10, 2013, at 3:12 , "Benyei, Guy" <guy.benyei at intel.com> wrote:
> 
>> Hi Jordan,
>> This fixed one of the failures I had earlier, but CodeGen/ucn-identifiers.c still fails when it attempts to print a Unicode identifier name - it asserts in LLVM.
>> I guess cctype should be removed from LLVM too - are there any plans to do that?
>> 
>> Thanks
>>   Guy Benyei
>> 
>> 
>> -----Original Message-----
>> From: cfe-commits-bounces at cs.uiuc.edu [mailto:cfe-commits-bounces at cs.uiuc.edu] On Behalf Of Jordan Rose
>> Sent: Saturday, February 09, 2013 00:31
>> To: cfe-commits at cs.uiuc.edu
>> Subject: r174768 - Excise <cctype> from Clang (except clang-tblgen) in favor of CharInfo.h.
>> 
>> Author: jrose
>> Date: Fri Feb  8 16:30:41 2013
>> New Revision: 174768
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=174768&view=rev
>> Log:
>> Excise <cctype> from Clang (except clang-tblgen) in favor of CharInfo.h.
>> 
>> Nearly all of these changes are one-to-one replacements; the few that
>> aren't have to do with custom identifier validation.
>> 
>> Modified:
>>   cfe/trunk/include/clang/AST/Expr.h
>>   cfe/trunk/include/clang/Basic/CharInfo.h
>>   cfe/trunk/include/clang/Lex/LiteralSupport.h
>>   cfe/trunk/lib/AST/Expr.cpp
>>   cfe/trunk/lib/AST/Stmt.cpp
>>   cfe/trunk/lib/AST/TemplateBase.cpp
>>   cfe/trunk/lib/Analysis/CocoaConventions.cpp
>>   cfe/trunk/lib/Basic/Diagnostic.cpp
>>   cfe/trunk/lib/Basic/IdentifierTable.cpp
>>   cfe/trunk/lib/Basic/TargetInfo.cpp
>>   cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>>   cfe/trunk/lib/Driver/WindowsToolChain.cpp
>>   cfe/trunk/lib/Edit/EditedSource.cpp
>>   cfe/trunk/lib/Frontend/LayoutOverrideSource.cpp
>>   cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp
>>   cfe/trunk/lib/Frontend/TextDiagnostic.cpp
>>   cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp
>>   cfe/trunk/lib/Lex/HeaderMap.cpp
>>   cfe/trunk/lib/Lex/LiteralSupport.cpp
>>   cfe/trunk/lib/Lex/ModuleMap.cpp
>>   cfe/trunk/lib/Lex/PPDirectives.cpp
>>   cfe/trunk/lib/Parse/ParseDecl.cpp
>>   cfe/trunk/lib/Parse/ParseDeclCXX.cpp
>>   cfe/trunk/lib/Parse/ParseObjc.cpp
>>   cfe/trunk/lib/Rewrite/Frontend/RewriteModernObjC.cpp
>>   cfe/trunk/lib/Rewrite/Frontend/RewriteObjC.cpp
>>   cfe/trunk/lib/Sema/SemaChecking.cpp
>>   cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>>   cfe/trunk/lib/Sema/SemaPseudoObject.cpp
>>   cfe/trunk/tools/driver/driver.cpp
>>   cfe/trunk/unittests/Basic/CharInfoTest.cpp
>> 
>> Modified: cfe/trunk/include/clang/AST/Expr.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/AST/Expr.h (original)
>> +++ cfe/trunk/include/clang/AST/Expr.h Fri Feb  8 16:30:41 2013
>> @@ -28,7 +28,6 @@
>> #include "llvm/ADT/SmallVector.h"
>> #include "llvm/ADT/StringRef.h"
>> #include "llvm/Support/Compiler.h"
>> -#include <cctype>
>> 
>> namespace clang {
>>  class APValue;
>> 
>> Modified: cfe/trunk/include/clang/Basic/CharInfo.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/CharInfo.h?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/CharInfo.h (original)
>> +++ cfe/trunk/include/clang/Basic/CharInfo.h Fri Feb  8 16:30:41 2013
>> @@ -10,6 +10,8 @@
>> #ifndef CLANG_BASIC_CHARINFO_H
>> #define CLANG_BASIC_CHARINFO_H
>> 
>> +#include "clang/Basic/LLVM.h"
>> +#include "llvm/ADT/StringRef.h"
>> #include "llvm/Support/Compiler.h"
>> #include "llvm/Support/DataTypes.h"
>> 
>> @@ -157,6 +159,41 @@ LLVM_READONLY static inline bool isRawSt
>>                          CHAR_DIGIT|CHAR_UNDER|CHAR_RAWDEL)) != 0;
>> }
>> 
>> +
>> +/// Converts the given ASCII character to its lowercase equivalent.
>> +///
>> +/// If the character is not an uppercase character, it is returned as is.
>> +LLVM_READONLY static inline char toLowercase(char c) {
>> +  if (isUppercase(c))
>> +    return c + 'a' - 'A';
>> +  return c;
>> +}
>> +
>> +/// Converts the given ASCII character to its uppercase equivalent.
>> +///
>> +/// If the character is not a lowercase character, it is returned as is.
>> +LLVM_READONLY static inline char toUppercase(char c) {
>> +  if (isLowercase(c))
>> +    return c + 'A' - 'a';
>> +  return c;
>> +}
>> +
>> +
>> +/// Return true if this is a valid ASCII identifier.
>> +///
>> +/// Note that this is a very simple check; it does not accept '$' or UCNs as
>> +/// valid identifier characters.
>> +LLVM_READONLY static inline bool isValidIdentifier(StringRef S) {
>> +  if (S.empty() || !isIdentifierHead(S[0]))
>> +    return false;
>> +
>> +  for (StringRef::iterator I = S.begin(), E = S.end(); I != E; ++I)
>> +    if (!isIdentifierBody(*I))
>> +      return false;
>> +
>> +  return true;
>> +}
>> +
>> } // end namespace clang
>> 
>> #endif
>> 
>> Modified: cfe/trunk/include/clang/Lex/LiteralSupport.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/LiteralSupport.h?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Lex/LiteralSupport.h (original)
>> +++ cfe/trunk/include/clang/Lex/LiteralSupport.h Fri Feb  8 16:30:41 2013
>> @@ -15,13 +15,13 @@
>> #ifndef CLANG_LITERALSUPPORT_H
>> #define CLANG_LITERALSUPPORT_H
>> 
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/LLVM.h"
>> #include "clang/Basic/TokenKinds.h"
>> #include "llvm/ADT/APFloat.h"
>> #include "llvm/ADT/SmallString.h"
>> #include "llvm/ADT/StringRef.h"
>> #include "llvm/Support/DataTypes.h"
>> -#include <cctype>
>> 
>> namespace clang {
>> 
>> @@ -101,7 +101,7 @@ private:
>>  /// SkipHexDigits - Read and skip over any hex digits, up to End.
>>  /// Return a pointer to the first non-hex digit or End.
>>  const char *SkipHexDigits(const char *ptr) {
>> -    while (ptr != ThisTokEnd && isxdigit(*ptr))
>> +    while (ptr != ThisTokEnd && isHexDigit(*ptr))
>>      ptr++;
>>    return ptr;
>>  }
>> @@ -117,7 +117,7 @@ private:
>>  /// SkipDigits - Read and skip over any digits, up to End.
>>  /// Return a pointer to the first non-hex digit or End.
>>  const char *SkipDigits(const char *ptr) {
>> -    while (ptr != ThisTokEnd && isdigit(*ptr))
>> +    while (ptr != ThisTokEnd && isDigit(*ptr))
>>      ptr++;
>>    return ptr;
>>  }
>> 
>> Modified: cfe/trunk/lib/AST/Expr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/AST/Expr.cpp (original)
>> +++ cfe/trunk/lib/AST/Expr.cpp Fri Feb  8 16:30:41 2013
>> @@ -23,6 +23,7 @@
>> #include "clang/AST/RecordLayout.h"
>> #include "clang/AST/StmtVisitor.h"
>> #include "clang/Basic/Builtins.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/SourceManager.h"
>> #include "clang/Basic/TargetInfo.h"
>> #include "clang/Lex/Lexer.h"
>> @@ -844,7 +845,7 @@ void StringLiteral::outputString(raw_ost
>>      assert(Char <= 0xff &&
>>             "Characters above 0xff should already have been handled.");
>> 
>> -      if (isprint(Char))
>> +      if (isPrintable(Char))
>>        OS << (char)Char;
>>      else  // Output anything hard as an octal escape.
>>        OS << '\\'
>> 
>> Modified: cfe/trunk/lib/AST/Stmt.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/AST/Stmt.cpp (original)
>> +++ cfe/trunk/lib/AST/Stmt.cpp Fri Feb  8 16:30:41 2013
>> @@ -19,6 +19,7 @@
>> #include "clang/AST/StmtCXX.h"
>> #include "clang/AST/StmtObjC.h"
>> #include "clang/AST/Type.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/TargetInfo.h"
>> #include "clang/Lex/Token.h"
>> #include "llvm/ADT/StringExtras.h"
>> @@ -539,7 +540,7 @@ unsigned GCCAsmStmt::AnalyzeAsmString(Sm
>> 
>>    // Handle %x4 and %x[foo] by capturing x as the modifier character.
>>    char Modifier = '\0';
>> -    if (isalpha(EscapedChar)) {
>> +    if (isLetter(EscapedChar)) {
>>      if (CurPtr == StrEnd) { // Premature end.
>>        DiagOffs = CurPtr-StrStart-1;
>>        return diag::err_asm_invalid_escape;
>> @@ -548,12 +549,12 @@ unsigned GCCAsmStmt::AnalyzeAsmString(Sm
>>      EscapedChar = *CurPtr++;
>>    }
>> 
>> -    if (isdigit(EscapedChar)) {
>> +    if (isDigit(EscapedChar)) {
>>      // %n - Assembler operand n
>>      unsigned N = 0;
>> 
>>      --CurPtr;
>> -      while (CurPtr != StrEnd && isdigit(*CurPtr))
>> +      while (CurPtr != StrEnd && isDigit(*CurPtr))
>>        N = N*10 + ((*CurPtr++)-'0');
>> 
>>      unsigned NumOperands =
>> 
>> Modified: cfe/trunk/lib/AST/TemplateBase.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TemplateBase.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/AST/TemplateBase.cpp (original)
>> +++ cfe/trunk/lib/AST/TemplateBase.cpp Fri Feb  8 16:30:41 2013
>> @@ -25,7 +25,6 @@
>> #include "llvm/ADT/SmallString.h"
>> #include "llvm/Support/raw_ostream.h"
>> #include <algorithm>
>> -#include <cctype>
>> 
>> using namespace clang;
>> 
>> 
>> Modified: cfe/trunk/lib/Analysis/CocoaConventions.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CocoaConventions.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Analysis/CocoaConventions.cpp (original)
>> +++ cfe/trunk/lib/Analysis/CocoaConventions.cpp Fri Feb  8 16:30:41 2013
>> @@ -15,9 +15,9 @@
>> #include "clang/AST/Decl.h"
>> #include "clang/AST/DeclObjC.h"
>> #include "clang/AST/Type.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "llvm/ADT/StringExtras.h"
>> #include "llvm/Support/ErrorHandling.h"
>> -#include <cctype>
>> 
>> using namespace clang;
>> using namespace ento;
>> @@ -106,7 +106,7 @@ bool coreFoundation::followsCreateRule(c
>>      char ch = *it;
>>      if (ch == 'C' || ch == 'c') {
>>        // Make sure this isn't something like 'recreate' or 'Scopy'.
>> -        if (ch == 'c' && it != start && isalpha(*(it - 1)))
>> +        if (ch == 'c' && it != start && isLetter(*(it - 1)))
>>          continue;
>> 
>>        ++it;
>> @@ -131,7 +131,7 @@ bool coreFoundation::followsCreateRule(c
>>      continue;
>>    }
>> 
>> -    if (it == endI || !islower(*it))
>> +    if (it == endI || !isLowercase(*it))
>>      return true;
>> 
>>    // If we matched a lowercase character, it isn't the end of the
>> 
>> Modified: cfe/trunk/lib/Basic/Diagnostic.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Basic/Diagnostic.cpp (original)
>> +++ cfe/trunk/lib/Basic/Diagnostic.cpp Fri Feb  8 16:30:41 2013
>> @@ -11,6 +11,7 @@
>> //
>> //===----------------------------------------------------------------------===//
>> 
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/Diagnostic.h"
>> #include "clang/Basic/DiagnosticOptions.h"
>> #include "clang/Basic/IdentifierTable.h"
>> @@ -19,7 +20,6 @@
>> #include "llvm/ADT/StringExtras.h"
>> #include "llvm/Support/CrashRecoveryContext.h"
>> #include "llvm/Support/raw_ostream.h"
>> -#include <cctype>
>> 
>> using namespace clang;
>> 
>> @@ -457,8 +457,8 @@ static const char *ScanFormat(const char
>>      // Escaped characters get implicitly skipped here.
>> 
>>      // Format specifier.
>> -      if (!isdigit(*I) && !ispunct(*I)) {
>> -        for (I++; I != E && !isdigit(*I) && *I != '{'; I++) ;
>> +      if (!isDigit(*I) && !isPunctuation(*I)) {
>> +        for (I++; I != E && !isDigit(*I) && *I != '{'; I++) ;
>>        if (I == E) break;
>>        if (*I == '{')
>>          Depth++;
>> @@ -682,7 +682,7 @@ FormatDiagnostic(const char *DiagStr, co
>>      OutStr.append(DiagStr, StrEnd);
>>      DiagStr = StrEnd;
>>      continue;
>> -    } else if (ispunct(DiagStr[1])) {
>> +    } else if (isPunctuation(DiagStr[1])) {
>>      OutStr.push_back(DiagStr[1]);  // %% -> %.
>>      DiagStr += 2;
>>      continue;
>> @@ -700,7 +700,7 @@ FormatDiagnostic(const char *DiagStr, co
>>    unsigned ModifierLen = 0, ArgumentLen = 0;
>> 
>>    // Check to see if we have a modifier.  If so eat it.
>> -    if (!isdigit(DiagStr[0])) {
>> +    if (!isDigit(DiagStr[0])) {
>>      Modifier = DiagStr;
>>      while (DiagStr[0] == '-' ||
>>             (DiagStr[0] >= 'a' && DiagStr[0] <= 'z'))
>> @@ -719,7 +719,7 @@ FormatDiagnostic(const char *DiagStr, co
>>      }
>>    }
>> 
>> -    assert(isdigit(*DiagStr) && "Invalid format for argument in diagnostic");
>> +    assert(isDigit(*DiagStr) && "Invalid format for argument in diagnostic");
>>    unsigned ArgNo = *DiagStr++ - '0';
>> 
>>    // Only used for type diffing.
>> @@ -727,7 +727,7 @@ FormatDiagnostic(const char *DiagStr, co
>> 
>>    DiagnosticsEngine::ArgumentKind Kind = getArgKind(ArgNo);
>>    if (ModifierIs(Modifier, ModifierLen, "diff")) {
>> -      assert(*DiagStr == ',' && isdigit(*(DiagStr + 1)) &&
>> +      assert(*DiagStr == ',' && isDigit(*(DiagStr + 1)) &&
>>             "Invalid format for diff modifier");
>>      ++DiagStr;  // Comma.
>>      ArgNo2 = *DiagStr++ - '0';
>> 
>> Modified: cfe/trunk/lib/Basic/IdentifierTable.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/IdentifierTable.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Basic/IdentifierTable.cpp (original)
>> +++ cfe/trunk/lib/Basic/IdentifierTable.cpp Fri Feb  8 16:30:41 2013
>> @@ -13,13 +13,13 @@
>> //===----------------------------------------------------------------------===//
>> 
>> #include "clang/Basic/IdentifierTable.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/LangOptions.h"
>> #include "llvm/ADT/DenseMap.h"
>> #include "llvm/ADT/FoldingSet.h"
>> #include "llvm/ADT/SmallString.h"
>> #include "llvm/Support/ErrorHandling.h"
>> #include "llvm/Support/raw_ostream.h"
>> -#include <cctype>
>> #include <cstdio>
>> 
>> using namespace clang;
>> @@ -404,9 +404,8 @@ std::string Selector::getAsString() cons
>> /// given "word", which is assumed to end in a lowercase letter.
>> static bool startsWithWord(StringRef name, StringRef word) {
>>  if (name.size() < word.size()) return false;
>> -  return ((name.size() == word.size() ||
>> -           !islower(name[word.size()]))
>> -          && name.startswith(word));
>> +  return ((name.size() == word.size() || !isLowercase(name[word.size()])) &&
>> +          name.startswith(word));
>> }
>> 
>> ObjCMethodFamily Selector::getMethodFamilyImpl(Selector sel) {
>> 
>> Modified: cfe/trunk/lib/Basic/TargetInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/TargetInfo.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Basic/TargetInfo.cpp (original)
>> +++ cfe/trunk/lib/Basic/TargetInfo.cpp Fri Feb  8 16:30:41 2013
>> @@ -13,11 +13,11 @@
>> 
>> #include "clang/Basic/TargetInfo.h"
>> #include "clang/Basic/AddressSpaces.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/LangOptions.h"
>> #include "llvm/ADT/APFloat.h"
>> #include "llvm/ADT/STLExtras.h"
>> #include "llvm/Support/ErrorHandling.h"
>> -#include <cctype>
>> #include <cstdlib>
>> using namespace clang;
>> 
>> @@ -223,7 +223,7 @@ bool TargetInfo::isValidGCCRegisterName(
>>  getGCCRegNames(Names, NumNames);
>> 
>>  // If we have a number it maps to an entry in the register name array.
>> -  if (isdigit(Name[0])) {
>> +  if (isDigit(Name[0])) {
>>    int n;
>>    if (!Name.getAsInteger(0, n))
>>      return n >= 0 && (unsigned)n < NumNames;
>> @@ -279,7 +279,7 @@ TargetInfo::getNormalizedGCCRegisterName
>>  getGCCRegNames(Names, NumNames);
>> 
>>  // First, check if we have a number.
>> -  if (isdigit(Name[0])) {
>> +  if (isDigit(Name[0])) {
>>    int n;
>>    if (!Name.getAsInteger(0, n)) {
>>      assert(n >= 0 && (unsigned)n < NumNames &&
>> 
>> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Fri Feb  8 16:30:41 2013
>> @@ -30,6 +30,7 @@
>> #include "clang/AST/RecordLayout.h"
>> #include "clang/AST/RecursiveASTVisitor.h"
>> #include "clang/Basic/Builtins.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/Diagnostic.h"
>> #include "clang/Basic/Module.h"
>> #include "clang/Basic/SourceManager.h"
>> @@ -2936,7 +2937,7 @@ llvm::Constant *CodeGenModule::EmitUuido
>>  const char *Uuidstr = Uuid.data();
>>  for (int i = 0; i < 36; ++i) {
>>    if (i == 8 || i == 13 || i == 18 || i == 23) assert(Uuidstr[i] == '-');
>> -    else                                         assert(isxdigit(Uuidstr[i]));
>> +    else                                         assert(isHexDigit(Uuidstr[i]));
>>  }
>> 
>>  llvm::APInt Field0(32, StringRef(Uuidstr     , 8), 16);
>> 
>> Modified: cfe/trunk/lib/Driver/WindowsToolChain.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/WindowsToolChain.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/WindowsToolChain.cpp (original)
>> +++ cfe/trunk/lib/Driver/WindowsToolChain.cpp Fri Feb  8 16:30:41 2013
>> @@ -8,6 +8,7 @@
>> //===----------------------------------------------------------------------===//
>> 
>> #include "ToolChains.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/Version.h"
>> #include "clang/Driver/Arg.h"
>> #include "clang/Driver/ArgList.h"
>> @@ -158,12 +159,12 @@ static bool getSystemRegistryString(cons
>>      for (index = 0; RegEnumKeyEx(hTopKey, index, keyName, &size, NULL,
>>          NULL, NULL, NULL) == ERROR_SUCCESS; index++) {
>>        const char *sp = keyName;
>> -        while (*sp && !isdigit(*sp))
>> +        while (*sp && !isDigit(*sp))
>>          sp++;
>>        if (!*sp)
>>          continue;
>>        const char *ep = sp + 1;
>> -        while (*ep && (isdigit(*ep) || (*ep == '.')))
>> +        while (*ep && (isDigit(*ep) || (*ep == '.')))
>>          ep++;
>>        char numBuf[32];
>>        strncpy(numBuf, sp, sizeof(numBuf) - 1);
>> 
>> Modified: cfe/trunk/lib/Edit/EditedSource.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Edit/EditedSource.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Edit/EditedSource.cpp (original)
>> +++ cfe/trunk/lib/Edit/EditedSource.cpp Fri Feb  8 16:30:41 2013
>> @@ -8,13 +8,13 @@
>> //===----------------------------------------------------------------------===//
>> 
>> #include "clang/Edit/EditedSource.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/SourceManager.h"
>> #include "clang/Edit/Commit.h"
>> #include "clang/Edit/EditsReceiver.h"
>> #include "clang/Lex/Lexer.h"
>> #include "llvm/ADT/SmallString.h"
>> #include "llvm/ADT/Twine.h"
>> -#include <cctype>
>> 
>> using namespace clang;
>> using namespace edit;
>> @@ -240,16 +240,12 @@ bool EditedSource::commit(const Commit &
>>  return true;
>> }
>> 
>> -static inline bool isIdentifierChar(char c, const LangOptions &LangOpts) {
>> -  return std::isalnum(c) || c == '_' || (c == '$' && LangOpts.DollarIdents);
>> -}
>> -
>> // \brief Returns true if it is ok to make the two given characters adjacent.
>> static bool canBeJoined(char left, char right, const LangOptions &LangOpts) {
>> -  // FIXME: Should use the Lexer to make sure we don't allow stuff like
>> +  // FIXME: Should use TokenConcatenation to make sure we don't allow stuff like
>>  // making two '<' adjacent.
>> -  return !(isIdentifierChar(left, LangOpts) &&
>> -           isIdentifierChar(right, LangOpts));
>> +  return !(Lexer::isIdentifierBodyChar(left, LangOpts) &&
>> +           Lexer::isIdentifierBodyChar(right, LangOpts));
>> }
>> 
>> /// \brief Returns true if it is ok to eliminate the trailing whitespace between
>> @@ -258,7 +254,7 @@ static bool canRemoveWhitespace(char lef
>>                                const LangOptions &LangOpts) {
>>  if (!canBeJoined(left, right, LangOpts))
>>    return false;
>> -  if (std::isspace(left) || std::isspace(right))
>> +  if (isWhitespace(left) || isWhitespace(right))
>>    return true;
>>  if (canBeJoined(beforeWSpace, right, LangOpts))
>>    return false; // the whitespace was intentional, keep it.
>> 
>> Modified: cfe/trunk/lib/Frontend/LayoutOverrideSource.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/LayoutOverrideSource.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/LayoutOverrideSource.cpp (original)
>> +++ cfe/trunk/lib/Frontend/LayoutOverrideSource.cpp Fri Feb  8 16:30:41 2013
>> @@ -8,8 +8,8 @@
>> //===----------------------------------------------------------------------===//
>> #include "clang/Frontend/LayoutOverrideSource.h"
>> #include "clang/AST/Decl.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "llvm/Support/raw_ostream.h"
>> -#include <cctype>
>> #include <fstream>
>> #include <string>
>> 
>> @@ -17,10 +17,11 @@ using namespace clang;
>> 
>> /// \brief Parse a simple identifier.
>> static std::string parseName(StringRef S) {
>> -  unsigned Offset = 0;
>> -  while (Offset < S.size() &&
>> -         (isalpha(S[Offset]) || S[Offset] == '_' ||
>> -          (Offset > 0 && isdigit(S[Offset]))))
>> +  if (S.empty() || !isIdentifierHead(S[0]))
>> +    return "";
>> +
>> +  unsigned Offset = 1;
>> +  while (Offset < S.size() && isIdentifierBody(S[Offset]))
>>    ++Offset;
>> 
>>  return S.substr(0, Offset).str();
>> @@ -128,10 +129,10 @@ LayoutOverrideSource::LayoutOverrideSour
>>      continue;
>> 
>>    LineStr = LineStr.substr(Pos + strlen("FieldOffsets: ["));
>> -    while (!LineStr.empty() && isdigit(LineStr[0])) {
>> +    while (!LineStr.empty() && isDigit(LineStr[0])) {
>>      // Parse this offset.
>>      unsigned Idx = 1;
>> -      while (Idx < LineStr.size() && isdigit(LineStr[Idx]))
>> +      while (Idx < LineStr.size() && isDigit(LineStr[Idx]))
>>        ++Idx;
>> 
>>      unsigned long long Offset = 0;
>> @@ -141,7 +142,7 @@ LayoutOverrideSource::LayoutOverrideSour
>> 
>>      // Skip over this offset, the following comma, and any spaces.
>>      LineStr = LineStr.substr(Idx + 1);
>> -      while (!LineStr.empty() && isspace(LineStr[0]))
>> +      while (!LineStr.empty() && isWhitespace(LineStr[0]))
>>        LineStr = LineStr.substr(1);
>>    }
>>  }
>> 
>> Modified: cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp (original)
>> +++ cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp Fri Feb  8 16:30:41 2013
>> @@ -13,6 +13,7 @@
>> //===----------------------------------------------------------------------===//
>> 
>> #include "clang/Frontend/Utils.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/Diagnostic.h"
>> #include "clang/Basic/SourceManager.h"
>> #include "clang/Frontend/PreprocessorOutputOptions.h"
>> @@ -26,7 +27,6 @@
>> #include "llvm/ADT/StringRef.h"
>> #include "llvm/Support/ErrorHandling.h"
>> #include "llvm/Support/raw_ostream.h"
>> -#include <cctype>
>> #include <cstdio>
>> using namespace clang;
>> 
>> @@ -350,7 +350,7 @@ void PrintPPOutputPPCallbacks::PragmaCom
>> 
>>    for (unsigned i = 0, e = Str.size(); i != e; ++i) {
>>      unsigned char Char = Str[i];
>> -      if (isprint(Char) && Char != '\\' && Char != '"')
>> +      if (isPrintable(Char) && Char != '\\' && Char != '"')
>>        OS << (char)Char;
>>      else  // Output anything hard as an octal escape.
>>        OS << '\\'
>> @@ -375,7 +375,7 @@ void PrintPPOutputPPCallbacks::PragmaMes
>> 
>>  for (unsigned i = 0, e = Str.size(); i != e; ++i) {
>>    unsigned char Char = Str[i];
>> -    if (isprint(Char) && Char != '\\' && Char != '"')
>> +    if (isPrintable(Char) && Char != '\\' && Char != '"')
>>      OS << (char)Char;
>>    else  // Output anything hard as an octal escape.
>>      OS << '\\'
>> 
>> Modified: cfe/trunk/lib/Frontend/TextDiagnostic.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/TextDiagnostic.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/TextDiagnostic.cpp (original)
>> +++ cfe/trunk/lib/Frontend/TextDiagnostic.cpp Fri Feb  8 16:30:41 2013
>> @@ -8,6 +8,7 @@
>> //===----------------------------------------------------------------------===//
>> 
>> #include "clang/Frontend/TextDiagnostic.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/DiagnosticOptions.h"
>> #include "clang/Basic/FileManager.h"
>> #include "clang/Basic/SourceManager.h"
>> @@ -20,7 +21,6 @@
>> #include "llvm/Support/MemoryBuffer.h"
>> #include "llvm/Support/raw_ostream.h"
>> #include <algorithm>
>> -#include <cctype>
>> 
>> using namespace clang;
>> 
>> @@ -348,11 +348,11 @@ static void selectInterestingSourceRegio
>>  // correctly.
>>  unsigned CaretStart = 0, CaretEnd = CaretLine.size();
>>  for (; CaretStart != CaretEnd; ++CaretStart)
>> -    if (!isspace(static_cast<unsigned char>(CaretLine[CaretStart])))
>> +    if (!isWhitespace(CaretLine[CaretStart]))
>>      break;
>> 
>>  for (; CaretEnd != CaretStart; --CaretEnd)
>> -    if (!isspace(static_cast<unsigned char>(CaretLine[CaretEnd - 1])))
>> +    if (!isWhitespace(CaretLine[CaretEnd - 1]))
>>      break;
>> 
>>  // caret has already been inserted into CaretLine so the above whitespace
>> @@ -363,11 +363,11 @@ static void selectInterestingSourceRegio
>>  if (!FixItInsertionLine.empty()) {
>>    unsigned FixItStart = 0, FixItEnd = FixItInsertionLine.size();
>>    for (; FixItStart != FixItEnd; ++FixItStart)
>> -      if (!isspace(static_cast<unsigned char>(FixItInsertionLine[FixItStart])))
>> +      if (!isWhitespace(FixItInsertionLine[FixItStart]))
>>        break;
>> 
>>    for (; FixItEnd != FixItStart; --FixItEnd)
>> -      if (!isspace(static_cast<unsigned char>(FixItInsertionLine[FixItEnd - 1])))
>> +      if (!isWhitespace(FixItInsertionLine[FixItEnd - 1]))
>>        break;
>> 
>>    CaretStart = std::min(FixItStart, CaretStart);
>> @@ -423,14 +423,13 @@ static void selectInterestingSourceRegio
>>      // Skip over any whitespace we see here; we're looking for
>>      // another bit of interesting text.
>>      // FIXME: Detect non-ASCII whitespace characters too.
>> -      while (NewStart &&
>> -             isspace(static_cast<unsigned char>(SourceLine[NewStart])))
>> +      while (NewStart && isWhitespace(SourceLine[NewStart]))
>>        NewStart = map.startOfPreviousColumn(NewStart);
>> 
>>      // Skip over this bit of "interesting" text.
>>      while (NewStart) {
>>        unsigned Prev = map.startOfPreviousColumn(NewStart);
>> -        if (isspace(static_cast<unsigned char>(SourceLine[Prev])))
>> +        if (isWhitespace(SourceLine[Prev]))
>>          break;
>>        NewStart = Prev;
>>      }
>> @@ -450,13 +449,11 @@ static void selectInterestingSourceRegio
>>      // Skip over any whitespace we see here; we're looking for
>>      // another bit of interesting text.
>>      // FIXME: Detect non-ASCII whitespace characters too.
>> -      while (NewEnd < SourceLine.size() &&
>> -             isspace(static_cast<unsigned char>(SourceLine[NewEnd])))
>> +      while (NewEnd < SourceLine.size() && isWhitespace(SourceLine[NewEnd]))
>>        NewEnd = map.startOfNextColumn(NewEnd);
>> 
>>      // Skip over this bit of "interesting" text.
>> -      while (NewEnd < SourceLine.size() &&
>> -             !isspace(static_cast<unsigned char>(SourceLine[NewEnd])))
>> +      while (NewEnd < SourceLine.size() && isWhitespace(SourceLine[NewEnd]))
>>        NewEnd = map.startOfNextColumn(NewEnd);
>> 
>>      assert(map.byteToColumn(NewEnd) != -1);
>> @@ -517,7 +514,7 @@ static void selectInterestingSourceRegio
>> /// greater than or equal to Idx or, if no such character exists,
>> /// returns the end of the string.
>> static unsigned skipWhitespace(unsigned Idx, StringRef Str, unsigned Length) {
>> -  while (Idx < Length && isspace(Str[Idx]))
>> +  while (Idx < Length && isWhitespace(Str[Idx]))
>>    ++Idx;
>>  return Idx;
>> }
>> @@ -562,7 +559,7 @@ static unsigned findEndOfWord(unsigned S
>>  char EndPunct = findMatchingPunctuation(Str[Start]);
>>  if (!EndPunct) {
>>    // This is a normal word. Just find the first space character.
>> -    while (End < Length && !isspace(Str[End]))
>> +    while (End < Length && !isWhitespace(Str[End]))
>>      ++End;
>>    return End;
>>  }
>> @@ -581,7 +578,7 @@ static unsigned findEndOfWord(unsigned S
>>  }
>> 
>>  // Find the first space character after the punctuation ended.
>> -  while (End < Length && !isspace(Str[End]))
>> +  while (End < Length && !isWhitespace(Str[End]))
>>    ++End;
>> 
>>  unsigned PunctWordLength = End - Start;
>> 
>> Modified: cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp (original)
>> +++ cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp Fri Feb  8 16:30:41 2013
>> @@ -12,6 +12,7 @@
>> //===----------------------------------------------------------------------===//
>> 
>> #include "clang/Frontend/VerifyDiagnosticConsumer.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/FileManager.h"
>> #include "clang/Frontend/FrontendDiagnostic.h"
>> #include "clang/Frontend/TextDiagnosticBuffer.h"
>> @@ -20,7 +21,6 @@
>> #include "llvm/ADT/SmallString.h"
>> #include "llvm/Support/Regex.h"
>> #include "llvm/Support/raw_ostream.h"
>> -#include <cctype>
>> 
>> using namespace clang;
>> typedef VerifyDiagnosticConsumer::Directive Directive;
>> @@ -234,7 +234,7 @@ public:
>>        break;
>>      if (!EnsureStartOfWord
>>            // Check if string literal starts a new word.
>> -            || P == Begin || isspace(P[-1])
>> +            || P == Begin || isWhitespace(P[-1])
>>            // Or it could be preceeded by the start of a comment.
>>            || (P > (Begin + 1) && (P[-1] == '/' || P[-1] == '*')
>>                                &&  P[-2] == '/'))
>> @@ -253,7 +253,7 @@ public:
>> 
>>  // Skip zero or more whitespace.
>>  void SkipWhitespace() {
>> -    for (; C < End && isspace(*C); ++C)
>> +    for (; C < End && isWhitespace(*C); ++C)
>>      ;
>>  }
>> 
>> 
>> Modified: cfe/trunk/lib/Lex/HeaderMap.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderMap.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/HeaderMap.cpp (original)
>> +++ cfe/trunk/lib/Lex/HeaderMap.cpp Fri Feb  8 16:30:41 2013
>> @@ -18,7 +18,6 @@
>> #include "llvm/Support/DataTypes.h"
>> #include "llvm/Support/MathExtras.h"
>> #include "llvm/Support/MemoryBuffer.h"
>> -#include <cctype>
>> #include <cstdio>
>> using namespace clang;
>> 
>> 
>> Modified: cfe/trunk/lib/Lex/LiteralSupport.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/LiteralSupport.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/LiteralSupport.cpp (original)
>> +++ cfe/trunk/lib/Lex/LiteralSupport.cpp Fri Feb  8 16:30:41 2013
>> @@ -13,6 +13,7 @@
>> //===----------------------------------------------------------------------===//
>> 
>> #include "clang/Lex/LiteralSupport.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/TargetInfo.h"
>> #include "clang/Lex/LexDiagnostic.h"
>> #include "clang/Lex/Preprocessor.h"
>> @@ -128,7 +129,7 @@ static unsigned ProcessCharEscape(const
>>    break;
>>  case 'x': { // Hex escape.
>>    ResultChar = 0;
>> -    if (ThisTokBuf == ThisTokEnd || !isxdigit(*ThisTokBuf)) {
>> +    if (ThisTokBuf == ThisTokEnd || !isHexDigit(*ThisTokBuf)) {
>>      if (Diags)
>>        Diag(Diags, Features, Loc, ThisTokBegin, EscapeBegin, ThisTokBuf,
>>             diag::err_hex_escape_no_digits) << "x";
>> @@ -197,7 +198,7 @@ static unsigned ProcessCharEscape(const
>>    if (Diags == 0)
>>      break;
>> 
>> -    if (isgraph(ResultChar))
>> +    if (isPrintable(ResultChar))
>>      Diag(Diags, Features, Loc, ThisTokBegin, EscapeBegin, ThisTokBuf,
>>           diag::ext_unknown_escape)
>>        << std::string(1, ResultChar);
>> @@ -224,7 +225,7 @@ static bool ProcessUCNEscape(const char
>>  // Skip the '\u' char's.
>>  ThisTokBuf += 2;
>> 
>> -  if (ThisTokBuf == ThisTokEnd || !isxdigit(*ThisTokBuf)) {
>> +  if (ThisTokBuf == ThisTokEnd || !isHexDigit(*ThisTokBuf)) {
>>    if (Diags)
>>      Diag(Diags, Features, Loc, ThisTokBegin, UcnBegin, ThisTokBuf,
>>           diag::err_hex_escape_no_digits) << StringRef(&ThisTokBuf[-1], 1);
>> @@ -459,8 +460,7 @@ NumericLiteralParser::NumericLiteralPars
>>  // and FP constants (specifically, the 'pp-number' regex), and assumes that
>>  // the byte at "*end" is both valid and not part of the regex.  Because of
>>  // this, it doesn't have to check for 'overscan' in various places.
>> -  assert(!isalnum(*ThisTokEnd) && *ThisTokEnd != '.' && *ThisTokEnd != '_' &&
>> -         "Lexer didn't maximally munch?");
>> +  assert(!isPreprocessingNumberBody(*ThisTokEnd) && "didn't maximally munch?");
>> 
>>  s = DigitsBegin = ThisTokBegin;
>>  saw_exponent = false;
>> @@ -483,7 +483,7 @@ NumericLiteralParser::NumericLiteralPars
>>    s = SkipDigits(s);
>>    if (s == ThisTokEnd) {
>>      // Done.
>> -    } else if (isxdigit(*s) && !(*s == 'e' || *s == 'E')) {
>> +    } else if (isHexDigit(*s) && !(*s == 'e' || *s == 'E')) {
>>      PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s - ThisTokBegin),
>>              diag::err_invalid_decimal_digit) << StringRef(s, 1);
>>      hadError = true;
>> @@ -635,7 +635,7 @@ void NumericLiteralParser::ParseNumberSt
>>  s++;
>> 
>>  // Handle a hex number like 0x1234.
>> -  if ((*s == 'x' || *s == 'X') && (isxdigit(s[1]) || s[1] == '.')) {
>> +  if ((*s == 'x' || *s == 'X') && (isHexDigit(s[1]) || s[1] == '.')) {
>>    s++;
>>    radix = 16;
>>    DigitsBegin = s;
>> @@ -694,7 +694,7 @@ void NumericLiteralParser::ParseNumberSt
>>    s = SkipBinaryDigits(s);
>>    if (s == ThisTokEnd) {
>>      // Done.
>> -    } else if (isxdigit(*s)) {
>> +    } else if (isHexDigit(*s)) {
>>      PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
>>              diag::err_invalid_binary_digit) << StringRef(s, 1);
>>      hadError = true;
>> @@ -714,7 +714,7 @@ void NumericLiteralParser::ParseNumberSt
>> 
>>  // If we have some other non-octal digit that *is* a decimal digit, see if
>>  // this is part of a floating point number like 094.123 or 09e1.
>> -  if (isdigit(*s)) {
>> +  if (isDigit(*s)) {
>>    const char *EndDecimal = SkipDigits(s);
>>    if (EndDecimal[0] == '.' || EndDecimal[0] == 'e' || EndDecimal[0] == 'E') {
>>      s = EndDecimal;
>> @@ -724,7 +724,7 @@ void NumericLiteralParser::ParseNumberSt
>> 
>>  // If we have a hex digit other than 'e' (which denotes a FP exponent) then
>>  // the code is using an incorrect base.
>> -  if (isxdigit(*s) && *s != 'e' && *s != 'E') {
>> +  if (isHexDigit(*s) && *s != 'e' && *s != 'E') {
>>    PP.Diag(PP.AdvanceToTokenCharacter(TokLoc, s-ThisTokBegin),
>>            diag::err_invalid_octal_digit) << StringRef(s, 1);
>>    hadError = true;
>> 
>> Modified: cfe/trunk/lib/Lex/ModuleMap.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/ModuleMap.cpp (original)
>> +++ cfe/trunk/lib/Lex/ModuleMap.cpp Fri Feb  8 16:30:41 2013
>> @@ -12,6 +12,7 @@
>> //
>> //===----------------------------------------------------------------------===//
>> #include "clang/Lex/ModuleMap.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/Diagnostic.h"
>> #include "clang/Basic/DiagnosticOptions.h"
>> #include "clang/Basic/FileManager.h"
>> @@ -107,26 +108,15 @@ static StringRef sanitizeFilenameAsIdent
>>  if (Name.empty())
>>    return Name;
>> 
>> -  // Check whether the filename is already an identifier; this is the common
>> -  // case.
>> -  bool isIdentifier = true;
>> -  for (unsigned I = 0, N = Name.size(); I != N; ++I) {
>> -    if (isalpha(Name[I]) || Name[I] == '_' || (isdigit(Name[I]) && I > 0))
>> -      continue;
>> -
>> -    isIdentifier = false;
>> -    break;
>> -  }
>> -
>> -  if (!isIdentifier) {
>> +  if (!isValidIdentifier(Name)) {
>>    // If we don't already have something with the form of an identifier,
>>    // create a buffer with the sanitized name.
>>    Buffer.clear();
>> -    if (isdigit(Name[0]))
>> +    if (isDigit(Name[0]))
>>      Buffer.push_back('_');
>>    Buffer.reserve(Buffer.size() + Name.size());
>>    for (unsigned I = 0, N = Name.size(); I != N; ++I) {
>> -      if (isalnum(Name[I]) || isspace(Name[I]))
>> +      if (isIdentifierBody(Name[I]))
>>        Buffer.push_back(Name[I]);
>>      else
>>        Buffer.push_back('_');
>> 
>> Modified: cfe/trunk/lib/Lex/PPDirectives.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/PPDirectives.cpp (original)
>> +++ cfe/trunk/lib/Lex/PPDirectives.cpp Fri Feb  8 16:30:41 2013
>> @@ -790,7 +790,7 @@ static bool GetLineValue(Token &DigitTok
>>  // here.
>>  Val = 0;
>>  for (unsigned i = 0; i != ActualLength; ++i) {
>> -    if (!isdigit(DigitTokBegin[i])) {
>> +    if (!isDigit(DigitTokBegin[i])) {
>>      PP.Diag(PP.AdvanceToTokenCharacter(DigitTok.getLocation(), i),
>>              diag::err_pp_line_digit_sequence);
>>      PP.DiscardUntilEndOfDirective();
>> 
>> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
>> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Fri Feb  8 16:30:41 2013
>> @@ -14,6 +14,7 @@
>> #include "clang/Parse/Parser.h"
>> #include "RAIIObjectsForParser.h"
>> #include "clang/Basic/AddressSpaces.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/OpenCL.h"
>> #include "clang/Parse/ParseDiagnostic.h"
>> #include "clang/Sema/Lookup.h"
>> @@ -570,7 +571,7 @@ VersionTuple Parser::ParseVersionTuple(S
>>  // Parse the major version.
>>  unsigned AfterMajor = 0;
>>  unsigned Major = 0;
>> -  while (AfterMajor < ActualLength && isdigit(ThisTokBegin[AfterMajor])) {
>> +  while (AfterMajor < ActualLength && isDigit(ThisTokBegin[AfterMajor])) {
>>    Major = Major * 10 + ThisTokBegin[AfterMajor] - '0';
>>    ++AfterMajor;
>>  }
>> @@ -602,7 +603,7 @@ VersionTuple Parser::ParseVersionTuple(S
>>  // Parse the minor version.
>>  unsigned AfterMinor = AfterMajor + 1;
>>  unsigned Minor = 0;
>> -  while (AfterMinor < ActualLength && isdigit(ThisTokBegin[AfterMinor])) {
>> +  while (AfterMinor < ActualLength && isDigit(ThisTokBegin[AfterMinor])) {
>>    Minor = Minor * 10 + ThisTokBegin[AfterMinor] - '0';
>>    ++AfterMinor;
>>  }
>> @@ -629,7 +630,7 @@ VersionTuple Parser::ParseVersionTuple(S
>>  // Parse the subminor version.
>>  unsigned AfterSubminor = AfterMinor + 1;
>>  unsigned Subminor = 0;
>> -  while (AfterSubminor < ActualLength && isdigit(ThisTokBegin[AfterSubminor])) {
>> +  while (AfterSubminor < ActualLength && isDigit(ThisTokBegin[AfterSubminor])) {
>>    Subminor = Subminor * 10 + ThisTokBegin[AfterSubminor] - '0';
>>    ++AfterSubminor;
>>  }
>> 
>> Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
>> +++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Fri Feb  8 16:30:41 2013
>> @@ -13,6 +13,7 @@
>> 
>> #include "clang/Parse/Parser.h"
>> #include "RAIIObjectsForParser.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/OperatorKinds.h"
>> #include "clang/Parse/ParseDiagnostic.h"
>> #include "clang/Sema/DeclSpec.h"
>> @@ -3032,7 +3033,7 @@ IdentifierInfo *Parser::TryParseCXX11Att
>>    // starts with an alphabetical character.
>>    SmallString<8> SpellingBuf;
>>    StringRef Spelling = PP.getSpelling(Tok.getLocation(), SpellingBuf);
>> -    if (std::isalpha(Spelling[0])) {
>> +    if (isLetter(Spelling[0])) {
>>      Loc = ConsumeToken();
>>      return &PP.getIdentifierTable().get(Spelling);
>>    }
>> 
>> Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
>> +++ cfe/trunk/lib/Parse/ParseObjc.cpp Fri Feb  8 16:30:41 2013
>> @@ -13,6 +13,7 @@
>> 
>> #include "clang/Parse/Parser.h"
>> #include "RAIIObjectsForParser.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Parse/ParseDiagnostic.h"
>> #include "clang/Sema/DeclSpec.h"
>> #include "clang/Sema/PrettyDeclStackTrace.h"
>> @@ -690,7 +691,7 @@ IdentifierInfo *Parser::ParseObjCSelecto
>>  case tok::caret:
>>  case tok::caretequal: {
>>    std::string ThisTok(PP.getSpelling(Tok));
>> -    if (isalpha(ThisTok[0])) {
>> +    if (isLetter(ThisTok[0])) {
>>      IdentifierInfo *II = &PP.getIdentifierTable().get(ThisTok.data());
>>      Tok.setKind(tok::identifier);
>>      SelectorLoc = ConsumeToken();
>> 
>> Modified: cfe/trunk/lib/Rewrite/Frontend/RewriteModernObjC.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/Frontend/RewriteModernObjC.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Rewrite/Frontend/RewriteModernObjC.cpp (original)
>> +++ cfe/trunk/lib/Rewrite/Frontend/RewriteModernObjC.cpp Fri Feb  8 16:30:41 2013
>> @@ -16,6 +16,7 @@
>> #include "clang/AST/ASTConsumer.h"
>> #include "clang/AST/Attr.h"
>> #include "clang/AST/ParentMap.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/Diagnostic.h"
>> #include "clang/Basic/IdentifierTable.h"
>> #include "clang/Basic/SourceManager.h"
>> @@ -2608,7 +2609,7 @@ Stmt *RewriteModernObjC::RewriteObjCStri
>>  for (i=0; i < tmpName.length(); i++) {
>>    char c = tmpName.at(i);
>>    // replace any non alphanumeric characters with '_'.
>> -    if (!isalpha(c) && (c < '0' || c > '9'))
>> +    if (!isAlphanumeric(c))
>>      tmpName[i] = '_';
>>  }
>>  S += tmpName;
>> 
>> Modified: cfe/trunk/lib/Rewrite/Frontend/RewriteObjC.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/Frontend/RewriteObjC.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Rewrite/Frontend/RewriteObjC.cpp (original)
>> +++ cfe/trunk/lib/Rewrite/Frontend/RewriteObjC.cpp Fri Feb  8 16:30:41 2013
>> @@ -16,6 +16,7 @@
>> #include "clang/AST/ASTConsumer.h"
>> #include "clang/AST/Attr.h"
>> #include "clang/AST/ParentMap.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/Diagnostic.h"
>> #include "clang/Basic/IdentifierTable.h"
>> #include "clang/Basic/SourceManager.h"
>> @@ -2529,7 +2530,7 @@ Stmt *RewriteObjC::RewriteObjCStringLite
>>  for (i=0; i < tmpName.length(); i++) {
>>    char c = tmpName.at(i);
>>    // replace any non alphanumeric characters with '_'.
>> -    if (!isalpha(c) && (c < '0' || c > '9'))
>> +    if (!isAlphanumeric(c))
>>      tmpName[i] = '_';
>>  }
>>  S += tmpName;
>> 
>> Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaChecking.cpp Fri Feb  8 16:30:41 2013
>> @@ -24,6 +24,7 @@
>> #include "clang/AST/StmtCXX.h"
>> #include "clang/AST/StmtObjC.h"
>> #include "clang/Analysis/Analyses/FormatString.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/TargetBuiltins.h"
>> #include "clang/Basic/TargetInfo.h"
>> #include "clang/Lex/Preprocessor.h"
>> @@ -6172,7 +6173,7 @@ static bool isSetterLikeSelector(Selecto
>>    return false;
>> 
>>  if (str.empty()) return true;
>> -  return !islower(str.front());
>> +  return !isLowercase(str.front());
>> }
>> 
>> /// Check a message send to see if it's likely to cause a retain cycle.
>> 
>> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Fri Feb  8 16:30:41 2013
>> @@ -19,6 +19,7 @@
>> #include "clang/AST/DeclObjC.h"
>> #include "clang/AST/DeclTemplate.h"
>> #include "clang/AST/Expr.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/SourceManager.h"
>> #include "clang/Basic/TargetInfo.h"
>> #include "clang/Sema/DeclSpec.h"
>> @@ -4478,7 +4479,7 @@ static void handleUuidAttr(Sema &S, Decl
>>          S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
>>          return;
>>        }
>> -      } else if (!isxdigit(*I)) {
>> +      } else if (!isHexDigit(*I)) {
>>        S.Diag(Attr.getLoc(), diag::err_attribute_uuid_malformed_guid);
>>        return;
>>      }
>> 
>> Modified: cfe/trunk/lib/Sema/SemaPseudoObject.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaPseudoObject.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaPseudoObject.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaPseudoObject.cpp Fri Feb  8 16:30:41 2013
>> @@ -32,6 +32,7 @@
>> 
>> #include "clang/Sema/SemaInternal.h"
>> #include "clang/AST/ExprObjC.h"
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Lex/Preprocessor.h"
>> #include "clang/Sema/Initialization.h"
>> #include "clang/Sema/ScopeInfo.h"
>> @@ -562,8 +563,9 @@ bool ObjCPropertyOpBuilder::findSetter(b
>>      if (const ObjCInterfaceDecl *IFace =
>>          dyn_cast<ObjCInterfaceDecl>(setter->getDeclContext())) {
>>        const StringRef thisPropertyName(prop->getName());
>> +        // Try flipping the case of the first character.
>>        char front = thisPropertyName.front();
>> -        front = islower(front) ? toupper(front) : tolower(front);
>> +        front = isLowercase(front) ? toUppercase(front) : toLowercase(front);
>>        SmallString<100> PropertyName = thisPropertyName;
>>        PropertyName[0] = front;
>>        IdentifierInfo *AltMember = &S.PP.getIdentifierTable().get(PropertyName);
>> 
>> Modified: cfe/trunk/tools/driver/driver.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/driver.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/tools/driver/driver.cpp (original)
>> +++ cfe/trunk/tools/driver/driver.cpp Fri Feb  8 16:30:41 2013
>> @@ -12,6 +12,7 @@
>> //
>> //===----------------------------------------------------------------------===//
>> 
>> +#include "clang/Basic/CharInfo.h"
>> #include "clang/Basic/DiagnosticOptions.h"
>> #include "clang/Driver/ArgList.h"
>> #include "clang/Driver/Compilation.h"
>> @@ -42,7 +43,6 @@
>> #include "llvm/Support/Timer.h"
>> #include "llvm/Support/raw_ostream.h"
>> #include "llvm/Support/system_error.h"
>> -#include <cctype>
>> using namespace clang;
>> using namespace clang::driver;
>> 
>> @@ -202,7 +202,7 @@ static void ExpandArgsFromBuf(const char
>>  std::string CurArg;
>> 
>>  for (const char *P = Buf; ; ++P) {
>> -    if (*P == '\0' || (isspace(*P) && InQuote == ' ')) {
>> +    if (*P == '\0' || (isWhitespace(*P) && InQuote == ' ')) {
>>      if (!CurArg.empty()) {
>> 
>>        if (CurArg[0] != '@') {
>> @@ -219,7 +219,7 @@ static void ExpandArgsFromBuf(const char
>>        continue;
>>    }
>> 
>> -    if (isspace(*P)) {
>> +    if (isWhitespace(*P)) {
>>      if (InQuote != ' ')
>>        CurArg.push_back(*P);
>>      continue;
>> 
>> Modified: cfe/trunk/unittests/Basic/CharInfoTest.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Basic/CharInfoTest.cpp?rev=174768&r1=174767&r2=174768&view=diff
>> ==============================================================================
>> --- cfe/trunk/unittests/Basic/CharInfoTest.cpp (original)
>> +++ cfe/trunk/unittests/Basic/CharInfoTest.cpp Fri Feb  8 16:30:41 2013
>> @@ -374,4 +374,126 @@ TEST(CharInfoTest, isRawStringDelimBody)
>>  EXPECT_TRUE(isRawStringDelimBody('/'));
>>  EXPECT_FALSE(isRawStringDelimBody('('));
>>  EXPECT_FALSE(isRawStringDelimBody('\0'));
>> +
>> +  EXPECT_FALSE(isRawStringDelimBody('\x80'));
>> +  EXPECT_FALSE(isRawStringDelimBody('\xc2'));
>> +  EXPECT_FALSE(isRawStringDelimBody('\xff'));
>> +}
>> +
>> +TEST(CharInfoTest, toLowercase) {
>> +  EXPECT_EQ('0', toLowercase('0'));
>> +  EXPECT_EQ('9', toLowercase('9'));
>> +
>> +  EXPECT_EQ('a', toLowercase('a'));
>> +  EXPECT_EQ('a', toLowercase('A'));
>> +
>> +  EXPECT_EQ('z', toLowercase('z'));
>> +  EXPECT_EQ('z', toLowercase('Z'));
>> +
>> +  EXPECT_EQ('.', toLowercase('.'));
>> +  EXPECT_EQ('_', toLowercase('_'));
>> +
>> +  EXPECT_EQ('/', toLowercase('/'));
>> +  EXPECT_EQ('\0', toLowercase('\0'));
>> +}
>> +
>> +TEST(CharInfoTest, toUppercase) {
>> +  EXPECT_EQ('0', toUppercase('0'));
>> +  EXPECT_EQ('9', toUppercase('9'));
>> +
>> +  EXPECT_EQ('A', toUppercase('a'));
>> +  EXPECT_EQ('A', toUppercase('A'));
>> +
>> +  EXPECT_EQ('Z', toUppercase('z'));
>> +  EXPECT_EQ('Z', toUppercase('Z'));
>> +
>> +  EXPECT_EQ('.', toUppercase('.'));
>> +  EXPECT_EQ('_', toUppercase('_'));
>> +
>> +  EXPECT_EQ('/', toUppercase('/'));
>> +  EXPECT_EQ('\0', toUppercase('\0'));
>> +}
>> +
>> +TEST(CharInfoTest, isValidIdentifier) {
>> +  EXPECT_FALSE(isValidIdentifier(""));
>> +
>> +  // 1 character
>> +  EXPECT_FALSE(isValidIdentifier("."));
>> +  EXPECT_FALSE(isValidIdentifier("\n"));
>> +  EXPECT_FALSE(isValidIdentifier(" "));
>> +  EXPECT_FALSE(isValidIdentifier("\x80"));
>> +  EXPECT_FALSE(isValidIdentifier("\xc2"));
>> +  EXPECT_FALSE(isValidIdentifier("\xff"));
>> +  EXPECT_FALSE(isValidIdentifier("$"));
>> +  EXPECT_FALSE(isValidIdentifier("1"));
>> +
>> +  EXPECT_TRUE(isValidIdentifier("_"));
>> +  EXPECT_TRUE(isValidIdentifier("a"));
>> +  EXPECT_TRUE(isValidIdentifier("z"));
>> +  EXPECT_TRUE(isValidIdentifier("A"));
>> +  EXPECT_TRUE(isValidIdentifier("Z"));
>> +
>> +  // 2 characters, '_' suffix
>> +  EXPECT_FALSE(isValidIdentifier("._"));
>> +  EXPECT_FALSE(isValidIdentifier("\n_"));
>> +  EXPECT_FALSE(isValidIdentifier(" _"));
>> +  EXPECT_FALSE(isValidIdentifier("\x80_"));
>> +  EXPECT_FALSE(isValidIdentifier("\xc2_"));
>> +  EXPECT_FALSE(isValidIdentifier("\xff_"));
>> +  EXPECT_FALSE(isValidIdentifier("$_"));
>> +  EXPECT_FALSE(isValidIdentifier("1_"));
>> +
>> +  EXPECT_TRUE(isValidIdentifier("__"));
>> +  EXPECT_TRUE(isValidIdentifier("a_"));
>> +  EXPECT_TRUE(isValidIdentifier("z_"));
>> +  EXPECT_TRUE(isValidIdentifier("A_"));
>> +  EXPECT_TRUE(isValidIdentifier("Z_"));
>> +
>> +  // 2 characters, '_' prefix
>> +  EXPECT_FALSE(isValidIdentifier("_."));
>> +  EXPECT_FALSE(isValidIdentifier("_\n"));
>> +  EXPECT_FALSE(isValidIdentifier("_ "));
>> +  EXPECT_FALSE(isValidIdentifier("_\x80"));
>> +  EXPECT_FALSE(isValidIdentifier("_\xc2"));
>> +  EXPECT_FALSE(isValidIdentifier("_\xff"));
>> +  EXPECT_FALSE(isValidIdentifier("_$"));
>> +  EXPECT_TRUE(isValidIdentifier("_1"));
>> +
>> +  EXPECT_TRUE(isValidIdentifier("__"));
>> +  EXPECT_TRUE(isValidIdentifier("_a"));
>> +  EXPECT_TRUE(isValidIdentifier("_z"));
>> +  EXPECT_TRUE(isValidIdentifier("_A"));
>> +  EXPECT_TRUE(isValidIdentifier("_Z"));
>> +
>> +  // 3 characters, '__' prefix
>> +  EXPECT_FALSE(isValidIdentifier("__."));
>> +  EXPECT_FALSE(isValidIdentifier("__\n"));
>> +  EXPECT_FALSE(isValidIdentifier("__ "));
>> +  EXPECT_FALSE(isValidIdentifier("__\x80"));
>> +  EXPECT_FALSE(isValidIdentifier("__\xc2"));
>> +  EXPECT_FALSE(isValidIdentifier("__\xff"));
>> +  EXPECT_FALSE(isValidIdentifier("__$"));
>> +  EXPECT_TRUE(isValidIdentifier("__1"));
>> +
>> +  EXPECT_TRUE(isValidIdentifier("___"));
>> +  EXPECT_TRUE(isValidIdentifier("__a"));
>> +  EXPECT_TRUE(isValidIdentifier("__z"));
>> +  EXPECT_TRUE(isValidIdentifier("__A"));
>> +  EXPECT_TRUE(isValidIdentifier("__Z"));
>> +
>> +  // 3 characters, '_' prefix and suffix
>> +  EXPECT_FALSE(isValidIdentifier("_._"));
>> +  EXPECT_FALSE(isValidIdentifier("_\n_"));
>> +  EXPECT_FALSE(isValidIdentifier("_ _"));
>> +  EXPECT_FALSE(isValidIdentifier("_\x80_"));
>> +  EXPECT_FALSE(isValidIdentifier("_\xc2_"));
>> +  EXPECT_FALSE(isValidIdentifier("_\xff_"));
>> +  EXPECT_FALSE(isValidIdentifier("_$_"));
>> +  EXPECT_TRUE(isValidIdentifier("_1_"));
>> +
>> +  EXPECT_TRUE(isValidIdentifier("___"));
>> +  EXPECT_TRUE(isValidIdentifier("_a_"));
>> +  EXPECT_TRUE(isValidIdentifier("_z_"));
>> +  EXPECT_TRUE(isValidIdentifier("_A_"));
>> +  EXPECT_TRUE(isValidIdentifier("_Z_"));
>> }
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>> ---------------------------------------------------------------------
>> Intel Israel (74) Limited
>> 
>> This e-mail and any attachments may contain confidential material for
>> the sole use of the intended recipient(s). Any review or distribution
>> by others is strictly prohibited. If you are not the intended
>> recipient, please contact the sender and delete all copies.
>> 
> 
> ---------------------------------------------------------------------
> Intel Israel (74) Limited
> 
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> ---------------------------------------------------------------------
> Intel Israel (74) Limited
> 
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
> <cctype_argfix.patch>




More information about the cfe-commits mailing list