1543 checkNonCyclicInternal(pos, t); |
1543 checkNonCyclicInternal(pos, t); |
1544 } |
1544 } |
1545 |
1545 |
1546 |
1546 |
1547 void checkNonCyclic(DiagnosticPosition pos, TypeVar t) { |
1547 void checkNonCyclic(DiagnosticPosition pos, TypeVar t) { |
1548 checkNonCyclic1(pos, t, new HashSet<TypeVar>()); |
1548 checkNonCyclic1(pos, t, List.<TypeVar>nil()); |
1549 } |
1549 } |
1550 |
1550 |
1551 private void checkNonCyclic1(DiagnosticPosition pos, Type t, Set<TypeVar> seen) { |
1551 private void checkNonCyclic1(DiagnosticPosition pos, Type t, List<TypeVar> seen) { |
1552 final TypeVar tv; |
1552 final TypeVar tv; |
1553 if (t.tag == TYPEVAR && (t.tsym.flags() & UNATTRIBUTED) != 0) |
1553 if (t.tag == TYPEVAR && (t.tsym.flags() & UNATTRIBUTED) != 0) |
1554 return; |
1554 return; |
1555 if (seen.contains(t)) { |
1555 if (seen.contains(t)) { |
1556 tv = (TypeVar)t; |
1556 tv = (TypeVar)t; |
1557 tv.bound = types.createErrorType(t); |
1557 tv.bound = types.createErrorType(t); |
1558 log.error(pos, "cyclic.inheritance", t); |
1558 log.error(pos, "cyclic.inheritance", t); |
1559 } else if (t.tag == TYPEVAR) { |
1559 } else if (t.tag == TYPEVAR) { |
1560 tv = (TypeVar)t; |
1560 tv = (TypeVar)t; |
1561 seen.add(tv); |
1561 seen = seen.prepend(tv); |
1562 for (Type b : types.getBounds(tv)) |
1562 for (Type b : types.getBounds(tv)) |
1563 checkNonCyclic1(pos, b, seen); |
1563 checkNonCyclic1(pos, b, seen); |
1564 } |
1564 } |
1565 } |
1565 } |
1566 |
1566 |