import org.checkerframework.common.aliasing.qual.*;
class UniqueAnnoTest {
//@Unique constructor
public @Unique UniqueAnnoTest() {}
//@Unique constructor leaking the "this" reference.
// Each unique.leaked error is a leak.
public @Unique UniqueAnnoTest(int i) {
notLeaked(this);
leakedToResult(this);
//:: error: (unique.leaked)
UniqueAnnoTest b = leakedToResult(this);
UniqueAnnoTest other = new UniqueAnnoTest();
//:: error: (unique.leaked)
other = this;
//:: error: (unique.leaked)
leaked(this);
//:: error: (unique.leaked)
leaked(other); // The receiver parameter is "this", so there is a leak.
}
// Not @Unique constructor. No warnings.
public UniqueAnnoTest(int i1, int i2) {
UniqueAnnoTest other = new UniqueAnnoTest();
other = this;
notLeaked(this);
}
void leaked(UniqueAnnoTest a) {}
void notLeaked(@NonLeaked UniqueAnnoTest this, @NonLeaked UniqueAnnoTest a) {}
UniqueAnnoTest leakedToResult(
@LeakedToResult UniqueAnnoTest this, @LeakedToResult UniqueAnnoTest a) {
return a;
}
}