Add an ExternalASTSource hook to complete a type on demand.

llvm-svn: 119316
This commit is contained in:
John McCall 2010-11-16 01:44:35 +00:00
parent 92756fff57
commit 2489379756
2 changed files with 13 additions and 5 deletions

View File

@ -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.

View File

@ -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<RecordType>())
Tag = Record;
else if (const EnumType *Enum = T->getAs<EnumType>())
Tag = Enum;
const TagType *Tag = T->getAs<TagType>();
// 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;