tree: 7e2e3c6ce86cc10fe4637c512ec7fbaffb8ba2c6
  1. constraint_solving_A01_t01.dart
  2. constraint_solving_A01_t02.dart
  3. constraint_solving_A01_t03.dart
  4. constraint_solving_A01_t04.dart
  5. constraint_solving_A01_t05.dart
  6. function_literal_inference_A01_t01.dart
  7. function_literal_inference_A01_t02.dart
  8. function_literal_inference_A01_t03.dart
  9. function_literal_inference_A01_t04.dart
  10. function_literal_inference_A01_t05.dart
  11. function_literal_inference_A01_t06.dart
  12. function_literal_inference_A02_t01.dart
  13. function_literal_inference_A02_t02.dart
  14. function_literal_inference_A02_t03.dart
  15. function_literal_inference_A02_t04.dart
  16. function_literal_inference_A02_t05.dart
  17. function_literal_inference_A02_t06.dart
  18. function_literal_inference_A02_t07.dart
  19. function_literal_inference_A02_t08.dart
  20. function_literal_inference_A02_t09.dart
  21. function_literal_inference_A02_t10.dart
  22. function_literal_inference_A03_t01.dart
  23. function_literal_inference_A03_t02.dart
  24. function_literal_inference_A06_lib1.dart
  25. function_literal_inference_A06_lib2.dart
  26. function_literal_inference_A06_lib3.dart
  27. function_literal_inference_A06_t01.dart
  28. function_literal_inference_A06_t02.dart
  29. function_literal_inference_A06_t03.dart
  30. function_literal_inference_A06_t04.dart
  31. function_literal_inference_A06_t05.dart
  32. function_literal_inference_A06_t06.dart
  33. getter_setter_override_inference_A01_t01.dart
  34. getter_setter_override_inference_A01_t02.dart
  35. getter_setter_override_inference_A01_t03.dart
  36. getter_setter_override_inference_A01_t04.dart
  37. getter_setter_override_inference_A01_t05.dart
  38. getter_setter_override_inference_A01_t06.dart
  39. getter_setter_override_inference_A01_t07.dart
  40. getter_setter_override_inference_A01_t08.dart
  41. getter_setter_override_inference_A01_t09.dart
  42. getter_setter_override_inference_A01_t10.dart
  43. getter_setter_override_inference_A01_t11.dart
  44. getter_setter_override_inference_A01_t12.dart
  45. getter_setter_override_inference_A01_t13.dart
  46. getter_setter_override_inference_A01_t14.dart
  47. getter_setter_override_inference_A01_t15.dart
  48. getter_setter_override_inference_A01_t16.dart
  49. getter_setter_override_inference_A01_t17.dart
  50. getter_setter_override_inference_A02_t01.dart
  51. getter_setter_override_inference_A02_t02.dart
  52. getter_setter_override_inference_A02_t03.dart
  53. getter_setter_override_inference_A02_t04.dart
  54. getter_setter_override_inference_A02_t05.dart
  55. getter_setter_override_inference_A02_t06.dart
  56. getter_setter_override_inference_A02_t07.dart
  57. getter_setter_override_inference_A02_t08.dart
  58. getter_setter_override_inference_A02_t09.dart
  59. getter_setter_override_inference_A02_t10.dart
  60. getter_setter_override_inference_A02_t11.dart
  61. getter_setter_override_inference_A02_t12.dart
  62. getter_setter_override_inference_A03_t01.dart
  63. getter_setter_override_inference_A03_t02.dart
  64. getter_setter_override_inference_A03_t03.dart
  65. getter_setter_override_inference_A03_t04.dart
  66. getter_setter_override_inference_A03_t05.dart
  67. getter_setter_override_inference_A03_t06.dart
  68. getter_setter_override_inference_A03_t07.dart
  69. getter_setter_override_inference_A03_t08.dart
  70. getter_setter_override_inference_A04_t01.dart
  71. getter_setter_override_inference_A04_t02.dart
  72. getter_setter_override_inference_A04_t03.dart
  73. getter_setter_override_inference_A04_t04.dart
  74. getter_setter_override_inference_A04_t05.dart
  75. getter_setter_override_inference_A04_t06.dart
  76. getter_setter_override_inference_A04_t07.dart
  77. getter_setter_override_inference_A04_t08.dart
  78. getter_setter_override_inference_A05_t01.dart
  79. getter_setter_override_inference_A05_t02.dart
  80. getter_setter_override_inference_A05_t03.dart
  81. getter_setter_override_inference_A05_t04.dart
  82. getter_setter_override_inference_A05_t05.dart
  83. getter_setter_override_inference_A05_t06.dart
  84. getter_setter_override_inference_A06_t01.dart
  85. getter_setter_override_inference_A06_t02.dart
  86. getter_setter_override_inference_A06_t03.dart
  87. getter_setter_override_inference_A06_t04.dart
  88. getter_setter_override_inference_A06_t05.dart
  89. getter_setter_override_inference_A06_t06.dart
  90. getter_setter_override_inference_A06_t07.dart
  91. getter_setter_override_inference_A06_t08.dart
  92. getter_setter_override_inference_A06_t09.dart
  93. getter_setter_override_inference_A06_t10.dart
  94. getter_setter_override_inference_A06_t11.dart
  95. least_and_greatest_closure_A01_t01.dart
  96. least_and_greatest_closure_A02_t01.dart
  97. least_and_greatest_closure_A03_t01.dart
  98. least_and_greatest_closure_A04_t01.dart
  99. least_and_greatest_closure_A05_t01.dart
  100. least_and_greatest_closure_A05_t02.dart
  101. least_and_greatest_closure_A06_t01.dart
  102. least_and_greatest_closure_A06_t02.dart
  103. least_and_greatest_closure_A07_t01.dart
  104. least_and_greatest_closure_A07_t02.dart
  105. least_and_greatest_closure_A08_t01.dart
  106. least_and_greatest_closure_A08_t02.dart
  107. least_and_greatest_closure_A09_t01.dart
  108. least_and_greatest_closure_A09_t02.dart
  109. least_and_greatest_closure_A10_t01.dart
  110. least_and_greatest_closure_A10_t02.dart
  111. least_and_greatest_closure_A11_t01.dart
  112. least_and_greatest_closure_A11_t02.dart
  113. least_and_greatest_closure_A12_t01.dart
  114. least_and_greatest_closure_A12_t02.dart
  115. least_and_greatest_closure_A13_t01.dart
  116. least_and_greatest_closure_A13_t02.dart
  117. least_and_greatest_closure_A14_t01.dart
  118. least_and_greatest_closure_A14_t02.dart
  119. least_and_greatest_closure_A15_t01.dart
  120. least_and_greatest_closure_A15_t02.dart
  121. least_and_greatest_closure_A16_t01.dart
  122. least_and_greatest_closure_A16_t02.dart
  123. local_return_type_inference_A01_t01.dart
  124. local_return_type_inference_A02_t01.dart
  125. method_override_inference_A01_t01.dart
  126. method_override_inference_A01_t02.dart
  127. method_override_inference_A01_t03.dart
  128. method_override_inference_A01_t04.dart
  129. method_override_inference_A01_t05.dart
  130. method_override_inference_A01_t06.dart
  131. method_override_inference_A01_t07.dart
  132. method_override_inference_A01_t08.dart
  133. method_override_inference_A01_t09.dart
  134. method_override_inference_A01_t10.dart
  135. method_override_inference_A01_t11.dart
  136. method_override_inference_A01_t12.dart
  137. method_override_inference_A02_t01.dart
  138. method_override_inference_A02_t02.dart
  139. method_override_inference_A02_t03.dart
  140. method_override_inference_A03_t01.dart
  141. method_override_inference_A04_t01.dart
  142. method_override_inference_A05_t01.dart
  143. method_override_inference_A05_t02.dart
  144. method_override_inference_A05_t03.dart
  145. method_override_inference_A05_t04.dart
  146. method_override_inference_A05_t05.dart
  147. method_override_inference_A05_t06.dart
  148. README.md
TypeSystem/inference/README.md

Some tests in this directory (in particular, least_and_greatest_closure_A*.dart) check the least and greatest closure of a type. To do this, we examine the results of the UP and DOWN functions. However, we need to be careful because these functions may return a type that was not produced by the least/greatest closure computation itself.

The least and greatest closure of type is defined with respect to a set of type variables. The definitions of UP and DOWN include the following rules:

  • UP(T1, T2) = T2 if T1 <: T2
  • UP(T1, T2) = T1 if T2 <: T1 ...
  • DOWN(T1, T2) = T1 if T1 <: T2
  • DOWN(T1, T2) = T2 if T2 <: T1

This means that the two types must not be subtypes of each other. Otherwise, UP and DOWN will return one of the input types directly, which is not what these tests are intended to verify.

Therefore, each test must use two type variables with the same structure (that is, one is simply an alpha-conversion of the other), such that neither is a subtype of the other. This forces UP or DOWN to use the rule that computes the least/greatest closure on both arguments. As a result, we compute UP/DOWN(erasedType, erasedType), which evaluates to erasedType, allowing us to inspect the result produced by the least/greatest closure algorithm.