summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/Expr.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2010-01-31 17:18:49 +0000
committerAnders Carlsson <andersca@mac.com>2010-01-31 17:18:49 +0000
commit8abde4b447dba9647a50b04e732294e2e2a4e843 (patch)
tree6d0124cde73e8f25b2f64d46e5c18ec41638ab9c /clang/lib/AST/Expr.cpp
parentcd6d4260757c9c7a82aff1c0bde11083334d5f6e (diff)
downloadbcm5719-llvm-8abde4b447dba9647a50b04e732294e2e2a4e843.tar.gz
bcm5719-llvm-8abde4b447dba9647a50b04e732294e2e2a4e843.zip
Diagnose binding a non-const reference to a vector element.
llvm-svn: 94963
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
-rw-r--r--clang/lib/AST/Expr.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 66f06e090af..b76048a2b8d 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -1977,6 +1977,25 @@ FieldDecl *Expr::getBitField() {
return 0;
}
+bool Expr::refersToVectorElement() const {
+ const Expr *E = this->IgnoreParens();
+
+ while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
+ if (ICE->isLvalueCast() && ICE->getCastKind() == CastExpr::CK_NoOp)
+ E = ICE->getSubExpr()->IgnoreParens();
+ else
+ break;
+ }
+
+ if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E))
+ return ASE->getBase()->getType()->isVectorType();
+
+ if (isa<ExtVectorElementExpr>(E))
+ return true;
+
+ return false;
+}
+
/// isArrow - Return true if the base expression is a pointer to vector,
/// return false if the base expression is a vector.
bool ExtVectorElementExpr::isArrow() const {
OpenPOWER on IntegriCloud