Stmt *TransformVector::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { unsigned NumElems = Node->getNumElements(); if (NumElems == 0) { // array subscripting syntax Expr *ExprBase = TransformExpr(Node->getBase()); ASTCtx.Deallocate(Node); return ExprBase; } else { DeclVector DeclVec; ExprVector ExprVec; MakeElementExprs(DeclVec, ExprVec, Node); assert((ExprVec.size() == NumElems) && "Wrong accessor?"); if (DeclVec.size() > 0) { PushBackDeclStmts(*CurStmtVec, DeclVec); } if (NumElems == 1) { return ExprVec[0]; } else { QualType NodeTy = Node->getType(); CallExpr *NewExpr = new (ASTCtx) CallExpr(ASTCtx, CLExprs.getVectorLiteralExpr(NodeTy), ExprVec.data(), NumElems, NodeTy, VK_RValue, SourceLocation()); return NewExpr; } } }