forked from OSchip/llvm-project
Add an ExternalASTSource hook to complete a type on demand.
llvm-svn: 119316
This commit is contained in:
parent
92756fff57
commit
2489379756
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue