diff options
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index c01097e363c..394bc979277 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2025,7 +2025,9 @@ Sema::BuildMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, if (BaseType->isDependentType()) return Owned(new (Context) CXXUnresolvedMemberExpr(Context, BaseExpr, true, - OpLoc, + OpLoc, + (NestedNameSpecifier *)(SS? SS->getScopeRep() : 0), + SS? SS->getRange() : SourceRange(), MemberName, MemberLoc)); else if (const PointerType *PT = BaseType->getAs<PointerType>()) @@ -2053,6 +2055,8 @@ Sema::BuildMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, return Owned(new (Context) CXXUnresolvedMemberExpr(Context, BaseExpr, false, OpLoc, + (NestedNameSpecifier *)(SS? SS->getScopeRep() : 0), + SS? SS->getRange() : SourceRange(), MemberName, MemberLoc)); } @@ -2082,29 +2086,29 @@ Sema::BuildMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, LookupResult Result = LookupQualifiedName(DC, MemberName, LookupMemberName, false); + if (!Result) + return ExprError(Diag(MemberLoc, diag::err_typecheck_no_member_deprecated) + << MemberName << BaseExpr->getSourceRange()); + if (Result.isAmbiguous()) { + DiagnoseAmbiguousLookup(Result, MemberName, MemberLoc, + BaseExpr->getSourceRange()); + return ExprError(); + } + if (SS && SS->isSet()) { QualType BaseTypeCanon = Context.getCanonicalType(BaseType).getUnqualifiedType(); QualType MemberTypeCanon = Context.getCanonicalType( - Context.getTypeDeclType( - dyn_cast<TypeDecl>(Result.getAsDecl()->getDeclContext()))); - + Context.getTypeDeclType( + dyn_cast<TypeDecl>(Result.getAsDecl()->getDeclContext()))); + if (BaseTypeCanon != MemberTypeCanon && !IsDerivedFrom(BaseTypeCanon, MemberTypeCanon)) return ExprError(Diag(SS->getBeginLoc(), diag::err_not_direct_base_or_virtual) << MemberTypeCanon << BaseTypeCanon); } - - if (!Result) - return ExprError(Diag(MemberLoc, diag::err_typecheck_no_member_deprecated) - << MemberName << BaseExpr->getSourceRange()); - if (Result.isAmbiguous()) { - DiagnoseAmbiguousLookup(Result, MemberName, MemberLoc, - BaseExpr->getSourceRange()); - return ExprError(); - } NamedDecl *MemberDecl = Result; |

