diff options
author | Anders Carlsson <andersca@mac.com> | 2010-01-31 17:18:49 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-01-31 17:18:49 +0000 |
commit | 8abde4b447dba9647a50b04e732294e2e2a4e843 (patch) | |
tree | 6d0124cde73e8f25b2f64d46e5c18ec41638ab9c /clang/lib/AST/Expr.cpp | |
parent | cd6d4260757c9c7a82aff1c0bde11083334d5f6e (diff) | |
download | bcm5719-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.cpp | 19 |
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 { |