void ReduceArraySize::handleOneASE(const ArraySubscriptExpr *ASE) { const Type *ASETy = ASE->getType().getTypePtr(); if (!ASETy->isScalarType() && !ASETy->isStructureType() && !ASETy->isUnionType()) return; ExprVector IdxExprs; const Expr *BaseE = getBaseExprAndIdxExprs(ASE, IdxExprs); TransAssert(BaseE && "Empty Base expression!"); const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(BaseE); if (!DRE) return; const ValueDecl *OrigDecl = DRE->getDecl(); const VarDecl *VD = dyn_cast<VarDecl>(OrigDecl); if (!VD) return; const VarDecl *CanonicalVD = VD->getCanonicalDecl(); DimValueVector *DimVec = VarDeclToDim[CanonicalVD]; // It's possible DimVec is NULL, e.g., // int main(..., char *argv[]) { // ... argv[1] ... // } if (!DimVec) return; TransAssert((DimVec->size() >= IdxExprs.size()) && "More indices than it should be!"); unsigned int DimIdx = 0; for (ExprVector::reverse_iterator I = IdxExprs.rbegin(), E = IdxExprs.rend(); I != E; ++I) { int OldIdx = (*DimVec)[DimIdx]; if (OldIdx == -1) { DimIdx++; continue; } const Expr *IdxE = (*I); if (isIntegerExpr(IdxE)) { int Idx = getIndexAsInteger(IdxE); if (Idx > OldIdx) (*DimVec)[DimIdx] = Idx; } else { (*DimVec)[DimIdx] = -1; } DimIdx++; } }