diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-02-09 02:44:08 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-02-09 02:44:08 +0000 |
commit | 4bbb8501d9db2ae72b1e39afaafa5795d67ffe03 (patch) | |
tree | 5ca821bcb0736ec33085ab5f2d6d58530ae26e94 /lib/Serialization | |
parent | 5e058eb02875530f1aed10c3417a1011744239b1 (diff) |
[PCH] Avoid using Decl::setAttrs() and Decl::setLexicalDeclContext() from the ASTReaderDecl
directly; they internally call Decl::getASTContext() which may crash if a declaration context
parent is still deserializing.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150137 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Serialization')
-rw-r--r-- | lib/Serialization/ASTReaderDecl.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index fbe861d6cc..690c81ce53 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -324,12 +324,11 @@ void ASTDeclReader::Visit(Decl *D) { } else if (D->isTemplateParameter()) { // If we have a fully initialized template parameter, we can now // set its DeclContext. - D->setDeclContext( - cast_or_null<DeclContext>( - Reader.GetDecl(DeclContextIDForTemplateParmDecl))); - D->setLexicalDeclContext( - cast_or_null<DeclContext>( - Reader.GetDecl(LexicalDeclContextIDForTemplateParmDecl))); + DeclContext *SemaDC = cast<DeclContext>( + Reader.GetDecl(DeclContextIDForTemplateParmDecl)); + DeclContext *LexicalDC = cast<DeclContext>( + Reader.GetDecl(LexicalDeclContextIDForTemplateParmDecl)); + D->setDeclContextsImpl(SemaDC, LexicalDC, Reader.getContext()); } } @@ -343,15 +342,16 @@ void ASTDeclReader::VisitDecl(Decl *D) { LexicalDeclContextIDForTemplateParmDecl = ReadDeclID(Record, Idx); D->setDeclContext(Reader.getContext().getTranslationUnitDecl()); } else { - D->setDeclContext(ReadDeclAs<DeclContext>(Record, Idx)); - D->setLexicalDeclContext(ReadDeclAs<DeclContext>(Record, Idx)); + DeclContext *SemaDC = ReadDeclAs<DeclContext>(Record, Idx); + DeclContext *LexicalDC = ReadDeclAs<DeclContext>(Record, Idx); + D->setDeclContextsImpl(SemaDC, LexicalDC, Reader.getContext()); } D->setLocation(Reader.ReadSourceLocation(F, RawLocation)); D->setInvalidDecl(Record[Idx++]); if (Record[Idx++]) { // hasAttrs AttrVec Attrs; Reader.ReadAttributes(F, Attrs, Record, Idx); - D->setAttrs(Attrs); + D->setAttrsImpl(Attrs, Reader.getContext()); } D->setImplicit(Record[Idx++]); D->setUsed(Record[Idx++]); |