Make LoopConvert work with containers that are used like arrays.

llvm-svn: 225629
This commit is contained in:
Daniel Jasper 2015-01-12 13:17:56 +00:00
parent 00691cf3bb
commit 0c7e93c128
2 changed files with 28 additions and 0 deletions

View File

@ -450,9 +450,16 @@ static bool isAliasDecl(const Decl *TheDecl, const VarDecl *IndexVar) {
const CXXOperatorCallExpr *OpCall = cast<CXXOperatorCallExpr>(Init);
if (OpCall->getOperator() == OO_Star)
return isDereferenceOfOpCall(OpCall, IndexVar);
if (OpCall->getOperator() == OO_Subscript) {
assert(OpCall->getNumArgs() == 2);
return true;
}
break;
}
case Stmt::CXXMemberCallExprClass:
return true;
default:
break;
}

View File

@ -7,6 +7,8 @@
const int N = 10;
Val Arr[N];
dependent<Val> v;
dependent<Val> *pv;
Val &func(Val &);
void sideEffect(int);
@ -50,6 +52,25 @@ void aliasing() {
// CHECK-NEXT: int y = t.x;
// CHECK-NEXT: int z = elem.x + t.x;
// The same for pseudo-arrays like std::vector<T> (or here dependent<Val>)
// which provide a subscript operator[].
for (int i = 0; i < v.size(); ++i) {
Val &t = v[i]; { }
int y = t.x;
}
// CHECK: for (auto & t : v)
// CHECK-NEXT: { }
// CHECK-NEXT: int y = t.x;
// The same with a call to at()
for (int i = 0; i < pv->size(); ++i) {
Val &t = pv->at(i); { }
int y = t.x;
}
// CHECK: for (auto & t : *pv)
// CHECK-NEXT: { }
// CHECK-NEXT: int y = t.x;
for (int i = 0; i < N; ++i) {
Val &t = func(Arr[i]);
int y = t.x;