| // 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: 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 self_reference { | 
 | // CHECK:   int exists = 1; | 
 | // CHECK: } | 
 |  | 
 | // CHECK: def sub_exists { | 
 | // CHECK:   int exists = 1; | 
 | // CHECK: } |