diff options
author | John McCall <rjmccall@apple.com> | 2009-12-21 10:41:20 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2009-12-21 10:41:20 +0000 |
commit | b5a0d316dc77a6c7fa7289fac34cb3fd7fcb3c3d (patch) | |
tree | b1141b86795996944781ec7115053e4434d63a60 | |
parent | a91c0f48e6a0a5f2be7502753cd2f3885e89feaf (diff) | |
download | bcm5719-llvm-b5a0d316dc77a6c7fa7289fac34cb3fd7fcb3c3d.tar.gz bcm5719-llvm-b5a0d316dc77a6c7fa7289fac34cb3fd7fcb3c3d.zip |
Reorganize the base-lookup bits of ActOnMemInitializer in order to better
support diagnostics and error recovery.
llvm-svn: 91825
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 674a4bd9560..7343e9f2e73 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1002,16 +1002,32 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD, } // It didn't name a member, so see if it names a class. QualType BaseType; - TypeSourceInfo *TInfo = 0; - if (TemplateTypeTy) + + if (TemplateTypeTy) { BaseType = GetTypeFromParser(TemplateTypeTy, &TInfo); - else - BaseType = QualType::getFromOpaquePtr(getTypeName(*MemberOrBase, IdLoc, - S, &SS)); - if (BaseType.isNull()) - return Diag(IdLoc, diag::err_mem_init_not_member_or_class) - << MemberOrBase << SourceRange(IdLoc, RParenLoc); + } else { + LookupResult R(*this, MemberOrBase, IdLoc, LookupOrdinaryName); + LookupParsedName(R, S, &SS); + + TypeDecl *TyD = R.getAsSingle<TypeDecl>(); + if (!TyD) { + if (R.isAmbiguous()) return true; + + Diag(IdLoc, diag::err_mem_init_not_member_or_class) + << MemberOrBase << SourceRange(IdLoc, RParenLoc); + return true; + } + + BaseType = Context.getTypeDeclType(TyD); + if (SS.isSet()) { + NestedNameSpecifier *Qualifier = + static_cast<NestedNameSpecifier*>(SS.getScopeRep()); + + // FIXME: preserve source range information + BaseType = Context.getQualifiedNameType(Qualifier, BaseType); + } + } if (!TInfo) TInfo = Context.getTrivialTypeSourceInfo(BaseType, IdLoc); |