summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-03-02 21:06:53 +0000
committerDouglas Gregor <dgregor@apple.com>2011-03-02 21:06:53 +0000
commit25b7e05b72d7a666be3294bdad43e206f30c53ee (patch)
treed93efb62aa02e44bf993b2508dea4e9cdf53344f /clang/lib/AST/ExprCXX.cpp
parentfb55f851a5165dda9265531d76f95472cd42ab82 (diff)
downloadbcm5719-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.cpp39
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 *
OpenPOWER on IntegriCloud