diff --git a/llvm/include/llvm/TableGen/Record.h b/llvm/include/llvm/TableGen/Record.h --- a/llvm/include/llvm/TableGen/Record.h +++ b/llvm/include/llvm/TableGen/Record.h @@ -708,6 +708,7 @@ /// Init *resolveReferences(Resolver &R) const override; + bool isComplete() const override; bool isConcrete() const override; std::string getAsString() const override; diff --git a/llvm/lib/TableGen/Record.cpp b/llvm/lib/TableGen/Record.cpp --- a/llvm/lib/TableGen/Record.cpp +++ b/llvm/lib/TableGen/Record.cpp @@ -655,6 +655,14 @@ return const_cast(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 @@ 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(this); diff --git a/llvm/test/TableGen/ListSlices.td b/llvm/test/TableGen/ListSlices.td --- a/llvm/test/TableGen/ListSlices.td +++ b/llvm/test/TableGen/ListSlices.td @@ -111,8 +111,11 @@ // CHECK: def Rec09 // CHECK: int Zero = ?; // CHECK: list TwoFive = [2, 3, ?, 5]; -// CHECK: def Rec10 -// CHECK: list 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 TwoFive = [2, 3, ?, 5]; def Rec09 : Class1<[?, ?, 2, 3, ?, 5, ?]>; @@ -120,6 +123,3 @@ int Zero = Class1<[?, ?, 2, 3, ?, 5, ?]>.Zero; list 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. diff --git a/llvm/test/TableGen/field-access-initializers.td b/llvm/test/TableGen/field-access-initializers.td --- a/llvm/test/TableGen/field-access-initializers.td +++ b/llvm/test/TableGen/field-access-initializers.td @@ -1,6 +1,10 @@ // RUN: llvm-tblgen %s | FileCheck %s // XFAIL: vg_leak +// CHECK: class B { +// 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 {