Allow Operator Arguments

When resolving an operator list element reference, resolve all
operator operands and try to fold the operator first.  This allows the
operator to collapse to a list which may then be indexed.

Before, it was not possible to do this:
class D<int a, int b> { ... }
class C<list<int> A> : D<A[0], A[1]>;
class B<list<int> b> : C<!foreach(...,b)>;

Now it is.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@141101 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Greene 2011-10-04 18:55:36 +00:00
parent a02dfe7a6b
commit cedaae125e

View File

@ -700,12 +700,20 @@ Init *OpInit::resolveBitReference(Record &R, const RecordVal *IRV,
Init *OpInit::resolveListElementReference(Record &R, const RecordVal *IRV,
unsigned Elt) const {
Init *Folded = Fold(&R, 0);
Init *Resolved = resolveReferences(R, IRV);
OpInit *OResolved = dynamic_cast<OpInit *>(Resolved);
if (OResolved) {
Resolved = OResolved->Fold(&R, 0);
}
if (Folded != this) {
TypedInit *Typed = dynamic_cast<TypedInit *>(Folded);
if (Resolved != this) {
TypedInit *Typed = dynamic_cast<TypedInit *>(Resolved);
assert(Typed && "Expected typed init for list reference");
if (Typed) {
return Typed->resolveListElementReference(R, IRV, Elt);
Init *New = Typed->resolveListElementReference(R, IRV, Elt);
if (New)
return New;
return VarListElementInit::get(Typed, Elt);
}
}
@ -1332,7 +1340,7 @@ Init *VarInit::resolveListElementReference(Record &R,
assert(RV && "Reference to a non-existent variable?");
ListInit *LI = dynamic_cast<ListInit*>(RV->getValue());
if (!LI) {
VarInit *VI = dynamic_cast<VarInit*>(RV->getValue());
TypedInit *VI = dynamic_cast<TypedInit*>(RV->getValue());
assert(VI && "Invalid list element!");
return VarListElementInit::get(VI, Elt);
}