]> granicus.if.org Git - clang/commitdiff
CIndex: For the time being, don't return translation units if we encounter an error...
authorDaniel Dunbar <daniel@zuster.org>
Sat, 5 Dec 2009 02:17:18 +0000 (02:17 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 5 Dec 2009 02:17:18 +0000 (02:17 +0000)
 - We need to be more careful in the rest of CIndex if we are to handle
   possibly-invalid ASTs, and don't have much experience with this yet.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90643 91177308-0d34-0410-b5e6-96231b3b80d8

test/Index/cindex-on-invalid.m [new file with mode: 0644]
tools/CIndex/CIndex.cpp

diff --git a/test/Index/cindex-on-invalid.m b/test/Index/cindex-on-invalid.m
new file mode 100644 (file)
index 0000000..651c40a
--- /dev/null
@@ -0,0 +1,8 @@
+// RUN: not c-index-test -test-load-source local %s > %t 2> %t.err
+// RUN: FileCheck %s < %t.err
+
+// CHECK: error: expected identifier or '('
+// CHECK: Unable to load translation unit!
+
+int foo;
+int
index 12c3935ca12e71b5a3f4fae0af4b1e7dddbecb7b..9259818e0ecaf6027d6dd3040898fc1d92c90c3d 100644 (file)
@@ -508,10 +508,20 @@ clang_createTranslationUnitFromSourceFile(CXIndex CIdx,
                 command_line_args + num_command_line_args);
 
     void *MainAddr = (void *)(uintptr_t)clang_createTranslationUnit;
-    return ASTUnit::LoadFromCommandLine(Args.data(), Args.data() + Args.size(),
-                                        CXXIdx->getDiags(), "<clang>", MainAddr,
-                                        CXXIdx->getOnlyLocalDecls(),
-                                        /* UseBumpAllocator = */ true);
+
+    unsigned NumErrors = CXXIdx->getDiags().getNumErrors();
+    llvm::OwningPtr<ASTUnit> Unit(
+      ASTUnit::LoadFromCommandLine(Args.data(), Args.data() + Args.size(),
+                                   CXXIdx->getDiags(), "<clang>", MainAddr,
+                                   CXXIdx->getOnlyLocalDecls(),
+                                   /* UseBumpAllocator = */ true));
+
+    // FIXME: Until we have broader testing, just drop the entire AST if we
+    // encountered an error.
+    if (NumErrors != CXXIdx->getDiags().getNumErrors())
+      return 0;
+
+    return Unit.take();
   }
 
   // Build up the arguments for invoking 'clang'.