llvm-project/clang/test/Analysis/class-object-state-dump.m
Valeriy Savchenko 239c53b72b [analyzer] Track runtime types represented by Obj-C Class objects
Summary:
Objective-C Class objects can be used to do a dynamic dispatch on
class methods. The analyzer had a few places where we tried to overcome
the dynamic nature of it and still guess the actual function that
is being called. That was done mostly using some simple heuristics
covering the most widespread cases (e.g. [[self class] classmethod]).
This solution introduces a way to track types represented by Class
objects and work with that instead of direct AST matching.

rdar://problem/50739539

Differential Revision: https://reviews.llvm.org/D78286
2020-04-29 13:35:53 +03:00

39 lines
940 B
Objective-C

// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection \
// RUN: -verify %s 2>&1 | FileCheck %s
// expected-no-diagnostics
void clang_analyzer_printState();
@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