File: PotentiallyAmbiguousWarningTest.java

package info (click to toggle)
openjdk-25 25.0.1%2B8-1~deb13u1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 825,408 kB
  • sloc: java: 5,585,680; cpp: 1,333,948; xml: 1,321,242; ansic: 488,034; asm: 404,003; objc: 21,088; sh: 15,106; javascript: 13,265; python: 8,319; makefile: 2,518; perl: 357; awk: 351; pascal: 103; exp: 83; sed: 72; jsp: 24
file content (143 lines) | stat: -rw-r--r-- 3,822 bytes parent folder | download | duplicates (6)
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
/*
 * @test /nodynamiccopyright/
 * @bug 8024947 8026369
 * @summary javac should issue the potentially ambiguous overload warning only
 * where the problem appears
 * @compile/fail/ref=PotentiallyAmbiguousWarningTest.out -XDrawDiagnostics -Werror -Xlint:overloads PotentiallyAmbiguousWarningTest.java
 */

import java.util.function.*;

public interface PotentiallyAmbiguousWarningTest {

    //a warning should be fired
    interface I1 {
        void foo(Consumer<Integer> c);
        void foo(IntConsumer c);
    }

    //a warning should be fired
    class C1 {
        void foo(Consumer<Integer> c) { }
        void foo(IntConsumer c) { }
    }

    interface I2 {
        void foo(Consumer<Integer> c);
    }

    //a warning should be fired, J1 is provoking the issue
    interface J1 extends I2 {
        void foo(IntConsumer c);
    }

    //no warning here, the issue is introduced in I1
    interface I3 extends I1 {}

    //no warning here, the issue is introduced in I1. I4 is just overriding an existing method
    interface I4 extends I1 {
        void foo(IntConsumer c);
    }

    class C2 {
        void foo(Consumer<Integer> c) { }
    }

    //a warning should be fired, D1 is provoking the issue
    class D1 extends C2 {
        void foo(IntConsumer c) { }
    }

    //a warning should be fired, C3 is provoking the issue
    class C3 implements I2 {
        public void foo(Consumer<Integer> c) { }
        public void foo(IntConsumer c) { }
    }

    //no warning here, the issue is introduced in C1
    class C4 extends C1 {}

    //no warning here, the issue is introduced in C1. C5 is just overriding an existing method
    class C5 extends C1 {
        void foo(IntConsumer c) {}
    }

    interface I5<T> {
        void foo(T c);
    }

    //a warning should be fired, J2 is provoking the issue
    interface J2 extends I5<IntConsumer> {
        void foo(Consumer<Integer> c);
    }

// The test cases below are from JDK-8026369

    interface I6 {
        void foo(Consumer<Integer> c);
    }

    interface I7 {
        void foo(IntConsumer c);
    }

    //a warning should be fired, I8 is provoking the issue
    interface I8 extends I6, I7 { }

    //no warning here, the issue is introduced in I8
    interface I9 extends I8 { }

    //no warning here
    interface I10<T> {
        void foo(Consumer<Integer> c);
        void foo(T c);
    }

    //a warning should be fired, I11 is provoking the issue
    interface I11 extends I10<IntConsumer> { }

    // No warning should be fired here
    interface I12<T> extends Consumer<T>, IntSupplier {
        // A warning should be fired here
        interface OfInt extends I12<Integer>, IntConsumer {
            @Override
            void accept(int value);
            default void accept(Integer i) { }
        }
        @Override
        default int getAsInt() { return 0; }
    }

    // No warning should be fired here
    abstract static class C6<T> implements I12.OfInt { }

    default <U> Object foo() {
        // No warning should be fired here
        return new C6<U>() {
            @Override
            public void accept(int value) { }
        };
    }

    // Overrides should not trigger warnings
    interface I13 extends I8 {
        @Override
        void foo(Consumer<Integer> c);
        @Override
        void foo(IntConsumer c);
    }
    interface I14 extends I8 {
        @Override
        void foo(IntConsumer c);
    }

    // Verify we can suppress warnings at the class level
    @SuppressWarnings("overloads")
    interface I15 extends I8 { }        // would normally trigger a warning

    // Verify we can suppress warnings at the method level
    interface I16 extends I2 {
        @SuppressWarnings("overloads")
        void foo(IntConsumer c);        // would normally trigger a warning
    }
}