import java.util.*;
import checkers.igj.quals.*;
@I
class ForEnhanced {
@Mutable List<@Mutable ForEnhanced> mm = new @Mutable LinkedList<@Mutable ForEnhanced>();
@Mutable List<@ReadOnly ForEnhanced> mr = new @Mutable LinkedList<@ReadOnly ForEnhanced>();
@ReadOnly List<@Mutable ForEnhanced> rm = mm;
@ReadOnly List<@ReadOnly ForEnhanced> rr = mr;
@Mutable ForEnhanced @Mutable [] mma;
@ReadOnly ForEnhanced @ReadOnly [] mra;
@Mutable ForEnhanced @ReadOnly [] rma;
@ReadOnly ForEnhanced @ReadOnly [] rra;
@ReadOnly List<@ReadOnly List<@Mutable ForEnhanced>> rrm;
void testMutable() {
for (@Mutable ForEnhanced o : mm);
for (@Mutable ForEnhanced o : mr); // should emit error
for (@Mutable ForEnhanced o : rm);
for (@Mutable ForEnhanced o : rr); // should emit error
for (@ReadOnly ForEnhanced o : mm);
for (@ReadOnly ForEnhanced o : mr);
for (@ReadOnly ForEnhanced o : rm);
for (@ReadOnly ForEnhanced o : rr);
for (@Mutable ForEnhanced o : mma);
for (@Mutable ForEnhanced o : mra); // should emit error
for (@Mutable ForEnhanced o : rma);
for (@Mutable ForEnhanced o : rra); // should emit error
for (@ReadOnly ForEnhanced o : mma);
for (@ReadOnly ForEnhanced o : mra);
for (@ReadOnly ForEnhanced o : rma);
for (@ReadOnly ForEnhanced o : rra);
for (@Mutable List<@ReadOnly ForEnhanced> w : rrm); // should emit error
for (@ReadOnly List<@ReadOnly ForEnhanced> rr2 : rrm) {
for (@Mutable ForEnhanced no : rr2); // should emit error
for (@ReadOnly ForEnhanced yes : rr2);
}
for (@ReadOnly List<@Mutable ForEnhanced> rm2 : rrm) {
for (@Mutable ForEnhanced yes : rm2);
for (@ReadOnly ForEnhanced yes : rm2);
}
}
public @Mutable List<@ReadOnly ForEnhanced> getMR() { return mr; }
public @ReadOnly ForEnhanced @ReadOnly [] getRRA() { return rra; }
public @Mutable ForEnhanced @Mutable [] getMMA() { return mma; }
void testMethods() {
for (@Mutable ForEnhanced o : getMR()); // should emit error
for (@ReadOnly ForEnhanced o : getMR());
for (@Mutable ForEnhanced o : getRRA()); // should emit error
for (@ReadOnly ForEnhanced o : getRRA());
for (@Mutable ForEnhanced o : getMMA());
}
@Mutable class ForEnhancedList extends @Mutable LinkedList<@ReadOnly ForEnhanced> { };
@Mutable class ForEnhancedIterable implements @Mutable Iterable<@ReadOnly ForEnhanced> {
public Iterator<@ReadOnly ForEnhanced> iterator() @ReadOnly { return null; }
}
// Test more iterables
void testIterables() {
ForEnhancedList l1 = new ForEnhancedList();
for (@Mutable ForEnhanced s : l1); // should emit error
ForEnhancedIterable l2 = new ForEnhancedIterable();
for (@Mutable ForEnhanced s : l2); // should emit error
}
// Test Expressions without Elements
void testConditionalExpress() {
for (@Mutable ForEnhanced o : true ? getRRA() : getMMA()); // should emit error
for (@ReadOnly ForEnhanced o : true ? getRRA() : getMMA());
}
void testNewForEnhanceds() {
for (@Mutable ForEnhanced str : new @Mutable ArrayList<@ReadOnly ForEnhanced>()); // should emit error
for (@Mutable ForEnhanced str : new @Mutable ForEnhancedList()); // should emit error
for (@Mutable ForEnhanced str : new @Mutable ForEnhancedList()); // should emit error
}
void test() {
for (;;) { }
}
}