| // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify %s 2>&1 | FileCheck %s |
| // expected-no-diagnostics |
| |
| void clang_analyzer_printState(); |
| |
| struct Member { |
| int large[10]; |
| }; |
| Member getMember(); |
| |
| struct Class { |
| Member m; |
| int first; |
| int second; |
| int third; |
| }; |
| |
| |
| void test_output(int n) { |
| Class objsecond; |
| objsecond.m.large[n] = 20; |
| |
| Class objfirst; |
| |
| objfirst.m = getMember(); |
| objfirst.second = 2; |
| objfirst.third = 3; |
| objfirst.first = 1; |
| |
| clang_analyzer_printState(); |
| // Default binding is before any direct bindings. |
| // Direct bindings are increasing by offset. |
| // Global memory space clusters come before any other clusters. |
| // Otherwise, Clusters are in alphabetical order. |
| |
| // CHECK: "store": { "pointer": "0x{{[0-9a-f]+}}", "items": [ |
| // CHECK-NEXT: { "cluster": "GlobalInternalSpaceRegion", "pointer": "0x{{[0-9a-f]+}}", "items": [ |
| // CHECK-NEXT: { "kind": "Default", "offset": 0, "value": "conj_$ |
| // CHECK-NEXT: ]}, |
| // CHECK-NEXT: { "cluster": "GlobalSystemSpaceRegion", "pointer": "0x{{[0-9a-f]+}}", "items": [ |
| // CHECK-NEXT: { "kind": "Default", "offset": 0, "value": "conj_$ |
| // CHECK-NEXT: ]}, |
| // CHECK-NEXT: { "cluster": "objfirst", "pointer": "0x{{[0-9a-f]+}}", "items": [ |
| // CHECK-NEXT: { "kind": "Default", "offset": 0, "value": "conj_$ |
| // CHECK-NEXT: { "kind": "Direct", "offset": 320, "value": "1 S32b" }, |
| // CHECK-NEXT: { "kind": "Direct", "offset": 352, "value": "2 S32b" }, |
| // CHECK-NEXT: { "kind": "Direct", "offset": 384, "value": "3 S32b" } |
| // CHECK-NEXT: ]}, |
| // CHECK-NEXT: { "cluster": "objsecond", "pointer": "0x{{[0-9a-f]+}}", "items": [ |
| // CHECK-NEXT: { "kind": "Default", "offset": 0, "value": "Unknown" }, |
| // CHECK-NEXT: { "kind": "Direct", "offset": null, "value": "20 S32b" } |
| // CHECK-NEXT: ]} |
| // CHECK-NEXT: ]}, |
| |
| (void)objfirst; |
| (void)objsecond; |
| } |