| // RUN: llvm-tblgen --no-warn-on-unused-template-args %s | FileCheck %s |
| // XFAIL: vg_leak |
| |
| class A; |
| def a0 : A; |
| |
| class A_check<string name>{ |
| int exists = !exists<A>(name); |
| } |
| |
| def a0_exists : A_check<"a0">; |
| def a1_missing : A_check<"a1">; |
| |
| |
| // Subclasses are allowed. |
| |
| class B; |
| class SubOfB : B; |
| class B_check<string name> { |
| int exists = !exists<B>(name); |
| } |
| |
| def sub : SubOfB; |
| |
| def sub_exists : B_check<"sub">; |
| def a0_is_not_sub_of_B : B_check<"a0">; |
| |
| |
| // Self-references are allowed. |
| |
| class Self_check<string name> { |
| int exists = !exists<Self_check>(name); |
| } |
| |
| def self_reference : Self_check<"self_reference">; // Self-reference |
| // There is no record called `current` in current context though we will define it below. |
| def current_missing : Self_check<"current">; |
| def current : Self_check<"current">; |
| |
| |
| // Check that conditional definitions dependent on the resolution of an |
| // exists clause work as expected. |
| // Reminder: a0 exists, a1 does not. |
| class C { |
| int exists = 1; |
| } |
| if !exists<A>("a0") then |
| def if_exists : C; |
| if !exists<A>("a1") then |
| def if_no_exists: C; |
| foreach e = ["a0", "a1"] in { |
| if !exists<A>(e) then |
| def for_exists_ # e: C; |
| } |
| multiclass mc { |
| foreach e = ["a0", "a1"] in { |
| if !exists<A>(e) then |
| def _ # e: C; |
| } |
| } |
| defm multiclass_exists : mc<>; |
| |
| |
| // CHECK: def a0_exists { |
| // CHECK: int exists = 1; |
| // CHECK: } |
| |
| // CHECK: def a0_is_not_sub_of_B { |
| // CHECK: int exists = 0; |
| // CHECK: } |
| |
| // CHECK: def a1_missing { |
| // CHECK: int exists = 0; |
| // CHECK: } |
| |
| // CHECK: def current { |
| // CHECK: int exists = 1; |
| // CHECK: } |
| |
| // `current` doesn't exist because we define it below `current_missing`. |
| // CHECK: def current_missing { |
| // CHECK: int exists = 0; |
| // CHECK: } |
| |
| // CHECK: def for_exists_a0 { |
| // CHECK: int exists = 1; |
| // CHECK: } |
| // CHECK: def if_exists { |
| // CHECK: int exists = 1; |
| // CHECK: } |
| // CHECK: def multiclass_exists_a0 { |
| // CHECK: int exists = 1; |
| // CHECK: } |
| |
| // CHECK: def self_reference { |
| // CHECK: int exists = 1; |
| // CHECK: } |
| |
| // CHECK: def sub_exists { |
| // CHECK: int exists = 1; |
| // CHECK: } |