|  | // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection \ | 
|  | // RUN:   -verify %s 2>&1 | FileCheck %s | 
|  |  | 
|  | // expected-no-diagnostics | 
|  |  | 
|  | void clang_analyzer_printState(void); | 
|  |  | 
|  | @interface NSObject { | 
|  | } | 
|  | + (id)alloc; | 
|  | + (Class)class; | 
|  | - (id)init; | 
|  | - (Class)class; | 
|  | @end | 
|  |  | 
|  | @interface Parent : NSObject | 
|  | @end | 
|  | @interface Child : Parent | 
|  | @end | 
|  |  | 
|  | void foo(id A, id B); | 
|  |  | 
|  | @implementation Child | 
|  | + (void)test { | 
|  | id ClassAsID = [self class]; | 
|  | id Object = [[ClassAsID alloc] init]; | 
|  | Class TheSameClass = [Object class]; | 
|  |  | 
|  | clang_analyzer_printState(); | 
|  | // CHECK:      "class_object_types": [ | 
|  | // CHECK-NEXT:   { "symbol": "conj_$[[#]]{Class, LC[[#]], S[[#]], #[[#]]}", "dyn_type": "Child", "sub_classable": true }, | 
|  | // CHECK-NEXT:   { "symbol": "conj_$[[#]]{Class, LC[[#]], S[[#]], #[[#]]}", "dyn_type": "Child", "sub_classable": true } | 
|  | // CHECK-NEXT: ] | 
|  |  | 
|  | // Let's make sure that the information is not GC'd away. | 
|  | foo(ClassAsID, TheSameClass); | 
|  | } | 
|  | @end |