[TableGen] Resolve concrete but not complete field access initializers
This fixes the resolution of Rec10.Zero in ListSlices.td. As part of this, correct the definition of complete for ListInit such that it's complete iff all the elements in the list are complete rather than always being complete regardless of the elements. This is the reason Rec10.TwoFive from ListSlices.td previously resolved despite being incomplete like Rec10.Zero was Depends on D100247 Reviewed By: Paul-C-Anagnostopoulos Differential Revision: https://reviews.llvm.org/D100253
This commit is contained in:
parent
192c6023e1
commit
be50657c6a
@ -708,6 +708,7 @@ public:
|
||||
///
|
||||
Init *resolveReferences(Resolver &R) const override;
|
||||
|
||||
bool isComplete() const override;
|
||||
bool isConcrete() const override;
|
||||
std::string getAsString() const override;
|
||||
|
||||
|
@ -655,6 +655,14 @@ Init *ListInit::resolveReferences(Resolver &R) const {
|
||||
return const_cast<ListInit *>(this);
|
||||
}
|
||||
|
||||
bool ListInit::isComplete() const {
|
||||
for (Init *Element : *this) {
|
||||
if (!Element->isComplete())
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ListInit::isConcrete() const {
|
||||
for (Init *Element : *this) {
|
||||
if (!Element->isConcrete())
|
||||
@ -1924,7 +1932,7 @@ Init *FieldInit::Fold(Record *CurRec) const {
|
||||
FieldName->getAsUnquotedString() + "' of '" +
|
||||
Rec->getAsString() + "' is a forbidden self-reference");
|
||||
Init *FieldVal = Def->getValue(FieldName)->getValue();
|
||||
if (FieldVal->isComplete())
|
||||
if (FieldVal->isConcrete())
|
||||
return FieldVal;
|
||||
}
|
||||
return const_cast<FieldInit *>(this);
|
||||
|
@ -111,8 +111,11 @@ def Rec08 {
|
||||
// CHECK: def Rec09
|
||||
// CHECK: int Zero = ?;
|
||||
// CHECK: list<int> TwoFive = [2, 3, ?, 5];
|
||||
// CHECK: def Rec10
|
||||
// CHECK: list<int> TwoFive = [2, 3, ?, 5];
|
||||
// We need CHECK-NEXT for these because otherwise it will match anonymous defs
|
||||
// that appear later.
|
||||
// CHECK: def Rec10 {
|
||||
// CHECK-NEXT: int Zero = ?;
|
||||
// CHECK-NEXT: list<int> TwoFive = [2, 3, ?, 5];
|
||||
|
||||
def Rec09 : Class1<[?, ?, 2, 3, ?, 5, ?]>;
|
||||
|
||||
@ -120,6 +123,3 @@ def Rec10 {
|
||||
int Zero = Class1<[?, ?, 2, 3, ?, 5, ?]>.Zero;
|
||||
list<int> TwoFive = Class1<[?, ?, 2, 3, ?, 5, ?]>.TwoFive;
|
||||
}
|
||||
|
||||
// TO-DO: Notice that the first field in Rec10 is not checked.
|
||||
// It is not fully resolved for reasons that need to be investigated.
|
||||
|
@ -1,6 +1,10 @@
|
||||
// RUN: llvm-tblgen %s | FileCheck %s
|
||||
// XFAIL: vg_leak
|
||||
|
||||
// CHECK: class B<A B:impl = ?> {
|
||||
// CHECK: string value = B:impl.value;
|
||||
// CHECK: }
|
||||
|
||||
// CHECK: --- Defs ---
|
||||
|
||||
// CHECK: def A1 {
|
||||
@ -8,7 +12,7 @@
|
||||
// CHECK: }
|
||||
|
||||
// CHECK: def B1 {
|
||||
// CHECK: string value = A1.value;
|
||||
// CHECK: string value = ?;
|
||||
// CHECK: }
|
||||
|
||||
class A {
|
||||
|
Loading…
x
Reference in New Issue
Block a user