File: BoxingNullness.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 (145 lines) | stat: -rw-r--r-- 3,730 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
133
134
135
136
137
138
139
140
141
142
143
144
145
import org.checkerframework.checker.nullness.qual.*;

public class BoxingNullness {
    void withinOperation() {
        Integer i1 = 3;
        int i1u = i1 + 2; // valid
        Integer i2 = null;
        // :: error: (unboxing.of.nullable)
        int i2u = i2 + 2; // invalid
        Integer i3 = i1;
        i3.toString();
    }

    void withinAssignment() {
        Integer i1 = 5;
        int i1u = i1;
        Integer i2 = null;
        // :: error: (unboxing.of.nullable)
        int i2u = i2; // invalid
    }

    void validWithinUnary() {
        // within blocks to stop flow
        Integer i1 = 1, i2 = 1, i3 = 1, i4 = 1;
        ++i1;
        i2++;
    }

    void invalidWithinUnary() {
        // within blocks to stop flow
        Integer i1 = null, i2 = null, i3 = null, i4 = null;
        // :: error: (unboxing.of.nullable)
        ++i1; // invalid
        // :: error: (unboxing.of.nullable)
        i2++; // invalid
    }

    void validCompoundAssignmentsAsVariable() {
        @NonNull Integer i = 0; // nonnull is needed because flow is buggy
        i += 1;
        i -= 1;
        @NonNull Boolean b = true;
        b &= true;
    }

    void invalidCompoundAssignmentsAsVariable() {
        Integer i = null;
        // :: error: (unboxing.of.nullable)
        i += 1; // invalid
        Boolean b = null;
        // :: error: (unboxing.of.nullable)
        b &= true; // invalid
    }

    void invalidCompoundAssignmentAsValue() {
        @NonNull Integer var = 3;
        Integer val = null;
        // :: error: (unboxing.of.nullable)
        var += val;
        Boolean b1 = null;
        boolean b2 = true;
        // :: error: (unboxing.of.nullable)
        b2 &= b1; // invalid
    }

    void randomValidStringOperations() {
        String s = null;
        s += null;
    }

    void equalityTest() {
        Integer bN = null;
        Integer bN1 = null;
        Integer bN2 = null;
        Integer bN3 = null;
        Integer bN4 = null;
        Integer bN5 = null;
        Integer bN6 = null;
        Integer bN7 = null;
        Integer b1 = 1;
        int u1 = 1;
        System.out.println(bN == bN1); // valid
        System.out.println(bN2 == b1); // valid
        System.out.println(bN3 != bN4); // valid
        System.out.println(bN5 != b1); // valid

        System.out.println(u1 == b1);
        System.out.println(u1 != b1);
        System.out.println(u1 == u1);
        System.out.println(u1 != u1);

        // :: error: (unboxing.of.nullable)
        System.out.println(bN6 == u1); // invalid
        // :: error: (unboxing.of.nullable)
        System.out.println(bN7 != u1); // invalid
    }

    void addition() {
        Integer bN = null;
        Integer bN1 = null;
        Integer bN2 = null;
        Integer bN3 = null;
        Integer b1 = 1;
        int u1 = 1;
        // :: error: (unboxing.of.nullable)
        System.out.println(bN + bN1); // invalid
        // :: error: (unboxing.of.nullable)
        System.out.println(bN2 + b1); // invalid

        System.out.println(u1 + b1);
        System.out.println(u1 + u1);

        // :: error: (unboxing.of.nullable)
        System.out.println(bN3 + u1); // invalid
    }

    void visitCast() {
        Integer bN = null;
        Integer bN2 = null;
        Integer b1 = 1;
        int u1 = 1;

        println(bN);
        // :: error: (unboxing.of.nullable)
        println((int) bN2); // invalid

        println(b1);
        println((int) b1);

        println(u1);
        println((int) u1);
    }

    void println(@Nullable Object o) {}

    void testObjectString() {
        Object o = null;
        o += "m";
    }

    void testCharString() {
        CharSequence cs = null;
        cs += "m";
    }
}