Sema::RequireCompleteType currently attempts to

instantiate a class from its template pattern
before it consults the ExternalASTSource.  LLDB
in particular will sometimes provide patterns
that need to be completed first.

To make this possible, I have moved the
completion before the code that does the
instantiation, allowing the ExternalASTSource
to provide the required information.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146715 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Sean Callanan 2011-12-16 00:20:31 +00:00
Родитель 99ee085101
Коммит bd79119a50
1 изменённых файлов: 28 добавлений и 28 удалений

Просмотреть файл

@ -4065,6 +4065,34 @@ bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
if (!T->isIncompleteType())
return false;
const TagType *Tag = T->getAs<TagType>();
const ObjCInterfaceType *IFace = 0;
if (Tag) {
// Avoid diagnosing invalid decls as incomplete.
if (Tag->getDecl()->isInvalidDecl())
return true;
// Give the external AST source a chance to complete the type.
if (Tag->getDecl()->hasExternalLexicalStorage()) {
Context.getExternalSource()->CompleteType(Tag->getDecl());
if (!Tag->isIncompleteType())
return false;
}
}
else if ((IFace = T->getAs<ObjCInterfaceType>())) {
// Avoid diagnosing invalid decls as incomplete.
if (IFace->getDecl()->isInvalidDecl())
return true;
// Give the external AST source a chance to complete the type.
if (IFace->getDecl()->hasExternalLexicalStorage()) {
Context.getExternalSource()->CompleteType(IFace->getDecl());
if (!IFace->isIncompleteType())
return false;
}
}
// If we have a class template specialization or a class member of a
// class template specialization, or an array with known size of such,
// try to instantiate it.
@ -4096,34 +4124,6 @@ bool Sema::RequireCompleteType(SourceLocation Loc, QualType T,
if (diag == 0)
return true;
const TagType *Tag = T->getAs<TagType>();
const ObjCInterfaceType *IFace = 0;
if (Tag) {
// Avoid diagnosing invalid decls as incomplete.
if (Tag->getDecl()->isInvalidDecl())
return true;
// Give the external AST source a chance to complete the type.
if (Tag->getDecl()->hasExternalLexicalStorage()) {
Context.getExternalSource()->CompleteType(Tag->getDecl());
if (!Tag->isIncompleteType())
return false;
}
}
else if ((IFace = T->getAs<ObjCInterfaceType>())) {
// Avoid diagnosing invalid decls as incomplete.
if (IFace->getDecl()->isInvalidDecl())
return true;
// Give the external AST source a chance to complete the type.
if (IFace->getDecl()->hasExternalLexicalStorage()) {
Context.getExternalSource()->CompleteType(IFace->getDecl());
if (!IFace->isIncompleteType())
return false;
}
}
// We have an incomplete type. Produce a diagnostic.
Diag(Loc, PD) << T;