File: PureTest.java

package info (click to toggle)
checker-framework-java 3.2.0%2Bds-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 23,104 kB
  • sloc: java: 145,916; xml: 839; sh: 518; makefile: 404; perl: 26
file content (132 lines) | stat: -rw-r--r-- 3,498 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import org.checkerframework.checker.nullness.qual.*;
import org.checkerframework.dataflow.qual.*;

class PureTest {
    @org.checkerframework.dataflow.qual.Pure
    @Nullable Object puremethod(@Nullable Object a) {
        return a;
    }

    public void test() {
        // :: error: (assignment.type.incompatible)
        @NonNull Object l0 = puremethod(null);

        if (puremethod(null) == null) {
            // :: error: (assignment.type.incompatible)
            @NonNull Object l1 = puremethod(null);
        }

        if (puremethod("m") != null) {
            @NonNull Object l1 = puremethod("m");
        }

        if (puremethod("m") != null) {
            // :: error: (assignment.type.incompatible)
            @NonNull Object l1 = puremethod(null);
        }

        if (puremethod("m") != null) {
            // :: error: (assignment.type.incompatible)
            @NonNull Object l1 = puremethod("n");
        }

        Object x = new Object();

        if (puremethod(x) == null) {
            return;
        }

        @NonNull Object l2 = puremethod(x);

        x = new Object();

        // :: error: (assignment.type.incompatible)
        @NonNull Object l3 = puremethod(x);

        // :: error: (assignment.type.incompatible)
        @NonNull Object l4 = puremethod("n");
    }

    public @org.checkerframework.dataflow.qual.Pure @Nullable Object getSuperclass() {
        return null;
    }

    static void shortCircuitAnd(PureTest pt) {
        if ((pt.getSuperclass() != null) && pt.getSuperclass().equals(Enum.class)) {
            // empty body
        }
    }

    static void shortCircuitOr(PureTest pt) {
        if ((pt.getSuperclass() == null) || pt.getSuperclass().equals(Enum.class)) {
            // empty body
        }
    }

    static void testInstanceofNegative(PureTest pt) {
        if (pt.getSuperclass() instanceof Object) {
            return;
        }
        // :: error: (dereference.of.nullable)
        pt.getSuperclass().toString();
    }

    static void testInstanceofPositive(PureTest pt) {
        if (!(pt.getSuperclass() instanceof Object)) {
            return;
        }
        pt.getSuperclass().toString();
    }

    static void testInstanceofPositive2(PureTest pt) {
        if (!(pt.getSuperclass() instanceof Object)) {
        } else {
            pt.getSuperclass().toString();
        }
    }

    static void testInstanceofNegative2(PureTest pt) {
        if (pt.getSuperclass() instanceof Object) {
        } else {
            return;
        }
        pt.getSuperclass().toString();
    }

    static void testInstanceofString(PureTest pt) {
        if (!(pt.getSuperclass() instanceof String)) {
            return;
        }
        pt.getSuperclass().toString();
    }

    static void testContinue(PureTest pt) {
        for (; ; ) {
            if (pt.getSuperclass() == null) {
                System.out.println("m");
                continue;
            }
            pt.getSuperclass().toString();
        }
    }

    void setSuperclass(@Nullable Object no) {
        // set the field returned by getSuperclass.
    }

    static void testInstanceofPositive3(PureTest pt) {
        if (!(pt.getSuperclass() instanceof Object)) {
            return;
        } else {
            pt.setSuperclass(null);
        }
        // :: error: (dereference.of.nullable)
        pt.getSuperclass().toString();
    }

    @Override
    @SideEffectFree
    public String toString() {
        return "foo";
    }
}