File: Issue574.java

package info (click to toggle)
checker-framework-java 3.2.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 22,840 kB
  • sloc: java: 145,910; xml: 839; sh: 518; makefile: 401; perl: 26
file content (53 lines) | stat: -rw-r--r-- 2,169 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
// Test case for issue #574: https://github.com/typetools/checker-framework/issues/574

import org.checkerframework.checker.initialization.qual.UnderInitialization;

@SuppressWarnings({
    // A warning is issued that fields are not initialized in the constructor.
    // That is expected and it is not what is being verified in this test.
    "initialization.fields.uninitialized",
    // Normally @UnknownInitialization is the only initialization annotation allowed on fields.
    // However, for the purposes of this test, fields must be annotated with @UnderInitialization.
    "initialization.invalid.field.type"
})
class Issue574 {
    @UnderInitialization(Object.class) Object o1;

    @UnderInitialization(String.class) Object o2;

    @UnderInitialization(Character.class) Object o3;

    @UnderInitialization(Number.class) Object o4;

    @UnderInitialization(Double.class) Object o5;

    @UnderInitialization(Integer.class) Object o6;

    @UnderInitialization(CharSequence.class) Object i1; // CharSequence is an interface

    void testLubOfClasses(boolean flag) {
        @UnderInitialization(Object.class) Object l1 = flag ? o2 : o3;
        @UnderInitialization(Number.class) Object l2 = flag ? o5 : o6;

        @UnderInitialization(Object.class) Object l3 = flag ? o1 : o2;
        @UnderInitialization(Object.class) Object l4 = flag ? o1 : o3;

        @UnderInitialization(Number.class) Object l5 = flag ? o4 : o5;
        @UnderInitialization(Number.class) Object l6 = flag ? o4 : o6;

        // :: error: (assignment.type.incompatible)
        @UnderInitialization(Character.class) Object l7 = flag ? o1 : o2;
        // :: error: (assignment.type.incompatible)
        @UnderInitialization(Integer.class) Object l8 = flag ? o4 : o5;
    }

    void testLubOfClassesAndInterfaces(boolean flag) {
        @UnderInitialization(Object.class) Object l1 = flag ? i1 : o3;

        @UnderInitialization(Object.class) Object l2 = flag ? o1 : i1;
        @UnderInitialization(Object.class) Object l3 = flag ? o1 : o3;

        // :: error: (assignment.type.incompatible)
        @UnderInitialization(Character.class) Object l4 = flag ? o1 : i1;
    }
}