blob: a8a0b279485e5979f0d84539f786f847e5bae2a9 [file] [log] [blame]
import java.util.List;
import org.checkerframework.dataflow.qual.Pure;
import org.checkerframework.framework.test.*;
import org.checkerframework.framework.testchecker.util.*;
public class Basic2 {
// basic tests to make sure everything works
void t1(@Odd String p1, String p2) {
String l1 = p1;
// :: error: (assignment)
@Odd String l2 = p2;
}
// basic local variable flow sensitivity
void t2(@Odd String p1, String p2, boolean b1) {
String l1 = p1;
if (b1) {
l1 = p2;
}
// :: error: (assignment)
@Odd String l3 = l1;
l1 = p1;
while (b1) {
l1 = p2;
}
// :: error: (assignment)
@Odd String l4 = l1;
}
void t2b(@Odd String p1, String p2, @Odd String p3, boolean b1) {
String l1 = p1;
if (b1) {
l1 = p3;
}
@Odd String l3 = l1;
while (b1) {
l1 = p3;
}
@Odd String l4 = l1;
}
// return statement
void t3(@Odd String p1, String p2, boolean b1) {
String l1 = p1;
if (b1) {
l1 = p2;
return;
}
@Odd String l3 = l1;
}
// simple throw statement
void t4(@Odd String p1, String p2, boolean b1) {
String l1 = p1;
if (b1) {
l1 = p2;
throw new RuntimeException();
}
@Odd String l3 = l1;
}
class C {
C c;
String f1, f2, f3;
@Odd String g1, g2, g3;
}
// fields
void t5(@Odd String p1, String p2, boolean b1, C c1, C c2) {
c1.f1 = p1;
@Odd String l1 = c1.f1;
c2.f2 = p2; // assignment to f2 does not change knowledge about f1
c1.f2 = p2;
@Odd String l2 = c1.f1;
c2.f1 = p2;
// :: error: (assignment)
@Odd String l3 = c1.f1;
}
// fields
void t6(@Odd String p1, String p2, boolean b1, C c1, C c2) {
c1.f1 = p1;
c1.c.f1 = p1;
@Odd String l2 = c1.c.f1;
c1.f1 = p2;
// :: error: (assignment)
@Odd String l3 = c1.f1;
c1.f1 = p1;
c1.c.f1 = p1;
@Odd String l4 = c1.c.f1;
c2.c = c2;
// :: error: (assignment)
@Odd String l5 = c1.f1;
// :: error: (assignment)
@Odd String l6 = c1.c.f1;
}
// fields
void t6b(@Odd String p1, String p2, boolean b1, C c1, C c2) {
if (b1) {
c1.f1 = p1;
}
// :: error: (assignment)
@Odd String l1 = c1.f1;
if (b1) {
c1.f1 = p1;
} else {
c1.f1 = p1;
}
@Odd String l2 = c1.f1;
}
// method calls
void nonpure() {}
@Pure
int pure() {
return 1;
}
void t7(@Odd String p1, String p2, boolean b1, C c1, C c2) {
c1.f1 = p1;
nonpure();
// :: error: (assignment)
@Odd String l1 = c1.f1;
c1.f1 = p1;
pure();
@Odd String l2 = c1.f1;
}
// array accesses
void t8(@Odd String a1[], String a2[], String p3) {
String l1 = a1[0];
// :: error: (assignment)
@Odd String l2 = a2[0];
@Odd String l3 = l1;
a1[0] = l1;
a1[1] = l3;
// :: error: (assignment)
a1[2] = p3;
a2[0] = l1;
a2[1] = l3;
a2[2] = p3;
}
// self type
void t9(@Odd Basic2 this) {
@Odd Basic2 l1 = this;
}
// generics
public <T extends String> void t10a(T p1, @Odd T p2) {
T l1 = p1;
p1 = l1;
T l2 = p2;
p2 = l2;
// :: error: (assignment)
@Odd T l3 = p1;
@Odd T l4 = p2;
}
public <T extends @Odd String> void t10b(T p1, @Odd T p2) {
T l1 = p1;
p1 = l1;
T l2 = p2;
p2 = l2;
@Odd T l3 = p1;
@Odd T l4 = p2;
}
// for-each loop
void t11(@Odd String p1, String p2, List<String> list, List<@Odd String> oddList) {
// :: error: (enhancedfor)
for (@Odd String i : list) {}
for (@Odd String i : oddList) {
@Odd String l1 = i;
}
for (@Odd String i : oddList) {
// :: error: (assignment)
i = p2;
}
for (String i : oddList) {
// @Odd String l3 = i;
}
}
// cast without annotations
void t12(@Odd String p1, String p2, boolean b1) {
@Odd String l1 = (String) p1;
}
// final fields
class CF {
final String f1;
CF c;
void nonpure() {}
CF(@Odd String p1) {
f1 = p1;
nonpure();
@Odd String l1 = f1;
}
void CF_t1(@Odd String p1, CF o) {
if (f1 == p1) {
nonpure();
@Odd String l1 = f1;
}
}
}
// final fields with initializer
class A {
final @Odd String f1 = null;
final String f2 = f1;
void A_t1() {
@Odd String l1 = f2;
}
}
}