[cfe-commits] r145339 - in /cfe/trunk: test/Misc/serialized-diags.c tools/libclang/CXLoadedDiagnostic.cpp

Ted Kremenek kremenek at apple.com
Mon Nov 28 16:30:52 PST 2011


Author: kremenek
Date: Mon Nov 28 18:30:52 2011
New Revision: 145339

URL: http://llvm.org/viewvc/llvm-project?rev=145339&view=rev
Log:
Fix serialized diagnostics to handle FixIts that only remove text.  Fixes <rdar://problem/10473903>.

Modified:
    cfe/trunk/test/Misc/serialized-diags.c
    cfe/trunk/tools/libclang/CXLoadedDiagnostic.cpp

Modified: cfe/trunk/test/Misc/serialized-diags.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/serialized-diags.c?rev=145339&r1=145338&r2=145339&view=diff
==============================================================================
--- cfe/trunk/test/Misc/serialized-diags.c (original)
+++ cfe/trunk/test/Misc/serialized-diags.c Mon Nov 28 18:30:52 2011
@@ -8,6 +8,13 @@
   dragon = dragon + 1
 }
 
+// Test handling of FixIts that only remove text.
+int baz();
+void qux(int x) {
+  if ((x == baz()))
+   return;
+}
+
 // RUN: rm -f %t
 // RUN: %clang -Wall -fsyntax-only %s --serialize-diagnostics %t 2>&1 /dev/null || true
 // RUN: c-index-test -read-diagnostics %t 2>&1 | FileCheck %s
@@ -21,3 +28,12 @@
 // CHECK: +-FIXIT: ({{.*[/\\]}}serialized-diags.c:2:13 - {{.*[/\\]}}serialized-diags.c:2:13): " = 0"
 // CHECK: {{.*[/\\]}}serialized-diags.c:8:22: error: expected ';' after expression []
 // CHECK: FIXIT: ({{.*[/\\]}}serialized-diags.c:8:22 - {{.*[/\\]}}serialized-diags.c:8:22): ";"
+// CHECK: {{.*[/\\]}}serialized-diags.c:14:10: warning: equality comparison with extraneous parentheses [-Wparentheses-equality]
+// CHECK: Range: {{.*[/\\]}}serialized-diags.c:14:8 {{.*[/\\]}}serialized-diags.c:14:18
+// CHECK: +-{{.*[/\\]}}serialized-diags.c:14:10: note: remove extraneous parentheses around the comparison to silence this warning []
+// CHECK: +-FIXIT: ({{.*[/\\]}}serialized-diags.c:14:7 - {{.*[/\\]}}serialized-diags.c:14:8): ""
+// CHECK: +-FIXIT: ({{.*[/\\]}}serialized-diags.c:14:18 - {{.*[/\\]}}serialized-diags.c:14:19): ""
+// CHECK: +-{{.*[/\\]}}serialized-diags.c:14:10: note: use '=' to turn this equality comparison into an assignment []
+// CHECK: +-FIXIT: ({{.*[/\\]}}serialized-diags.c:14:10 - {{.*[/\\]}}serialized-diags.c:14:12): "="
+// CHECK: Number of diagnostics: 3
+

Modified: cfe/trunk/tools/libclang/CXLoadedDiagnostic.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXLoadedDiagnostic.cpp?rev=145339&r1=145338&r2=145339&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CXLoadedDiagnostic.cpp (original)
+++ cfe/trunk/tools/libclang/CXLoadedDiagnostic.cpp Mon Nov 28 18:30:52 2011
@@ -220,14 +220,16 @@
                         Strings &strings, llvm::StringRef errorContext,
                         RecordData &Record,
                         const char *BlobStart,
-                        unsigned BlobLen);
+                        unsigned BlobLen,
+                        bool allowEmptyString = false);
 
   LoadResult readString(CXLoadedDiagnosticSetImpl &TopDiags,
                         llvm::StringRef &RetStr,
                         llvm::StringRef errorContext,
                         RecordData &Record,
                         const char *BlobStart,
-                        unsigned BlobLen);
+                        unsigned BlobLen,
+                        bool allowEmptyString = false);
 
   LoadResult readRange(CXLoadedDiagnosticSetImpl &TopDiags,
                        RecordData &Record, unsigned RecStartIdx,
@@ -445,7 +447,8 @@
                                   llvm::StringRef errorContext,
                                   RecordData &Record,
                                   const char *BlobStart,
-                                  unsigned BlobLen) {
+                                  unsigned BlobLen,
+                                  bool allowEmptyString) {
   
   // Basic buffer overflow check.
   if (BlobLen > 65536) {
@@ -453,6 +456,11 @@
                       std::string(errorContext));
     return Failure;
   }
+
+  if (allowEmptyString && Record.size() >= 1 && BlobLen == 0) {
+    RetStr = "";
+    return Success;
+  }
   
   if (Record.size() < 1 || BlobLen == 0) {
     reportInvalidFile(std::string("Corrupted ") + std::string(errorContext)
@@ -469,9 +477,11 @@
                                   llvm::StringRef errorContext,
                                   RecordData &Record,
                                   const char *BlobStart,
-                                  unsigned BlobLen) {
+                                  unsigned BlobLen,
+                                  bool allowEmptyString) {
   llvm::StringRef RetStr;
-  if (readString(TopDiags, RetStr, errorContext, Record, BlobStart, BlobLen))
+  if (readString(TopDiags, RetStr, errorContext, Record, BlobStart, BlobLen,
+                 allowEmptyString))
     return Failure;
   strings[Record[0]] = RetStr;
   return Success;
@@ -627,7 +637,8 @@
         if (readRange(TopDiags, Record, 0, SR))
           return Failure;
         llvm::StringRef RetStr;
-        if (readString(TopDiags, RetStr, "FIXIT", Record, BlobStart, BlobLen))
+        if (readString(TopDiags, RetStr, "FIXIT", Record, BlobStart, BlobLen,
+                       /* allowEmptyString */ true))
           return Failure;
         D->FixIts.push_back(std::make_pair(SR, createCXString(RetStr, false)));
         continue;





More information about the cfe-commits mailing list