mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +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,
|
||||
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user