| package p |
| |
| // apidiff's output (but not its correctness) could depend on the order |
| // in which declarations were visited. |
| |
| // For example, this always correctly reported that U changed from T to U: |
| |
| // old |
| type U = T |
| |
| // new |
| // i U: changed from T to U |
| type U T |
| |
| // both |
| type T int |
| |
| // But the test below, which is just a renaming of the one above, would report |
| // that B was changed from B to B! apidiff was not wrong--there is an |
| // incompatibility here--but it expressed itself poorly. |
| // |
| // This happened because old.A was processed first (Scope.Names returns names |
| // sorted), resulting in old.B corresponding with new.A. Later, when old.B |
| // was processed, it was matched with new.B. But since there was already a |
| // correspondence for old.B, the blame for the incompatibility was put on new.B. |
| |
| // The fix is to establish the correspondence between same-named types first. |
| |
| // old |
| type A = B |
| |
| // new |
| // i A: changed from B to A |
| type A B |
| |
| // both |
| type B int |