int i; int#[3] arr; int^ normal_const1 = @i; int+> flexi_const1 = @arr#[0]; int*> raw_const1 = @i; int+*> rawflexi_const1 = @arr#[0]; int var^ normal1 = @i; int var+> flexi1 = @arr#[0]; int var*> raw1 = @i; int var+*> rawflexi1 = @arr#[0]; // This is allowed (but *>? is not) int+>? allowed; () test() { int^ normal_const2 = @i; int+> flexi_const2 = @arr#[0]; int*> raw_const2 = @i; int+*> rawflexi_const2 = @arr#[0]; int var^ normal2 = @i; int var+> flexi2 = @arr#[0]; int var*> raw2 = @i; int var+*> rawflexi2 = @arr#[0]; int var^? optptr; var int j; j = normal1^; j = normal2^; j = flexi1^; j = flexi2^; j = raw1^; j = raw2^; j = rawflexi1^; j = rawflexi2^; rawflexi1 = normal1; normal1 = rawflexi1; // TODO implement arithmetic operators for flexi pointers? /*flexi1 += 1; flexi2 += 1; rawflexi1 += 1; rawflexi2 += 1;*/ j = flexi1#[1]; j = flexi2#[1]; j = rawflexi1#[1]; j = rawflexi2#[1]; flexi1 = @flexi1#[1]; flexi2 = @flexi2#[1]; rawflexi1 = @rawflexi1#[1]; rawflexi2 = @rawflexi2#[1]; raw1 = none; raw2 = none; rawflexi1 = none; rawflexi2 = none; optptr = raw1; optptr = raw2; optptr = rawflexi1; optptr = rawflexi2; raw1 = optptr; raw2 = optptr; rawflexi1 = optptr; rawflexi2 = optptr; }