diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-03-02 21:06:53 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-03-02 21:06:53 +0000 |
commit | 25b7e05b72d7a666be3294bdad43e206f30c53ee (patch) | |
tree | d93efb62aa02e44bf993b2508dea4e9cdf53344f /clang/lib/AST/ExprCXX.cpp | |
parent | fb55f851a5165dda9265531d76f95472cd42ab82 (diff) | |
download | bcm5719-llvm-25b7e05b72d7a666be3294bdad43e206f30c53ee.tar.gz bcm5719-llvm-25b7e05b72d7a666be3294bdad43e206f30c53ee.zip |
Fix the source range for a member access expression that includes a
nested-name-specifier and improve the detection of implicit 'this'
bases. Fixes <rdar://problem/8750392>.
llvm-svn: 126880
Diffstat (limited to 'clang/lib/AST/ExprCXX.cpp')
-rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 39 |
1 files changed, 2 insertions, 37 deletions
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index fb99dc9c860..3dac125990b 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -783,46 +783,11 @@ CXXDependentScopeMemberExpr::CreateEmpty(ASTContext &C, return E; } -/// \brief Determine whether this expression is an implicit C++ 'this'. -static bool isImplicitThis(const Expr *E) { - // Strip away parentheses and casts we don't care about. - while (true) { - if (const ParenExpr *Paren = dyn_cast<ParenExpr>(E)) { - E = Paren->getSubExpr(); - continue; - } - - if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) { - if (ICE->getCastKind() == CK_NoOp || - ICE->getCastKind() == CK_LValueToRValue || - ICE->getCastKind() == CK_DerivedToBase || - ICE->getCastKind() == CK_UncheckedDerivedToBase) { - E = ICE->getSubExpr(); - continue; - } - } - - if (const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) { - if (UnOp->getOpcode() == UO_Extension) { - E = UnOp->getSubExpr(); - continue; - } - } - - break; - } - - if (const CXXThisExpr *This = dyn_cast<CXXThisExpr>(E)) - return This->isImplicit(); - - return false; -} - bool CXXDependentScopeMemberExpr::isImplicitAccess() const { if (Base == 0) return true; - return isImplicitThis(cast<Expr>(Base)); + return cast<Expr>(Base)->isImplicitCXXThis(); } UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, @@ -851,7 +816,7 @@ bool UnresolvedMemberExpr::isImplicitAccess() const { if (Base == 0) return true; - return isImplicitThis(cast<Expr>(Base)); + return cast<Expr>(Base)->isImplicitCXXThis(); } UnresolvedMemberExpr * |