mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
[llvm][TableGen] Define FieldInit::isConcrete overload
Summary: There are a few field init values that are concrete but not complete/foldable (e.g. `?`). This allows for using those values as initializers without erroring out. Example: ``` class A { string value = ?; } class B<A impl> : A { let value = impl.value; // This currently emits an error. let value = ?; // This doesn't emit an error. } ``` Differential Revision: https://reviews.llvm.org/D74360
This commit is contained in:
parent
163f13ebd8
commit
cb7e7cb874
@ -1295,6 +1295,7 @@ public:
|
||||
Init *resolveReferences(Resolver &R) const override;
|
||||
Init *Fold(Record *CurRec) const;
|
||||
|
||||
bool isConcrete() const override;
|
||||
std::string getAsString() const override {
|
||||
return Rec->getAsString() + "." + FieldName->getValue().str();
|
||||
}
|
||||
|
@ -1778,6 +1778,14 @@ Init *FieldInit::Fold(Record *CurRec) const {
|
||||
return const_cast<FieldInit *>(this);
|
||||
}
|
||||
|
||||
bool FieldInit::isConcrete() const {
|
||||
if (DefInit *DI = dyn_cast<DefInit>(Rec)) {
|
||||
Init *FieldVal = DI->getDef()->getValue(FieldName)->getValue();
|
||||
return FieldVal->isConcrete();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void ProfileCondOpInit(FoldingSetNodeID &ID,
|
||||
ArrayRef<Init *> CondRange,
|
||||
ArrayRef<Init *> ValRange,
|
||||
|
23
test/TableGen/field-access-initializers.td
Normal file
23
test/TableGen/field-access-initializers.td
Normal file
@ -0,0 +1,23 @@
|
||||
// RUN: llvm-tblgen %s | FileCheck %s
|
||||
// XFAIL: vg_leak
|
||||
|
||||
// CHECK: --- Defs ---
|
||||
|
||||
// CHECK: def A1 {
|
||||
// CHECK: string value = ?;
|
||||
// CHECK: }
|
||||
|
||||
// CHECK: def B1 {
|
||||
// CHECK: string value = A1.value;
|
||||
// CHECK: }
|
||||
|
||||
class A {
|
||||
string value = ?;
|
||||
}
|
||||
|
||||
class B<A impl> : A {
|
||||
let value = impl.value;
|
||||
}
|
||||
|
||||
def A1 : A;
|
||||
def B1 : B<A1>;
|
Loading…
Reference in New Issue
Block a user