]> granicus.if.org Git - clang/commitdiff
introduce and use a new ExtVectorElementExpr::isArrow method, at Eli's suggestion
authorChris Lattner <sabre@nondot.org>
Mon, 16 Feb 2009 22:14:05 +0000 (22:14 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 16 Feb 2009 22:14:05 +0000 (22:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64681 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
lib/AST/Expr.cpp
lib/CodeGen/CGExpr.cpp

index 961eb21e5a09de299a6a3ccea8f07141127e2b2f..6579b595e561845fc3d0d131b72c9a859b4fb334 100644 (file)
@@ -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; 
   }
index 7a04ffcedc4f9464bbf59bd03feeec28bbfce2d5..9e0d0cd954deca20c5876c5f2ba98f9c569a3a18 100644 (file)
@@ -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();
index 03efbc9ad566ed3608f983e100743444f347672e..01a5514d6e1dd3f01fa649fce1f60054cb373012 100644 (file)
@@ -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.