xref: /llvm-project/clang/test/Analysis/symbol-simplification-disequality-info.cpp (revision 648e256e541d6421eca72df733f888787485bda8)
1 // RUN: %clang_analyze_cc1 %s \
2 // RUN:   -analyzer-checker=core \
3 // RUN:   -analyzer-checker=debug.ExprInspection \
4 // RUN:   2>&1 | FileCheck %s
5 
6 // In this test we check how the solver's symbol simplification mechanism
7 // simplifies the disequality info.
8 
9 void clang_analyzer_printState();
10 
11 void test(int a, int b, int c, int d) {
12   if (a + b + c == d)
13     return;
14   clang_analyzer_printState();
15   // CHECK:       "disequality_info": [
16   // CHECK-NEXT:    {
17   // CHECK-NEXT:      "class": [ "((reg_$0<int a>) + (reg_$2<int b>)) + (reg_$5<int c>)" ],
18   // CHECK-NEXT:      "disequal_to": [
19   // CHECK-NEXT:        [ "reg_$8<int d>" ]]
20   // CHECK-NEXT:    },
21   // CHECK-NEXT:    {
22   // CHECK-NEXT:      "class": [ "reg_$8<int d>" ],
23   // CHECK-NEXT:      "disequal_to": [
24   // CHECK-NEXT:        [ "((reg_$0<int a>) + (reg_$2<int b>)) + (reg_$5<int c>)" ]]
25   // CHECK-NEXT:    }
26   // CHECK-NEXT:  ],
27 
28 
29   // Simplification starts here.
30   if (b != 0)
31     return;
32   clang_analyzer_printState();
33   // CHECK:      "disequality_info": [
34   // CHECK-NEXT:   {
35   // CHECK-NEXT:     "class": [ "(reg_$0<int a>) + (reg_$5<int c>)" ],
36   // CHECK-NEXT:     "disequal_to": [
37   // CHECK-NEXT:       [ "reg_$8<int d>" ]]
38   // CHECK-NEXT:   },
39   // CHECK-NEXT:   {
40   // CHECK-NEXT:     "class": [ "reg_$8<int d>" ],
41   // CHECK-NEXT:     "disequal_to": [
42   // CHECK-NEXT:        [ "(reg_$0<int a>) + (reg_$5<int c>)" ]]
43   // CHECK-NEXT:    }
44   // CHECK-NEXT:  ],
45 
46   if (c != 0)
47     return;
48   clang_analyzer_printState();
49   // CHECK:       "disequality_info": [
50   // CHECK-NEXT:    {
51   // CHECK-NEXT:      "class": [ "reg_$0<int a>" ],
52   // CHECK-NEXT:      "disequal_to": [
53   // CHECK-NEXT:        [ "reg_$8<int d>" ]]
54   // CHECK-NEXT:    },
55   // CHECK-NEXT:    {
56   // CHECK-NEXT:      "class": [ "reg_$8<int d>" ],
57   // CHECK-NEXT:      "disequal_to": [
58   // CHECK-NEXT:        [ "reg_$0<int a>" ]]
59   // CHECK-NEXT:    }
60   // CHECK-NEXT:  ],
61 
62   // Keep the symbols and the constraints! alive.
63   (void)(a * b * c * d);
64   return;
65 }
66