diff options
-rw-r--r-- | include/clang/AST/Expr.h | 4 | ||||
-rw-r--r-- | lib/AST/Expr.cpp | 6 | ||||
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 9 |
3 files changed, 15 insertions, 4 deletions
diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 961eb21e5a..6579b595e5 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -2086,6 +2086,10 @@ public: return SourceRange(getBase()->getLocStart(), AccessorLoc); } + /// isArrow - Return true if the base expression is a pointer to vector, + /// return false if the base expression is a vector. + bool isArrow() const; + static bool classof(const Stmt *T) { return T->getStmtClass() == ExtVectorElementExprClass; } diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 7a04ffcedc..9e0d0cd954 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1294,6 +1294,12 @@ bool Expr::isBitField() { 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 { + return getBase()->getType()->isPointerType(); +} + unsigned ExtVectorElementExpr::getNumElements() const { if (const VectorType *VT = getType()->getAsVectorType()) return VT->getNumElements(); diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 03efbc9ad5..01a5514d6e 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -797,12 +797,13 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { LValue Base; // ExtVectorElementExpr's base can either be a vector or pointer to vector. - if (const PointerType *PT = E->getBase()->getType()->getAsPointerType()) { - llvm::Value *Ptr = EmitScalarExpr(E->getBase()); - Base = LValue::MakeAddr(Ptr, PT->getPointeeType().getCVRQualifiers()); - } else { + if (!E->isArrow()) { assert(E->getBase()->getType()->isVectorType()); Base = EmitLValue(E->getBase()); + } else { + const PointerType *PT = E->getBase()->getType()->getAsPointerType(); + llvm::Value *Ptr = EmitScalarExpr(E->getBase()); + Base = LValue::MakeAddr(Ptr, PT->getPointeeType().getCVRQualifiers()); } // Encode the element access list into a vector of unsigned indices. |