Fix the crash-on-invalid from PR6259.

llvm-svn: 95554
This commit is contained in:
John McCall 2010-02-08 19:26:07 +00:00
parent 75cc359fdc
commit 69f9dbc3e4
2 changed files with 16 additions and 1 deletions

View File

@ -700,7 +700,13 @@ static void DecomposeTemplateName(LookupResult &R, const UnqualifiedId &Id) {
R.resolveKind();
}
/// Determines whether the given record is "fully-formed" at the given
/// location, i.e. whether a qualified lookup into it is assured of
/// getting consistent results already.
static bool IsFullyFormedScope(Sema &SemaRef, CXXRecordDecl *Record) {
if (!Record->hasDefinition())
return false;
for (CXXRecordDecl::base_class_iterator I = Record->bases_begin(),
E = Record->bases_end(); I != E; ++I) {
CanQualType BaseT = SemaRef.Context.getCanonicalType((*I).getType());
@ -708,7 +714,7 @@ static bool IsFullyFormedScope(Sema &SemaRef, CXXRecordDecl *Record) {
if (!BaseRT) return false;
CXXRecordDecl *BaseRecord = cast<CXXRecordDecl>(BaseRT->getDecl());
if (!BaseRecord->isDefinition() ||
if (!BaseRecord->hasDefinition() ||
!IsFullyFormedScope(SemaRef, BaseRecord))
return false;
}

View File

@ -220,3 +220,12 @@ namespace test2 {
int *ns::count_ptr = &count;
}
// PR6259, invalid case
namespace test3 {
// FIXME: this should really only trigger once
class A; // expected-note 2 {{forward declaration}}
void foo(const char *path) {
A::execute(path); // expected-error 2 {{incomplete type 'class test3::A' named in nested name specifier}}
}
}