diff options
author | John McCall <rjmccall@apple.com> | 2010-02-08 19:26:07 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-02-08 19:26:07 +0000 |
commit | 69f9dbc3e4a4a22b6aea560d386d70cabc885ef8 (patch) | |
tree | 723e679850897dab78f57f86d548c0996222f1c2 | |
parent | 75cc359fdc062b1f484929c97d27a76167a47a33 (diff) | |
download | bcm5719-llvm-69f9dbc3e4a4a22b6aea560d386d70cabc885ef8.tar.gz bcm5719-llvm-69f9dbc3e4a4a22b6aea560d386d70cabc885ef8.zip |
Fix the crash-on-invalid from PR6259.
llvm-svn: 95554
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 8 | ||||
-rw-r--r-- | clang/test/SemaCXX/nested-name-spec.cpp | 9 |
2 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 4e448d81976..abb4e786d6c 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -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; } diff --git a/clang/test/SemaCXX/nested-name-spec.cpp b/clang/test/SemaCXX/nested-name-spec.cpp index dbbf1fecc9f..8a217b31208 100644 --- a/clang/test/SemaCXX/nested-name-spec.cpp +++ b/clang/test/SemaCXX/nested-name-spec.cpp @@ -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}} + } +} |