summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGExprCXX.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-07-18 19:53:23 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-07-18 19:53:23 +0000
commite04c470afa508e15dcddacb45393dc6d2cbf4cdd (patch)
tree6d17f147e86b8d365e88f0a08ae55d61207d64cb /clang/lib/CodeGen/CGExprCXX.cpp
parent18a9ac91295eaf8f5bf3145b57450a04b393f247 (diff)
downloadbcm5719-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.cpp22
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;
}
OpenPOWER on IntegriCloud