Handle string encoding diagnostics when there are too many invalid ranges.
authorDavid Blaikie <dblaikie@gmail.com>
Tue, 30 Oct 2012 23:22:22 +0000 (23:22 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Tue, 30 Oct 2012 23:22:22 +0000 (23:22 +0000)
llvm-svn: 167059

clang/include/clang/Basic/Diagnostic.h
clang/lib/Lex/LiteralSupport.cpp
clang/test/Misc/wrong-encoding.c

index 9990222..e47f3e1 100644 (file)
@@ -964,6 +964,10 @@ public:
            "Too many arguments to diagnostic!");
     DiagObj->DiagFixItHints[NumFixits++] = Hint;
   }
+
+  bool hasMaxRanges() const {
+    return NumRanges == DiagnosticsEngine::MaxRanges;
+  }
 };
 
 inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
index 2896dc3..91edf4f 100644 (file)
@@ -1425,7 +1425,8 @@ bool StringLiteralParser::CopyStringFragment(const Token &Tok,
     const char *NextStart = resync_utf8(ErrorPtr, Fragment.end());
     StringRef NextFragment(NextStart, Fragment.end()-NextStart);
 
-    while (!ConvertUTF8toWide(CharByteWidth, NextFragment, ResultPtr,
+    while (!Builder.hasMaxRanges() &&
+           !ConvertUTF8toWide(CharByteWidth, NextFragment, ResultPtr,
                               ErrorPtrTmp)) {
       const char *ErrorPtr = reinterpret_cast<const char *>(ErrorPtrTmp);
       NextStart = resync_utf8(ErrorPtr, Fragment.end());
index db37af9..1f186b7 100644 (file)
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -fsyntax-only -Wno-unused-value %s 2>&1 | FileCheck -strict-whitespace %s
+// REQUIRES: asserts
 
 void foo() {
 
@@ -30,4 +31,7 @@ void foo() {
   "xxé¿xxxxxxxxxxxxxxxxxxxxxé¿xx";
 // CHECK: {{^  "xx<E9><BF>xxxxxxxxxxxxxxxxxxxxx<E9><BF>xx";}}
 // CHECK: {{^     \^~~~~~~~                     ~~~~~~~~}}
+
+  "xé¿xé¿xé¿xé¿xé¿xé¿xé¿xé¿xé¿xé¿xé¿xé¿x";
 }
+// CHECK-NOT:Assertion