Index: llvm/trunk/include/llvm/TableGen/Record.h =================================================================== --- llvm/trunk/include/llvm/TableGen/Record.h +++ llvm/trunk/include/llvm/TableGen/Record.h @@ -141,6 +141,8 @@ static CodeRecTy *get() { return &Shared; } std::string getAsString() const override { return "code"; } + + bool typeIsConvertibleTo(const RecTy *RHS) const override; }; /// 'int' - Represent an integer value of no particular size @@ -176,6 +178,8 @@ static StringRecTy *get() { return &Shared; } std::string getAsString() const override; + + bool typeIsConvertibleTo(const RecTy *RHS) const override; }; /// 'list' - Represent a list of values, all of which must be of Index: llvm/trunk/lib/TableGen/Record.cpp =================================================================== --- llvm/trunk/lib/TableGen/Record.cpp +++ llvm/trunk/lib/TableGen/Record.cpp @@ -97,10 +97,20 @@ return kind==BitRecTyKind || kind==BitsRecTyKind || kind==IntRecTyKind; } +bool CodeRecTy::typeIsConvertibleTo(const RecTy *RHS) const { + RecTyKind Kind = RHS->getRecTyKind(); + return Kind == CodeRecTyKind || Kind == StringRecTyKind; +} + std::string StringRecTy::getAsString() const { return "string"; } +bool StringRecTy::typeIsConvertibleTo(const RecTy *RHS) const { + RecTyKind Kind = RHS->getRecTyKind(); + return Kind == StringRecTyKind || Kind == CodeRecTyKind; +} + std::string ListRecTy::getAsString() const { return "list<" + Ty->getAsString() + ">"; } @@ -433,6 +443,8 @@ Init *StringInit::convertInitializerTo(RecTy *Ty) const { if (isa(Ty)) return const_cast(this); + if (isa(Ty)) + return CodeInit::get(getValue()); return nullptr; } @@ -440,6 +452,8 @@ Init *CodeInit::convertInitializerTo(RecTy *Ty) const { if (isa(Ty)) return const_cast(this); + if (isa(Ty)) + return StringInit::get(getValue()); return nullptr; } Index: llvm/trunk/test/TableGen/code.td =================================================================== --- llvm/trunk/test/TableGen/code.td +++ llvm/trunk/test/TableGen/code.td @@ -0,0 +1,23 @@ +// RUN: llvm-tblgen %s | FileCheck %s +// XFAIL: vg_leak + +// CHECK: --- Defs --- + +// TODO: Both of these should result in CodeInits, i.e. print [{...}]. +// CHECK: def A0 { +// CHECK: code Code = "Simple"; +// CHECK: } + +// CHECK: def B0 { +// CHECK: code Code = "With paste 7"; +// CHECK: } + +class A { + code Code = c; +} + +def A0 : A<"Simple">; + +class B : A<"With paste " # i>; + +def B0 : B<7>;