mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-19 20:34:38 +00:00
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:
parent
a02dfe7a6b
commit
cedaae125e
@ -700,12 +700,20 @@ Init *OpInit::resolveBitReference(Record &R, const RecordVal *IRV,
|
|||||||
|
|
||||||
Init *OpInit::resolveListElementReference(Record &R, const RecordVal *IRV,
|
Init *OpInit::resolveListElementReference(Record &R, const RecordVal *IRV,
|
||||||
unsigned Elt) const {
|
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) {
|
if (Resolved != this) {
|
||||||
TypedInit *Typed = dynamic_cast<TypedInit *>(Folded);
|
TypedInit *Typed = dynamic_cast<TypedInit *>(Resolved);
|
||||||
|
assert(Typed && "Expected typed init for list reference");
|
||||||
if (Typed) {
|
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?");
|
assert(RV && "Reference to a non-existent variable?");
|
||||||
ListInit *LI = dynamic_cast<ListInit*>(RV->getValue());
|
ListInit *LI = dynamic_cast<ListInit*>(RV->getValue());
|
||||||
if (!LI) {
|
if (!LI) {
|
||||||
VarInit *VI = dynamic_cast<VarInit*>(RV->getValue());
|
TypedInit *VI = dynamic_cast<TypedInit*>(RV->getValue());
|
||||||
assert(VI && "Invalid list element!");
|
assert(VI && "Invalid list element!");
|
||||||
return VarListElementInit::get(VI, Elt);
|
return VarListElementInit::get(VI, Elt);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user