From: John McCall Date: Tue, 16 Nov 2010 01:44:35 +0000 (+0000) Subject: Add an ExternalASTSource hook to complete a type on demand. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=916c870442978db40404d51348cdf5524e506faa;p=clang Add an ExternalASTSource hook to complete a type on demand. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119316 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ExternalASTSource.h b/include/clang/AST/ExternalASTSource.h index 39363787b4..557f8ab36c 100644 --- a/include/clang/AST/ExternalASTSource.h +++ b/include/clang/AST/ExternalASTSource.h @@ -34,6 +34,7 @@ class ExternalSemaSource; // layering violation required for downcasting class NamedDecl; class Selector; class Stmt; +class TagDecl; /// \brief Abstract interface for external sources of AST nodes. /// @@ -142,6 +143,10 @@ public: return FindExternalLexicalDecls(DC, DeclTy::classofKind, Result); } + /// \brief Gives the external AST source an opportunity to complete + /// an incomplete type. + virtual void CompleteType(TagDecl *Tag) {} + /// \brief Notify ExternalASTSource that we started deserialization of /// a decl or type so until FinishedDeserializing is called there may be /// decls that are initializing. Must be paired with FinishedDeserializing. diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 6e857a7f3b..fe0916e787 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -2227,16 +2227,19 @@ bool Sema::RequireCompleteType(SourceLocation Loc, QualType T, if (diag == 0) return true; - const TagType *Tag = 0; - if (const RecordType *Record = T->getAs()) - Tag = Record; - else if (const EnumType *Enum = T->getAs()) - Tag = Enum; + const TagType *Tag = T->getAs(); // Avoid diagnosing invalid decls as incomplete. if (Tag && Tag->getDecl()->isInvalidDecl()) return true; + // Give the external AST source a chance to complete the type. + if (Tag && Tag->getDecl()->hasExternalLexicalStorage()) { + Context.getExternalSource()->CompleteType(Tag->getDecl()); + if (!Tag->isIncompleteType()) + return false; + } + // We have an incomplete type. Produce a diagnostic. Diag(Loc, PD) << T;