|  | // RUN: llvm-tblgen %s | FileCheck %s | 
|  |  | 
|  | // CHECK: class F<Y [[ARG:.+]] = ?> { | 
|  | // CHECK: string ret = !if(!initialized([[ARG]].str), [[ARG]].str, "N/A"); | 
|  | // CHECK: } | 
|  |  | 
|  | // CHECK-LABEL: def C | 
|  | // CHECK: bit c0 = 0 | 
|  | // CHECK: bit c1 = 1 | 
|  | // CHECK: bit c2 = 1 | 
|  | def C { | 
|  | bit c0 = !initialized(?); | 
|  | bit c1 = !initialized(0); | 
|  | bit c2 = !initialized(1); | 
|  | } | 
|  |  | 
|  | class Y { | 
|  | string str = ?; | 
|  | } | 
|  |  | 
|  | class F<Y y> { | 
|  | string ret = !if(!initialized(y.str), y.str, "N/A"); | 
|  | } | 
|  |  | 
|  | def Y0 : Y; | 
|  | def Y1 : Y { | 
|  | let str = "foo"; | 
|  | } | 
|  |  | 
|  | // CHECK-LABEL: def FY0 | 
|  | // CHECK: string ret = "N/A"; | 
|  | // CHECK-LABEL: def FY1 | 
|  | // CHECK: string ret = "foo"; | 
|  | def FY0 : F<Y0>; | 
|  | def FY1 : F<Y1>; | 
|  |  | 
|  | class G<Y y> { | 
|  | list<string> v = [y.str]; | 
|  | bit isInit = !initialized(v); | 
|  | } | 
|  |  | 
|  | // CHECK-LABEL: def GY0 | 
|  | // CHECK: isInit = 1 | 
|  | // CHECK-LABEL: def GY1 | 
|  | // CHECK: isInit = 1 | 
|  | def GY0 : G<Y0>; | 
|  | def GY1 : G<Y1>; | 
|  |  | 
|  | class Thing; | 
|  | def aThing : Thing; | 
|  | class Propagate<Thing t> { | 
|  | Thing ret = !if(!initialized(t), t, ?); | 
|  | } | 
|  | // CHECK-LABEL: def PropagateNothing | 
|  | // CHECK: Thing ret = ? | 
|  | // CHECK-LABEL: def PropagateThing | 
|  | // CHECK: Thing ret = aThing | 
|  | def PropagateNothing : Propagate<?>; | 
|  | def PropagateThing : Propagate<aThing>; |