diff options
| -rw-r--r-- | clang/lib/Frontend/ASTUnit.cpp | 10 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 15 | ||||
| -rw-r--r-- | clang/test/Index/Inputs/preamble-with-error.h | 3 | ||||
| -rw-r--r-- | clang/test/Index/pch-with-errors.m | 6 | ||||
| -rw-r--r-- | clang/test/Index/preamble.c | 8 | 
5 files changed, 36 insertions, 6 deletions
diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 72f5d4c18e0..9080349c956 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -1030,9 +1030,13 @@ public:        // parsing into declaration IDs in the precompiled        // preamble. This will allow us to deserialize those top-level        // declarations when requested. -      for (unsigned I = 0, N = TopLevelDecls.size(); I != N; ++I) -        Unit.addTopLevelDeclFromPreamble( -                                      getWriter().getDeclID(TopLevelDecls[I])); +      for (unsigned I = 0, N = TopLevelDecls.size(); I != N; ++I) { +        Decl *D = TopLevelDecls[I]; +        // Invalid top-level decls may not have been serialized. +        if (D->isInvalidDecl()) +          continue; +        Unit.addTopLevelDeclFromPreamble(getWriter().getDeclID(D)); +      }        Action->setHasEmittedPreamblePCH();      } diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 142e7b12671..ad3e42bce77 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -4047,6 +4047,21 @@ void ASTWriter::WriteASTCore(Sema &SemaRef,      GetDeclRef(*I);    } +  // Make sure all decls associated with an identifier are registered for +  // serialization. +  for (IdentifierTable::iterator ID = PP.getIdentifierTable().begin(), +                              IDEnd = PP.getIdentifierTable().end(); +       ID != IDEnd; ++ID) { +    const IdentifierInfo *II = ID->second; +    if (!Chain || !II->isFromAST() || II->hasChangedSinceDeserialization()) { +      for (IdentifierResolver::iterator D = SemaRef.IdResolver.begin(II), +                                     DEnd = SemaRef.IdResolver.end(); +           D != DEnd; ++D) { +        GetDeclRef(*D); +      } +    } +  } +    // Resolve any declaration pointers within the declaration updates block.    ResolveDeclUpdatesBlocks(); diff --git a/clang/test/Index/Inputs/preamble-with-error.h b/clang/test/Index/Inputs/preamble-with-error.h new file mode 100644 index 00000000000..f840947369b --- /dev/null +++ b/clang/test/Index/Inputs/preamble-with-error.h @@ -0,0 +1,3 @@ +typedef int Int; +enum FFF +extern Int *const www; diff --git a/clang/test/Index/pch-with-errors.m b/clang/test/Index/pch-with-errors.m index cc42cd30814..397f8e8e17c 100644 --- a/clang/test/Index/pch-with-errors.m +++ b/clang/test/Index/pch-with-errors.m @@ -9,6 +9,12 @@  -(void)meth;  @end +struct FFF1 +extern I2 *somevar1; + +enum FFF2 +extern I2 *somevar2; +  #else  void foo(I2 *i) { diff --git a/clang/test/Index/preamble.c b/clang/test/Index/preamble.c index 8a158e9b30c..92a9b84546f 100644 --- a/clang/test/Index/preamble.c +++ b/clang/test/Index/preamble.c @@ -1,5 +1,7 @@  #include "prefix.h"  #include "preamble.h" +#include "preamble-with-error.h" +  int wibble(int);  void f(int x) { @@ -14,10 +16,10 @@ void f(int x) {  // CHECK: preamble.h:4:9: UnexposedExpr=ptr1:3:10 Extent=[4:9 - 4:13]  // CHECK: preamble.h:4:9: DeclRefExpr=ptr1:3:10 Extent=[4:9 - 4:13]  // CHECK: preamble.h:5:10: IntegerLiteral= Extent=[5:10 - 5:11] -// CHECK: preamble.c:3:5: FunctionDecl=wibble:3:5 Extent=[3:1 - 3:16] -// CHECK: preamble.c:3:15: ParmDecl=:3:15 (Definition) Extent=[3:12 - 3:16] +// CHECK: preamble.c:5:5: FunctionDecl=wibble:5:5 Extent=[5:1 - 5:16] +// CHECK: preamble.c:5:15: ParmDecl=:5:15 (Definition) Extent=[5:12 - 5:16]  // CHECK-DIAG: preamble.h:4:7:{4:9-4:13}: warning: incompatible pointer types assigning to 'int *' from 'float *' -// RUN: env CINDEXTEST_EDITING=1 c-index-test -code-completion-at=%s:6:1 -I %S/Inputs -include %t %s 2> %t.stderr.txt | FileCheck -check-prefix CHECK-CC %s +// RUN: env CINDEXTEST_EDITING=1 c-index-test -code-completion-at=%s:8:1 -I %S/Inputs -include %t %s 2> %t.stderr.txt | FileCheck -check-prefix CHECK-CC %s  // CHECK-CC: FunctionDecl:{ResultType int}{TypedText bar}{LeftParen (}{Placeholder int i}{RightParen )} (50)  // CHECK-CC: FunctionDecl:{ResultType void}{TypedText f}{LeftParen (}{Placeholder int x}{RightParen )} (50)  // CHECK-CC: FunctionDecl:{ResultType int}{TypedText foo}{LeftParen (}{Placeholder int}{RightParen )} (50)  | 

