import java.util.*;
import checkers.javari.quals.*;
class ForEnhanced {
@Mutable List<Object> mm = new LinkedList<Object>();
@Mutable List<@ReadOnly Object> mr = new LinkedList<@ReadOnly Object>();
@ReadOnly List<Object> rm = mm;
@ReadOnly List<@ReadOnly Object> rr = mr;
Object[] mma;
@ReadOnly Object[] mra;
Object @ReadOnly [] rma;
@ReadOnly Object @ReadOnly [] rra;
@ReadOnly List<@ReadOnly List<Object>> rrm;
void testMutable() {
for (Object o : mm);
//:: (enhancedfor.type.incompatible)
for (Object o : mr); // error
for (Object o : rm);
//:: (enhancedfor.type.incompatible)
for (Object o : rr); // error
for (@ReadOnly Object o : mm);
for (@ReadOnly Object o : mr);
for (@ReadOnly Object o : rm);
for (@ReadOnly Object o : rr);
for (Object o : mma);
//:: (enhancedfor.type.incompatible)
for (Object o : mra); // error
for (Object o : rma);
//:: (enhancedfor.type.incompatible)
for (Object o : rra); // error
for (@ReadOnly Object o : mma);
for (@ReadOnly Object o : mra);
for (@ReadOnly Object o : rma);
for (@ReadOnly Object o : rra);
//:: (enhancedfor.type.incompatible)
for (List<@ReadOnly Object> w : rrm); // error
//:: (enhancedfor.type.incompatible)
for (@ReadOnly List<@ReadOnly Object> rr2 : rrm) { // error
//:: (enhancedfor.type.incompatible)
for (Object no : rr2); // error
for (@ReadOnly Object yes : rr2);
}
for (@ReadOnly List<Object> rm2 : rrm) {
for (Object yes : rm2);
for (@ReadOnly Object yes : rm2);
}
}
public @Mutable List<@ReadOnly Object> getMR() { return mr; }
public @ReadOnly Object @ReadOnly [] getRRA() { return rra; }
public Object[] getMMA() { return mma; }
void testMethods() {
//:: (enhancedfor.type.incompatible)
for (Object o : getMR()); //error
for (@ReadOnly Object o : getMR());
//:: (enhancedfor.type.incompatible)
for (Object o : getRRA()); // error
for (@ReadOnly Object o : getRRA());
for (Object o : getMMA());
}
/* Delete this line and commented lines, and add the following errors:
//ForEnhanced.java:72: cannot assign a ReadOnly expression to a Mutable variable
//ForEnhanced.java:75: cannot assign a ReadOnly expression to a Mutable variable
//ForEnhanced.java:81: cannot assign a ReadOnly expression to a Mutable variable
//ForEnhanced.java:87: cannot assign a ReadOnly expression to a Mutable variable
//ForEnhanced.java:88: cannot assign a ReadOnly expression to a Mutable variable
//ForEnhanced.java:89: cannot assign a ReadOnly expression to a Mutable variable
class StringList extends LinkedList<@ReadOnly String> { };
class StringIterable implements Iterable<@ReadOnly String> {
public Iterator<@ReadOnly String> iterator() { return null; }
}
// Test more iterables
void testIterables() {
StringList l1 = new StringList();
for (String s : l1); // error
StringIterable l2 = new StringIterable();
for (String s : l2); // error
}
// Test Expressions without Elements
void testConditionalExpress() {
for (Object o : true ? getRRA() : getMMA()); // error
for (@ReadOnly Object o : true ? getRRA() : getMMA());
}
void testNewObjects() {
for (String str : new ArrayList<@ReadOnly String>()); // error
for (String str : new StringList()); // error
for (String str : new StringIterable()); //error
}
*/
}