
The test included with this commit shows a case where, even though a record's true type was !isa<> some unrelated class, the isa<> operator wolud use the declared type of the argument it was examining in order to conclude that the !isa<> expression had to be be false. The issues is fixed by checking to make sure that the argument to the !isa operator is fully concrete before declaring its result to be false.
34 lines
517 B
TableGen
34 lines
517 B
TableGen
// RUN: llvm-tblgen %s | FileCheck %s
|
|
|
|
// CHECK: --- Defs ---
|
|
// CHECK: def Op1 { // Op
|
|
// CHECK-NEXT: string res = "yes";
|
|
// CHECK-NEXT: }
|
|
// CHECK: def Op2 { // Op
|
|
// CHECK-NEXT: string res = "no";
|
|
// CHECK-NEXT: }
|
|
|
|
class A<int a> {
|
|
int x = a;
|
|
}
|
|
|
|
class B<int a> : A<a> {
|
|
bit y = 0;
|
|
}
|
|
|
|
class C<int a> {
|
|
int z = !add(a, 16);
|
|
}
|
|
|
|
class D<int a> : B<a>, C<a>;
|
|
|
|
def E1 : D<5>;
|
|
def E2 : B<2>;
|
|
|
|
class Op<A value> {
|
|
string res = !if(!isa<C>(value), "yes", "no");
|
|
}
|
|
|
|
def Op1 : Op<E1>;
|
|
def Op2 : Op<E2>;
|