summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-12-05 02:17:18 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-12-05 02:17:18 +0000
commit72fe5b1bcc454a2fc40eef44dceab6905326cadc (patch)
treedc905233d33f23a65d27f4c698f107389ae6e31a /clang
parent4fb3d9fcd7ace193d2d01ebbb63a3af434dbf204 (diff)
downloadbcm5719-llvm-72fe5b1bcc454a2fc40eef44dceab6905326cadc.tar.gz
bcm5719-llvm-72fe5b1bcc454a2fc40eef44dceab6905326cadc.zip
CIndex: For the time being, don't return translation units if we encounter an error during parsing.
- 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. llvm-svn: 90643
Diffstat (limited to 'clang')
-rw-r--r--clang/test/Index/cindex-on-invalid.m8
-rw-r--r--clang/tools/CIndex/CIndex.cpp18
2 files changed, 22 insertions, 4 deletions
diff --git a/clang/test/Index/cindex-on-invalid.m b/clang/test/Index/cindex-on-invalid.m
new file mode 100644
index 00000000000..651c40a3353
--- /dev/null
+++ b/clang/test/Index/cindex-on-invalid.m
@@ -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
diff --git a/clang/tools/CIndex/CIndex.cpp b/clang/tools/CIndex/CIndex.cpp
index 12c3935ca12..9259818e0ec 100644
--- a/clang/tools/CIndex/CIndex.cpp
+++ b/clang/tools/CIndex/CIndex.cpp
@@ -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'.
OpenPOWER on IntegriCloud