diff options
-rw-r--r-- | lib/Frontend/ASTUnit.cpp | 2 | ||||
-rw-r--r-- | lib/Frontend/CompilerInstance.cpp | 1 | ||||
-rw-r--r-- | lib/Parse/Parser.cpp | 5 | ||||
-rw-r--r-- | test/Index/code-completion-skip-bodies.cpp | 17 |
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} |