Browse Source

Merge branch 'dev' into bugfix/593

Josselin 2 months ago
parent
commit
649966eb98
100 changed files with 546 additions and 13 deletions
  1. 13 13
      slither/core/declarations/contract.py
  2. 22 0
      slither/core/solidity_types/elementary_type.py
  3. 9 0
      slither/slithir/convert.py
  4. 27 0
      slither/visitors/slithir/expression_to_slithir.py
  5. 5 0
      tests/ast-parsing/expected/minmax-0.4.0-legacy.json
  6. 5 0
      tests/ast-parsing/expected/minmax-0.4.1-legacy.json
  7. 5 0
      tests/ast-parsing/expected/minmax-0.4.10-legacy.json
  8. 5 0
      tests/ast-parsing/expected/minmax-0.4.11-legacy.json
  9. 5 0
      tests/ast-parsing/expected/minmax-0.4.12-compact.json
  10. 5 0
      tests/ast-parsing/expected/minmax-0.4.12-legacy.json
  11. 5 0
      tests/ast-parsing/expected/minmax-0.4.13-compact.json
  12. 5 0
      tests/ast-parsing/expected/minmax-0.4.13-legacy.json
  13. 5 0
      tests/ast-parsing/expected/minmax-0.4.14-compact.json
  14. 5 0
      tests/ast-parsing/expected/minmax-0.4.14-legacy.json
  15. 5 0
      tests/ast-parsing/expected/minmax-0.4.15-compact.json
  16. 5 0
      tests/ast-parsing/expected/minmax-0.4.15-legacy.json
  17. 5 0
      tests/ast-parsing/expected/minmax-0.4.16-compact.json
  18. 5 0
      tests/ast-parsing/expected/minmax-0.4.16-legacy.json
  19. 5 0
      tests/ast-parsing/expected/minmax-0.4.17-compact.json
  20. 5 0
      tests/ast-parsing/expected/minmax-0.4.17-legacy.json
  21. 5 0
      tests/ast-parsing/expected/minmax-0.4.18-compact.json
  22. 5 0
      tests/ast-parsing/expected/minmax-0.4.18-legacy.json
  23. 5 0
      tests/ast-parsing/expected/minmax-0.4.19-compact.json
  24. 5 0
      tests/ast-parsing/expected/minmax-0.4.19-legacy.json
  25. 5 0
      tests/ast-parsing/expected/minmax-0.4.2-legacy.json
  26. 5 0
      tests/ast-parsing/expected/minmax-0.4.20-compact.json
  27. 5 0
      tests/ast-parsing/expected/minmax-0.4.20-legacy.json
  28. 5 0
      tests/ast-parsing/expected/minmax-0.4.21-compact.json
  29. 5 0
      tests/ast-parsing/expected/minmax-0.4.21-legacy.json
  30. 5 0
      tests/ast-parsing/expected/minmax-0.4.22-compact.json
  31. 5 0
      tests/ast-parsing/expected/minmax-0.4.22-legacy.json
  32. 5 0
      tests/ast-parsing/expected/minmax-0.4.23-compact.json
  33. 5 0
      tests/ast-parsing/expected/minmax-0.4.23-legacy.json
  34. 5 0
      tests/ast-parsing/expected/minmax-0.4.24-compact.json
  35. 5 0
      tests/ast-parsing/expected/minmax-0.4.24-legacy.json
  36. 5 0
      tests/ast-parsing/expected/minmax-0.4.25-compact.json
  37. 5 0
      tests/ast-parsing/expected/minmax-0.4.25-legacy.json
  38. 5 0
      tests/ast-parsing/expected/minmax-0.4.26-compact.json
  39. 5 0
      tests/ast-parsing/expected/minmax-0.4.26-legacy.json
  40. 5 0
      tests/ast-parsing/expected/minmax-0.4.3-legacy.json
  41. 5 0
      tests/ast-parsing/expected/minmax-0.4.4-legacy.json
  42. 5 0
      tests/ast-parsing/expected/minmax-0.4.5-legacy.json
  43. 5 0
      tests/ast-parsing/expected/minmax-0.4.6-legacy.json
  44. 5 0
      tests/ast-parsing/expected/minmax-0.4.7-legacy.json
  45. 5 0
      tests/ast-parsing/expected/minmax-0.4.8-legacy.json
  46. 5 0
      tests/ast-parsing/expected/minmax-0.4.9-legacy.json
  47. 5 0
      tests/ast-parsing/expected/minmax-0.5.0-compact.json
  48. 5 0
      tests/ast-parsing/expected/minmax-0.5.0-legacy.json
  49. 5 0
      tests/ast-parsing/expected/minmax-0.5.1-compact.json
  50. 5 0
      tests/ast-parsing/expected/minmax-0.5.1-legacy.json
  51. 5 0
      tests/ast-parsing/expected/minmax-0.5.10-compact.json
  52. 5 0
      tests/ast-parsing/expected/minmax-0.5.10-legacy.json
  53. 5 0
      tests/ast-parsing/expected/minmax-0.5.11-compact.json
  54. 5 0
      tests/ast-parsing/expected/minmax-0.5.11-legacy.json
  55. 5 0
      tests/ast-parsing/expected/minmax-0.5.12-compact.json
  56. 5 0
      tests/ast-parsing/expected/minmax-0.5.12-legacy.json
  57. 5 0
      tests/ast-parsing/expected/minmax-0.5.13-compact.json
  58. 5 0
      tests/ast-parsing/expected/minmax-0.5.13-legacy.json
  59. 5 0
      tests/ast-parsing/expected/minmax-0.5.14-compact.json
  60. 5 0
      tests/ast-parsing/expected/minmax-0.5.14-legacy.json
  61. 5 0
      tests/ast-parsing/expected/minmax-0.5.15-compact.json
  62. 5 0
      tests/ast-parsing/expected/minmax-0.5.15-legacy.json
  63. 5 0
      tests/ast-parsing/expected/minmax-0.5.16-compact.json
  64. 5 0
      tests/ast-parsing/expected/minmax-0.5.16-legacy.json
  65. 5 0
      tests/ast-parsing/expected/minmax-0.5.17-compact.json
  66. 5 0
      tests/ast-parsing/expected/minmax-0.5.17-legacy.json
  67. 5 0
      tests/ast-parsing/expected/minmax-0.5.2-compact.json
  68. 5 0
      tests/ast-parsing/expected/minmax-0.5.2-legacy.json
  69. 5 0
      tests/ast-parsing/expected/minmax-0.5.3-compact.json
  70. 5 0
      tests/ast-parsing/expected/minmax-0.5.3-legacy.json
  71. 5 0
      tests/ast-parsing/expected/minmax-0.5.4-compact.json
  72. 5 0
      tests/ast-parsing/expected/minmax-0.5.4-legacy.json
  73. 5 0
      tests/ast-parsing/expected/minmax-0.5.5-compact.json
  74. 5 0
      tests/ast-parsing/expected/minmax-0.5.5-legacy.json
  75. 5 0
      tests/ast-parsing/expected/minmax-0.5.6-compact.json
  76. 5 0
      tests/ast-parsing/expected/minmax-0.5.6-legacy.json
  77. 5 0
      tests/ast-parsing/expected/minmax-0.5.7-compact.json
  78. 5 0
      tests/ast-parsing/expected/minmax-0.5.7-legacy.json
  79. 5 0
      tests/ast-parsing/expected/minmax-0.5.8-compact.json
  80. 5 0
      tests/ast-parsing/expected/minmax-0.5.8-legacy.json
  81. 5 0
      tests/ast-parsing/expected/minmax-0.5.9-compact.json
  82. 5 0
      tests/ast-parsing/expected/minmax-0.5.9-legacy.json
  83. 5 0
      tests/ast-parsing/expected/minmax-0.6.0-compact.json
  84. 5 0
      tests/ast-parsing/expected/minmax-0.6.0-legacy.json
  85. 5 0
      tests/ast-parsing/expected/minmax-0.6.1-compact.json
  86. 5 0
      tests/ast-parsing/expected/minmax-0.6.1-legacy.json
  87. 5 0
      tests/ast-parsing/expected/minmax-0.6.10-compact.json
  88. 5 0
      tests/ast-parsing/expected/minmax-0.6.10-legacy.json
  89. 5 0
      tests/ast-parsing/expected/minmax-0.6.11-compact.json
  90. 5 0
      tests/ast-parsing/expected/minmax-0.6.11-legacy.json
  91. 5 0
      tests/ast-parsing/expected/minmax-0.6.12-compact.json
  92. 5 0
      tests/ast-parsing/expected/minmax-0.6.12-legacy.json
  93. 5 0
      tests/ast-parsing/expected/minmax-0.6.2-compact.json
  94. 5 0
      tests/ast-parsing/expected/minmax-0.6.2-legacy.json
  95. 5 0
      tests/ast-parsing/expected/minmax-0.6.3-compact.json
  96. 5 0
      tests/ast-parsing/expected/minmax-0.6.3-legacy.json
  97. 5 0
      tests/ast-parsing/expected/minmax-0.6.4-compact.json
  98. 5 0
      tests/ast-parsing/expected/minmax-0.6.4-legacy.json
  99. 5 0
      tests/ast-parsing/expected/minmax-0.6.5-compact.json
  100. 0 0
      tests/ast-parsing/expected/minmax-0.6.5-legacy.json

+ 13 - 13
slither/core/declarations/contract.py

@@ -836,15 +836,15 @@ class Contract(ChildSlither, SourceMapping):  # pylint: disable=too-many-public-
         :return: list of string
         """
         all_erc = [
-            ("ERC20", lambda x: x.is_erc20()),
-            ("ERC165", lambda x: x.is_erc165()),
-            ("ERC1820", lambda x: x.is_erc1820()),
-            ("ERC223", lambda x: x.is_erc223()),
-            ("ERC721", lambda x: x.is_erc721()),
-            ("ERC777", lambda x: x.is_erc777()),
+            ("ERC20", self.is_erc20),
+            ("ERC165", self.is_erc165),
+            ("ERC1820", self.is_erc1820),
+            ("ERC223", self.is_erc223),
+            ("ERC721", self.is_erc721),
+            ("ERC777", self.is_erc777),
         ]
 
-        return [erc[0] for erc in all_erc if erc[1](self)]
+        return [erc for erc, is_erc in all_erc if is_erc()]
 
     def is_erc20(self) -> bool:
         """
@@ -854,7 +854,7 @@ class Contract(ChildSlither, SourceMapping):  # pylint: disable=too-many-public-
         :return: Returns a true if the contract is an erc20
         """
         full_names = self.functions_signatures
-        return all((s in full_names for s in ERC20_signatures))
+        return all(s in full_names for s in ERC20_signatures)
 
     def is_erc165(self) -> bool:
         """
@@ -864,7 +864,7 @@ class Contract(ChildSlither, SourceMapping):  # pylint: disable=too-many-public-
         :return: Returns a true if the contract is an erc165
         """
         full_names = self.functions_signatures
-        return all((s in full_names for s in ERC165_signatures))
+        return all(s in full_names for s in ERC165_signatures)
 
     def is_erc1820(self) -> bool:
         """
@@ -874,7 +874,7 @@ class Contract(ChildSlither, SourceMapping):  # pylint: disable=too-many-public-
         :return: Returns a true if the contract is an erc165
         """
         full_names = self.functions_signatures
-        return all((s in full_names for s in ERC1820_signatures))
+        return all(s in full_names for s in ERC1820_signatures)
 
     def is_erc223(self) -> bool:
         """
@@ -884,7 +884,7 @@ class Contract(ChildSlither, SourceMapping):  # pylint: disable=too-many-public-
         :return: Returns a true if the contract is an erc223
         """
         full_names = self.functions_signatures
-        return all((s in full_names for s in ERC223_signatures))
+        return all(s in full_names for s in ERC223_signatures)
 
     def is_erc721(self) -> bool:
         """
@@ -894,7 +894,7 @@ class Contract(ChildSlither, SourceMapping):  # pylint: disable=too-many-public-
         :return: Returns a true if the contract is an erc721
         """
         full_names = self.functions_signatures
-        return all((s in full_names for s in ERC721_signatures))
+        return all(s in full_names for s in ERC721_signatures)
 
     def is_erc777(self) -> bool:
         """
@@ -904,7 +904,7 @@ class Contract(ChildSlither, SourceMapping):  # pylint: disable=too-many-public-
         :return: Returns a true if the contract is an erc165
         """
         full_names = self.functions_signatures
-        return all((s in full_names for s in ERC777_signatures))
+        return all(s in full_names for s in ERC777_signatures)
 
     @property
     def is_token(self) -> bool:

+ 22 - 0
slither/core/solidity_types/elementary_type.py

@@ -5,6 +5,7 @@ from slither.core.solidity_types.type import Type
 
 
 # see https://solidity.readthedocs.io/en/v0.4.24/miscellaneous.html?highlight=grammar
+from slither.exceptions import SlitherException
 
 Int = [
     "int",
@@ -42,6 +43,9 @@ Int = [
     "int256",
 ]
 
+Max_Int = {k: 2 ** (8 * i - 1) - 1 if i > 0 else 2 ** 255 - 1 for i, k in enumerate(Int)}
+Min_Int = {k: -(2 ** (8 * i - 1)) if i > 0 else -(2 ** 255) for i, k in enumerate(Int)}
+
 Uint = [
     "uint",
     "uint8",
@@ -78,6 +82,12 @@ Uint = [
     "uint256",
 ]
 
+Max_Uint = {k: 2 ** (8 * i) - 1 if i > 0 else 2 ** 256 - 1 for i, k in enumerate(Uint)}
+Min_Uint = {k: 0 for k in Uint}
+
+MaxValues = dict(Max_Int, **Max_Uint)
+MinValues = dict(Min_Int, **Min_Uint)
+
 Byte = [
     "byte",
     "bytes",
@@ -180,6 +190,18 @@ class ElementaryType(Type):
             return 32, True
         return int(self.size / 8), False
 
+    @property
+    def min(self) -> int:
+        if self.name in MinValues:
+            return MinValues[self.name]
+        raise SlitherException(f"{self.name} does not have a min value")
+
+    @property
+    def max(self) -> int:
+        if self.name in MaxValues:
+            return MaxValues[self.name]
+        raise SlitherException(f"{self.name} does not have a max value")
+
     def __str__(self):
         return self._type
 

+ 9 - 0
slither/slithir/convert.py

@@ -428,6 +428,9 @@ def _convert_type_contract(ir, slither):
         assignment.lvalue.set_type(ElementaryType("string"))
         return assignment
 
+    if isinstance(contract, ElementaryType):
+        print(contract.type)
+
     raise SlithIRError(f"type({contract.name}).{ir.variable_right} is unknown")
 
 
@@ -1411,6 +1414,12 @@ def remove_unused(result):
                 if not ins.lvalue.name in to_keep and ins != last_elem:
                     to_remove.append(ins)
                     removed = True
+            # Remove type(X) if X is an elementary type
+            # This assume that type(X) is only used with min/max
+            # If Solidity introduces other operation, we might remove this removal
+            if isinstance(ins, SolidityCall) and ins.function == SolidityFunction("type()"):
+                if isinstance(ins.arguments[0], ElementaryType):
+                    to_remove.append(ins)
 
         result = [i for i in result if not i in to_remove]
     return result

+ 27 - 0
slither/visitors/slithir/expression_to_slithir.py

@@ -4,11 +4,15 @@ from slither.core.declarations import (
     Function,
     SolidityVariable,
     SolidityVariableComposed,
+    SolidityFunction,
 )
 from slither.core.expressions import (
     AssignmentOperationType,
     UnaryOperationType,
     BinaryOperationType,
+    ElementaryTypeNameExpression,
+    CallExpression,
+    Identifier,
 )
 from slither.core.solidity_types import ArrayType, ElementaryType
 from slither.core.solidity_types.type import Type
@@ -350,6 +354,29 @@ class ExpressionToSlithIR(ExpressionVisitor):
 
     def _post_member_access(self, expression):
         expr = get(expression.expression)
+
+        # Look for type(X).max / min
+        # Because we looked at the AST structure, we need to look into the nested expression
+        # Hopefully this is always on a direct sub field, and there is no weird construction
+        if isinstance(expression.expression, CallExpression) and expression.member_name in [
+            "min",
+            "max",
+        ]:
+            if isinstance(expression.expression.called, Identifier):
+                if expression.expression.called.value == SolidityFunction("type()"):
+                    assert len(expression.expression.arguments) == 1
+                    val = TemporaryVariable(self._node)
+                    type_expression_found = expression.expression.arguments[0]
+                    assert isinstance(type_expression_found, ElementaryTypeNameExpression)
+                    type_found = type_expression_found.type
+                    if expression.member_name == "min:":
+                        op = Assignment(val, Constant(str(type_found.min), type_found), type_found,)
+                    else:
+                        op = Assignment(val, Constant(str(type_found.max), type_found), type_found,)
+                    self._result.append(op)
+                    set_val(expression, val)
+                    return
+
         val = ReferenceVariable(self._node)
         member = Member(expr, Constant(expression.member_name), val)
         member.set_expression(expression)

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.0-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.1-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.10-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.11-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.12-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.12-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.13-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.13-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.14-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.14-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.15-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.15-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.16-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.16-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.17-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.17-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.18-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.18-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.19-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.19-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.2-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.20-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.20-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.21-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.21-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.22-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.22-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.23-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.23-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.24-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.24-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.25-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.25-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.26-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.26-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.3-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.4-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.5-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.6-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.7-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.8-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.4.9-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.0-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.0-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.1-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.1-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.10-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.10-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.11-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.11-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.12-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.12-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.13-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.13-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.14-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.14-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.15-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.15-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.16-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.16-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.17-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.17-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.2-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.2-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.3-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.3-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.4-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.4-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.5-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.5-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.6-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.6-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.7-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.7-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.8-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.8-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.9-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.5.9-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.0-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.0-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.1-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.1-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.10-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.10-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.11-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.11-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.12-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.12-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.2-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.2-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.3-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.3-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.4-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.4-legacy.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/minmax-0.6.5-compact.json

@@ -0,0 +1,5 @@
+{
+  "C": {
+    "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n"
+  }
+}

+ 0 - 0
tests/ast-parsing/expected/minmax-0.6.5-legacy.json


Some files were not shown because too many files changed in this diff