summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2015-03-03 08:04:19 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2015-03-03 08:04:19 +0000
commitf0b4cd1ed3b2a7b20a08253ae915255a51366fc3 (patch)
treef70baca42f69a30cbbc4a7a4b589bfa4c6e86790 /clang
parentb1de8c2b73b77e18f2d022425dc01d69a5afe522 (diff)
downloadbcm5719-llvm-f0b4cd1ed3b2a7b20a08253ae915255a51366fc3.tar.gz
bcm5719-llvm-f0b4cd1ed3b2a7b20a08253ae915255a51366fc3.zip
[ASTUnit] Fix crash when trying to load a module file via ASTUnit::LoadFromASTFile.
rdar://19997358 llvm-svn: 231060
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Frontend/ASTUnit.cpp12
-rw-r--r--clang/test/Index/index-module.m5
-rw-r--r--clang/test/Modules/Inputs/Module.framework/Headers/Module.h6
3 files changed, 18 insertions, 5 deletions
diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp
index bfb1efe3522..d153ca245c3 100644
--- a/clang/lib/Frontend/ASTUnit.cpp
+++ b/clang/lib/Frontend/ASTUnit.cpp
@@ -714,6 +714,13 @@ std::unique_ptr<ASTUnit> ASTUnit::LoadFromASTFile(
*AST->PP, Context, AST->ASTFileLangOpts, AST->TargetOpts, AST->Target,
Counter));
+ // Attach the AST reader to the AST context as an external AST
+ // source, so that declarations will be deserialized from the
+ // AST file as needed.
+ // We need the external source to be set up before we read the AST, because
+ // eagerly-deserialized declarations may use it.
+ Context.setExternalSource(AST->Reader);
+
switch (AST->Reader->ReadAST(Filename, serialization::MK_MainFile,
SourceLocation(), ASTReader::ARR_None)) {
case ASTReader::Success:
@@ -733,11 +740,6 @@ std::unique_ptr<ASTUnit> ASTUnit::LoadFromASTFile(
PP.setCounterValue(Counter);
- // Attach the AST reader to the AST context as an external AST
- // source, so that declarations will be deserialized from the
- // AST file as needed.
- Context.setExternalSource(AST->Reader);
-
// Create an AST consumer, even though it isn't used.
AST->Consumer.reset(new ASTConsumer);
diff --git a/clang/test/Index/index-module.m b/clang/test/Index/index-module.m
index 8ed7a84e2e1..513e98e165c 100644
--- a/clang/test/Index/index-module.m
+++ b/clang/test/Index/index-module.m
@@ -49,6 +49,11 @@ int glob;
// CHECK-TMOD-NEXT: [indexDeclaration]: kind: objc-class-method | name: alloc | {{.*}} | loc: [[TMOD_MODULE_H]]:17:1
// CHECK-TMOD-NEXT: [importedASTFile]: [[PCM:.*\.cache/Module\.pcm]] | loc: [[TMOD_MODULE_H]]:23:2 | name: "Module.Sub" | isImplicit: 1
// CHECK-TMOD-NEXT: [importedASTFile]: [[PCM]] | loc: [[TMOD_MODULE_H]]:24:2 | name: "Module.Buried.Treasure" | isImplicit: 1
+// CHECK-TMOD-NEXT: [indexDeclaration]: kind: typedef | name: FILE | {{.*}} | loc: [[TMOD_MODULE_H]]:30:3
+// CHECK-TMOD-NEXT: [indexDeclaration]: kind: struct | name: __sFILE | {{.*}} | loc: [[TMOD_MODULE_H]]:28:16
+// CHECK-TMOD-NEXT: [indexDeclaration]: kind: field | name: _offset | {{.*}} | loc: [[TMOD_MODULE_H]]:29:7
+// CHECK-TMOD-NEXT: [indexDeclaration]: kind: variable | name: myFile | {{.*}} | loc: [[TMOD_MODULE_H]]:32:14
+// CHECK-TMOD-NEXT: [indexEntityReference]: kind: typedef | name: FILE | {{.*}} | loc: [[TMOD_MODULE_H]]:32:8
// CHECK-TMOD-NEXT: [importedASTFile]: [[PCM]] | loc: [[TMODHDR]]Sub.h:1:2 | name: "Module.Sub2" | isImplicit: 1
// CHECK-TMOD-NEXT: [indexDeclaration]: kind: variable | name: Module_Sub | {{.*}} | loc: [[TMODHDR]]Sub.h:2:6
// CHECK-TMOD-NEXT: [indexDeclaration]: kind: variable | name: Module_Sub2 | USR: c:@Module_Sub2 | {{.*}} | loc: [[TMODHDR]]Sub2.h:1:6
diff --git a/clang/test/Modules/Inputs/Module.framework/Headers/Module.h b/clang/test/Modules/Inputs/Module.framework/Headers/Module.h
index 3d2476b2043..9a1c2b9bd87 100644
--- a/clang/test/Modules/Inputs/Module.framework/Headers/Module.h
+++ b/clang/test/Modules/Inputs/Module.framework/Headers/Module.h
@@ -25,4 +25,10 @@ const char *getModuleVersion(void);
__asm("foo");
+typedef struct __sFILE {
+ int _offset;
+} FILE;
+
+extern FILE *myFile;
+
#endif // MODULE_H
OpenPOWER on IntegriCloud