aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Frontend/ASTUnit.cpp2
-rw-r--r--lib/Frontend/CompilerInstance.cpp1
-rw-r--r--lib/Parse/Parser.cpp5
-rw-r--r--test/Index/code-completion-skip-bodies.cpp17
4 files changed, 20 insertions, 5 deletions
diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp
index 3bcbdb5f99..cc93d46692 100644
--- a/lib/Frontend/ASTUnit.cpp
+++ b/lib/Frontend/ASTUnit.cpp
@@ -2416,8 +2416,6 @@ void ASTUnit::CodeComplete(StringRef File, unsigned Line, unsigned Column,
= new AugmentedCodeCompleteConsumer(*this, Consumer, CodeCompleteOpts);
Clang->setCodeCompletionConsumer(AugmentedConsumer);
- Clang->getFrontendOpts().SkipFunctionBodies = true;
-
// If we have a precompiled preamble, try to use it. We only allow
// the use of the precompiled preamble if we're if the completion
// point is within the main file, after the end of the precompiled
diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp
index fca9f0ba57..80d15c6498 100644
--- a/lib/Frontend/CompilerInstance.cpp
+++ b/lib/Frontend/CompilerInstance.cpp
@@ -89,7 +89,6 @@ void CompilerInstance::setASTConsumer(ASTConsumer *Value) {
void CompilerInstance::setCodeCompletionConsumer(CodeCompleteConsumer *Value) {
CompletionConsumer.reset(Value);
- getFrontendOpts().SkipFunctionBodies = Value != 0;
}
// Diagnostics
diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp
index dccdc7ba8e..e6b49474f7 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -48,11 +48,12 @@ IdentifierInfo *Parser::getSEHExceptKeyword() {
return Ident__except;
}
-Parser::Parser(Preprocessor &pp, Sema &actions, bool SkipFunctionBodies)
+Parser::Parser(Preprocessor &pp, Sema &actions, bool skipFunctionBodies)
: PP(pp), Actions(actions), Diags(PP.getDiagnostics()),
GreaterThanIsOperator(true), ColonIsSacred(false),
InMessageExpression(false), TemplateParameterDepth(0),
- ParsingInObjCContainer(false), SkipFunctionBodies(SkipFunctionBodies) {
+ ParsingInObjCContainer(false) {
+ SkipFunctionBodies = pp.isCodeCompletionEnabled() || skipFunctionBodies;
Tok.startToken();
Tok.setKind(tok::eof);
Actions.CurScope = 0;
diff --git a/test/Index/code-completion-skip-bodies.cpp b/test/Index/code-completion-skip-bodies.cpp
new file mode 100644
index 0000000000..e6aa4580bf
--- /dev/null
+++ b/test/Index/code-completion-skip-bodies.cpp
@@ -0,0 +1,17 @@
+
+// This is to make sure we skip function bodies.
+void func_to_skip() {
+ undeclared1 = 0;
+}
+
+struct S { int x; };
+
+void func(S *s) {
+ undeclared2 = 0;
+ s->x = 0;
+}
+
+// RUN: c-index-test -code-completion-at=%s:11:6 %s 2>&1 | FileCheck %s
+// CHECK-NOT: error: use of undeclared identifier 'undeclared1'
+// CHECK: error: use of undeclared identifier 'undeclared2'
+// CHECK: FieldDecl:{ResultType int}{TypedText x}