diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-07-18 19:53:23 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-07-18 19:53:23 +0000 |
commit | e04c470afa508e15dcddacb45393dc6d2cbf4cdd (patch) | |
tree | 6d17f147e86b8d365e88f0a08ae55d61207d64cb /clang/lib/CodeGen/CGExprCXX.cpp | |
parent | 18a9ac91295eaf8f5bf3145b57450a04b393f247 (diff) | |
download | bcm5719-llvm-e04c470afa508e15dcddacb45393dc6d2cbf4cdd.tar.gz bcm5719-llvm-e04c470afa508e15dcddacb45393dc6d2cbf4cdd.zip |
Address Richard's comments
llvm-svn: 213403
Diffstat (limited to 'clang/lib/CodeGen/CGExprCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExprCXX.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CGExprCXX.cpp b/clang/lib/CodeGen/CGExprCXX.cpp index 8cadd6c1eb2..768fab726b0 100644 --- a/clang/lib/CodeGen/CGExprCXX.cpp +++ b/clang/lib/CodeGen/CGExprCXX.cpp @@ -1616,14 +1616,13 @@ void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) { } static bool isGLValueFromPointerDeref(const Expr *E) { - E = E->IgnoreParenCasts(); + E = E->IgnoreParens(); - if (isa<ArraySubscriptExpr>(E)) - return true; - - if (const auto *UO = dyn_cast<UnaryOperator>(E)) - if (UO->getOpcode() == UO_Deref) - return true; + if (const auto *CE = dyn_cast<CastExpr>(E)) { + if (!CE->getSubExpr()->isGLValue()) + return false; + return isGLValueFromPointerDeref(CE->getSubExpr()); + } if (const auto *BO = dyn_cast<BinaryOperator>(E)) if (BO->getOpcode() == BO_Comma) @@ -1638,6 +1637,15 @@ static bool isGLValueFromPointerDeref(const Expr *E) { return isGLValueFromPointerDeref(OVE->getSourceExpr()) || isGLValueFromPointerDeref(BCO->getFalseExpr()); + // C++11 [expr.sub]p1: + // The expression E1[E2] is identical (by definition) to *((E1)+(E2)) + if (isa<ArraySubscriptExpr>(E)) + return true; + + if (const auto *UO = dyn_cast<UnaryOperator>(E)) + if (UO->getOpcode() == UO_Deref) + return true; + return false; } |