Browse Source

Merge pull request #635 from crytic/feature/parser-testing

comprehensive parser tests
Feist Josselin 5 months ago
parent
commit
665d706625
100 changed files with 791 additions and 9 deletions
  1. 1 1
      .github/workflows/ci.yml
  2. 44 0
      .github/workflows/parser.yml
  3. 3 3
      slither/core/declarations/function.py
  4. 5 1
      slither/slither.py
  5. 13 4
      slither/solc_parsing/slitherSolc.py
  6. 11 0
      tests/ast-parsing/assembly-all.sol
  7. 15 0
      tests/ast-parsing/assignment-0.4.0.sol
  8. 17 0
      tests/ast-parsing/assignment-0.4.7.sol
  9. 22 0
      tests/ast-parsing/binaryoperation-0.4.0.sol
  10. 24 0
      tests/ast-parsing/binaryoperation-0.4.7.sol
  11. 21 0
      tests/ast-parsing/break-all.sol
  12. 9 0
      tests/ast-parsing/conditional-all.sol
  13. 21 0
      tests/ast-parsing/continue-all.sol
  14. 35 0
      tests/ast-parsing/contract-0.4.0.sol
  15. 35 0
      tests/ast-parsing/contract-0.4.22.sol
  16. 35 0
      tests/ast-parsing/contract-0.6.0.sol
  17. 1 0
      tests/ast-parsing/dowhile-0.4.0.sol
  18. 12 0
      tests/ast-parsing/dowhile-0.4.5.sol
  19. 13 0
      tests/ast-parsing/emit-0.4.0.sol
  20. 22 0
      tests/ast-parsing/emit-0.4.21.sol
  21. 14 0
      tests/ast-parsing/emit-0.4.8.sol
  22. 8 0
      tests/ast-parsing/emit-0.5.0.sol
  23. 29 0
      tests/ast-parsing/enum-all.sol
  24. 6 0
      tests/ast-parsing/event-all.sol
  25. 5 0
      tests/ast-parsing/expected/assembly-0.4.0-legacy.json
  26. 5 0
      tests/ast-parsing/expected/assembly-0.4.1-legacy.json
  27. 5 0
      tests/ast-parsing/expected/assembly-0.4.10-legacy.json
  28. 5 0
      tests/ast-parsing/expected/assembly-0.4.11-legacy.json
  29. 5 0
      tests/ast-parsing/expected/assembly-0.4.12-compact.json
  30. 5 0
      tests/ast-parsing/expected/assembly-0.4.12-legacy.json
  31. 5 0
      tests/ast-parsing/expected/assembly-0.4.13-compact.json
  32. 5 0
      tests/ast-parsing/expected/assembly-0.4.13-legacy.json
  33. 5 0
      tests/ast-parsing/expected/assembly-0.4.14-compact.json
  34. 5 0
      tests/ast-parsing/expected/assembly-0.4.14-legacy.json
  35. 5 0
      tests/ast-parsing/expected/assembly-0.4.15-compact.json
  36. 5 0
      tests/ast-parsing/expected/assembly-0.4.15-legacy.json
  37. 5 0
      tests/ast-parsing/expected/assembly-0.4.16-compact.json
  38. 5 0
      tests/ast-parsing/expected/assembly-0.4.16-legacy.json
  39. 5 0
      tests/ast-parsing/expected/assembly-0.4.17-compact.json
  40. 5 0
      tests/ast-parsing/expected/assembly-0.4.17-legacy.json
  41. 5 0
      tests/ast-parsing/expected/assembly-0.4.18-compact.json
  42. 5 0
      tests/ast-parsing/expected/assembly-0.4.18-legacy.json
  43. 5 0
      tests/ast-parsing/expected/assembly-0.4.19-compact.json
  44. 5 0
      tests/ast-parsing/expected/assembly-0.4.19-legacy.json
  45. 5 0
      tests/ast-parsing/expected/assembly-0.4.2-legacy.json
  46. 5 0
      tests/ast-parsing/expected/assembly-0.4.20-compact.json
  47. 5 0
      tests/ast-parsing/expected/assembly-0.4.20-legacy.json
  48. 5 0
      tests/ast-parsing/expected/assembly-0.4.21-compact.json
  49. 5 0
      tests/ast-parsing/expected/assembly-0.4.21-legacy.json
  50. 5 0
      tests/ast-parsing/expected/assembly-0.4.22-compact.json
  51. 5 0
      tests/ast-parsing/expected/assembly-0.4.22-legacy.json
  52. 5 0
      tests/ast-parsing/expected/assembly-0.4.23-compact.json
  53. 5 0
      tests/ast-parsing/expected/assembly-0.4.23-legacy.json
  54. 5 0
      tests/ast-parsing/expected/assembly-0.4.24-compact.json
  55. 5 0
      tests/ast-parsing/expected/assembly-0.4.24-legacy.json
  56. 5 0
      tests/ast-parsing/expected/assembly-0.4.25-compact.json
  57. 5 0
      tests/ast-parsing/expected/assembly-0.4.25-legacy.json
  58. 5 0
      tests/ast-parsing/expected/assembly-0.4.26-compact.json
  59. 5 0
      tests/ast-parsing/expected/assembly-0.4.26-legacy.json
  60. 5 0
      tests/ast-parsing/expected/assembly-0.4.3-legacy.json
  61. 5 0
      tests/ast-parsing/expected/assembly-0.4.4-legacy.json
  62. 5 0
      tests/ast-parsing/expected/assembly-0.4.5-legacy.json
  63. 5 0
      tests/ast-parsing/expected/assembly-0.4.6-legacy.json
  64. 5 0
      tests/ast-parsing/expected/assembly-0.4.7-legacy.json
  65. 5 0
      tests/ast-parsing/expected/assembly-0.4.8-legacy.json
  66. 5 0
      tests/ast-parsing/expected/assembly-0.4.9-legacy.json
  67. 5 0
      tests/ast-parsing/expected/assembly-0.5.0-compact.json
  68. 5 0
      tests/ast-parsing/expected/assembly-0.5.0-legacy.json
  69. 5 0
      tests/ast-parsing/expected/assembly-0.5.1-compact.json
  70. 5 0
      tests/ast-parsing/expected/assembly-0.5.1-legacy.json
  71. 5 0
      tests/ast-parsing/expected/assembly-0.5.10-compact.json
  72. 5 0
      tests/ast-parsing/expected/assembly-0.5.10-legacy.json
  73. 5 0
      tests/ast-parsing/expected/assembly-0.5.11-compact.json
  74. 5 0
      tests/ast-parsing/expected/assembly-0.5.11-legacy.json
  75. 5 0
      tests/ast-parsing/expected/assembly-0.5.12-compact.json
  76. 5 0
      tests/ast-parsing/expected/assembly-0.5.12-legacy.json
  77. 5 0
      tests/ast-parsing/expected/assembly-0.5.13-compact.json
  78. 5 0
      tests/ast-parsing/expected/assembly-0.5.13-legacy.json
  79. 5 0
      tests/ast-parsing/expected/assembly-0.5.14-compact.json
  80. 5 0
      tests/ast-parsing/expected/assembly-0.5.14-legacy.json
  81. 5 0
      tests/ast-parsing/expected/assembly-0.5.15-compact.json
  82. 5 0
      tests/ast-parsing/expected/assembly-0.5.15-legacy.json
  83. 5 0
      tests/ast-parsing/expected/assembly-0.5.16-compact.json
  84. 5 0
      tests/ast-parsing/expected/assembly-0.5.16-legacy.json
  85. 5 0
      tests/ast-parsing/expected/assembly-0.5.17-compact.json
  86. 5 0
      tests/ast-parsing/expected/assembly-0.5.17-legacy.json
  87. 5 0
      tests/ast-parsing/expected/assembly-0.5.2-compact.json
  88. 5 0
      tests/ast-parsing/expected/assembly-0.5.2-legacy.json
  89. 5 0
      tests/ast-parsing/expected/assembly-0.5.3-compact.json
  90. 5 0
      tests/ast-parsing/expected/assembly-0.5.3-legacy.json
  91. 5 0
      tests/ast-parsing/expected/assembly-0.5.4-compact.json
  92. 5 0
      tests/ast-parsing/expected/assembly-0.5.4-legacy.json
  93. 5 0
      tests/ast-parsing/expected/assembly-0.5.5-compact.json
  94. 5 0
      tests/ast-parsing/expected/assembly-0.5.5-legacy.json
  95. 5 0
      tests/ast-parsing/expected/assembly-0.5.6-compact.json
  96. 5 0
      tests/ast-parsing/expected/assembly-0.5.6-legacy.json
  97. 5 0
      tests/ast-parsing/expected/assembly-0.5.7-compact.json
  98. 5 0
      tests/ast-parsing/expected/assembly-0.5.7-legacy.json
  99. 5 0
      tests/ast-parsing/expected/assembly-0.5.8-compact.json
  100. 0 0
      tests/ast-parsing/expected/assembly-0.5.8-legacy.json

+ 1 - 1
.github/workflows/ci.yml

@@ -35,7 +35,7 @@ jobs:
                "simil", 
                "slither_config", 
                "truffle", 
-               "upgradability", 
+               "upgradability",
                "prop"]
     steps:
     - uses: actions/[email protected]

+ 44 - 0
.github/workflows/parser.yml

@@ -0,0 +1,44 @@
+---
+name: Parser tests
+
+defaults:
+  run:
+    # To load bashrc
+    shell: bash -ieo pipefail {0}
+
+on:
+  pull_request:
+    branches: [master, dev]
+  schedule:
+    # run CI every day even if no PRs/merges occur
+    - cron:  '0 12 * * *'
+
+jobs:
+  build:
+    name: Parser tests
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout Code
+        uses: actions/[email protected]
+
+      - name: Set up Python 3.6
+        uses: actions/[email protected]
+        with:
+          python-version: 3.6
+
+      - name: Install dependencies
+        run: |
+          python setup.py install
+          pip install deepdiff
+          pip install pytest
+
+          git clone https://github.com/crytic/solc-select.git
+          ./solc-select/scripts/install.sh
+          export PATH=/home/runner/.solc-select:$PATH
+          echo "export PATH=/home/runner/.solc-select:$PATH" >> ~/.bashrc
+
+      - name: Test with pytest
+        run: |
+          pytest tests/test_ast_parsing.py
+

+ 3 - 3
slither/core/declarations/function.py

@@ -1298,7 +1298,7 @@ class Function(
         with open(filename, "w", encoding="utf8") as f:
             f.write(content)
 
-    def slithir_cfg_to_dot_str(self) -> str:
+    def slithir_cfg_to_dot_str(self, skip_expressions=False) -> str:
         """
         Export the CFG to a DOT format. The nodes includes the Solidity expressions and the IRs
         :return: the DOT content
@@ -1310,9 +1310,9 @@ class Function(
         content += "digraph{\n"
         for node in self.nodes:
             label = "Node Type: {} {}\n".format(str(node.type), node.node_id)
-            if node.expression:
+            if node.expression and not skip_expressions:
                 label += "\nEXPRESSION:\n{}\n".format(node.expression)
-            if node.irs:
+            if node.irs and not skip_expressions:
                 label += "\nIRs:\n" + "\n".join([str(ir) for ir in node.irs])
             content += '{}[label="{}"];\n'.format(node.node_id, label)
             if node.type in [NodeType.IF, NodeType.IFLOOP]:

+ 5 - 1
slither/slither.py

@@ -97,7 +97,11 @@ class Slither(SlitherCore):  # pylint: disable=too-many-instance-attributes
         triage_mode = kwargs.get("triage_mode", False)
         self._triage_mode = triage_mode
 
-        self._parser.analyze_contracts()
+        self._parser.parse_contracts()
+
+        # skip_analyze is only used for testing
+        if not kwargs.get("skip_analyze", False):
+            self._parser.analyze_contracts()
 
     def _init_from_raw_json(self, filename):
         if not os.path.isfile(filename):

+ 13 - 4
slither/solc_parsing/slitherSolc.py

@@ -20,11 +20,12 @@ logger.setLevel(logging.INFO)
 
 
 class SlitherSolc:
-    # pylint: disable=no-self-use
+    # pylint: disable=no-self-use,too-many-instance-attributes
     def __init__(self, filename: str, core: SlitherCore):
         super().__init__()
         core.filename = filename
         self._contracts_by_id: Dict[int, ContractSolc] = {}
+        self._parsed = False
         self._analyzed = False
 
         self._underlying_contract_to_parser: Dict[Contract, ContractSolc] = dict()
@@ -233,16 +234,20 @@ class SlitherSolc:
     ###################################################################################
     ###################################################################################
 
+    @property
+    def parsed(self) -> bool:
+        return self._parsed
+
     @property
     def analyzed(self) -> bool:
         return self._analyzed
 
-    def analyze_contracts(self):  # pylint: disable=too-many-statements,too-many-branches
+    def parse_contracts(self):  # pylint: disable=too-many-statements,too-many-branches
         if not self._underlying_contract_to_parser:
             logger.info(
                 f"No contract were found in {self._core.filename}, check the correct compilation"
             )
-        if self._analyzed:
+        if self._parsed:
             raise Exception("Contract analysis can be run only once!")
 
         # First we save all the contracts in a dict
@@ -348,12 +353,16 @@ Please rename it, this name is reserved for Slither's internals"""
         # Then we analyse state variables, functions and modifiers
         self._analyze_third_part(contracts_to_be_analyzed, libraries)
 
-        self._analyzed = True
+        self._parsed = True
 
+    def analyze_contracts(self):  # pylint: disable=too-many-statements,too-many-branches
+        if not self._parsed:
+            raise SlitherException("Parse the contract before running analyses")
         self._convert_to_slithir()
 
         compute_dependency(self._core)
         self._core.compute_storage_layout()
+        self._analyzed = True
 
     def _analyze_all_enums(self, contracts_to_be_analyzed: List[ContractSolc]):
         while contracts_to_be_analyzed:

+ 11 - 0
tests/ast-parsing/assembly-all.sol

@@ -0,0 +1,11 @@
+contract C {
+    function f() public {
+        assembly {
+            let x := 0
+        }
+
+        assembly "evmasm" {
+            let x := 0
+        }
+    }
+}

+ 15 - 0
tests/ast-parsing/assignment-0.4.0.sol

@@ -0,0 +1,15 @@
+contract C {
+    function f() public {
+        uint assign;
+        assign = 10;
+
+        assign |= 10;
+        assign ^= 10;
+        assign &= 10;
+        assign += 10;
+        assign -= 10;
+        assign *= 10;
+        assign /= 10;
+        assign %= 10;
+    }
+}

+ 17 - 0
tests/ast-parsing/assignment-0.4.7.sol

@@ -0,0 +1,17 @@
+contract C {
+    function f() public {
+        uint assign;
+        assign = 10;
+
+        assign |= 10;
+        assign ^= 10;
+        assign &= 10;
+        assign <<= 10;
+        assign >>= 10;
+        assign += 10;
+        assign -= 10;
+        assign *= 10;
+        assign /= 10;
+        assign %= 10;
+    }
+}

+ 22 - 0
tests/ast-parsing/binaryoperation-0.4.0.sol

@@ -0,0 +1,22 @@
+contract C {
+    function f() public {
+        1**2;
+        1*2;
+        1/2;
+        1&2;
+        1+2;
+        1-2;
+        1 & 2;
+        1 ^ 2;
+        1 | 2;
+        1 < 2;
+        1 > 2;
+        1 <= 2;
+        1 >= 2;
+        1 == 2;
+        1 != 2;
+        true && false;
+        true || false;
+    }
+
+}

+ 24 - 0
tests/ast-parsing/binaryoperation-0.4.7.sol

@@ -0,0 +1,24 @@
+contract C {
+    function f() public {
+        1**2;
+        1*2;
+        1/2;
+        1&2;
+        1+2;
+        1-2;
+        1 << 2;
+        1 >> 2;
+        1 & 2;
+        1 ^ 2;
+        1 | 2;
+        1 < 2;
+        1 > 2;
+        1 <= 2;
+        1 >= 2;
+        1 == 2;
+        1 != 2;
+        true && false;
+        true || false;
+    }
+
+}

+ 21 - 0
tests/ast-parsing/break-all.sol

@@ -0,0 +1,21 @@
+contract C {
+    function f() public {
+        uint c;
+
+        for (uint i = 0; i < 10; i++) {
+            if (i % 2 == 0) {
+                break;
+            }
+            c++;
+        }
+
+        for (uint j = 0; j < 10; j++) {
+            for (uint k = 0; k < 10; k++) {
+                if (j % 2 == 0 && k % 3 == 0) {
+                    break;
+                }
+                c++;
+            }
+        }
+    }
+}

+ 9 - 0
tests/ast-parsing/conditional-all.sol

@@ -0,0 +1,9 @@
+contract C {
+    function f() public {
+        false ? 1 : 2;
+        5 == 6 ? 1 : 2;
+        1 + 2 == 3 ? 4 + 5 == 6 ? int8(0) : -1 : -2;
+        true ? "a" : "b";
+        false ? (1, 2) : (3, 4);
+    }
+}

+ 21 - 0
tests/ast-parsing/continue-all.sol

@@ -0,0 +1,21 @@
+contract C {
+    function f() public {
+        uint c;
+
+        for (uint i = 0; i < 10; i++) {
+            if (i % 2 == 0) {
+                continue;
+            }
+            c++;
+        }
+
+        for (uint j = 0; j < 10; j++) {
+            for (uint k = 0; k < 10; k++) {
+                if (j % 2 == 0 && k % 3 == 0) {
+                    continue;
+                }
+                c++;
+            }
+        }
+    }
+}

+ 35 - 0
tests/ast-parsing/contract-0.4.0.sol

@@ -0,0 +1,35 @@
+
+// a simple contract
+contract A {
+
+}
+
+// inheritance, no constructor
+contract B is A {
+    function B(uint a) {
+
+    }
+}
+
+// inheritance, init in inheritance
+contract C is B(4) {
+
+}
+
+// inheritance, init in constructor
+contract D is B {
+    function D() B(2) {
+
+    }
+}
+
+// abstract contract
+contract E is B {
+}
+
+// diamond inheritance
+contract F is A {}
+contract G is A {}
+contract H is F, G {
+
+}

+ 35 - 0
tests/ast-parsing/contract-0.4.22.sol

@@ -0,0 +1,35 @@
+
+// a simple contract
+contract A {
+
+}
+
+// inheritance, no constructor
+contract B is A {
+    constructor(uint a) public  {
+
+    }
+}
+
+// inheritance, init in inheritance
+contract C is B(4) {
+
+}
+
+// inheritance, init in constructor
+contract D is B {
+    constructor() B(2) public  {
+
+    }
+}
+
+// abstract contract
+contract E is B {
+}
+
+// diamond inheritance
+contract F is A {}
+contract G is A {}
+contract H is F, G {
+
+}

+ 35 - 0
tests/ast-parsing/contract-0.6.0.sol

@@ -0,0 +1,35 @@
+
+// a simple contract
+contract A {
+
+}
+
+// inheritance, no constructor
+contract B is A {
+    constructor(uint a) public {
+
+    }
+}
+
+// inheritance, init in inheritance
+contract C is B(4) {
+
+}
+
+// inheritance, init in constructor
+contract D is B {
+    constructor() B(2) public {
+
+    }
+}
+
+// abstract contract
+abstract contract E is B {
+}
+
+// diamond inheritance
+contract F is A {}
+contract G is A {}
+contract H is F, G {
+
+}

+ 1 - 0
tests/ast-parsing/dowhile-0.4.0.sol

@@ -0,0 +1 @@
+contract C {}

+ 12 - 0
tests/ast-parsing/dowhile-0.4.5.sol

@@ -0,0 +1,12 @@
+contract C {
+    function f() public {
+        bool go = true;
+        do {
+            go = false;
+        } while (go);
+
+        go = true;
+        do go = false;
+        while (go);
+    }
+}

+ 13 - 0
tests/ast-parsing/emit-0.4.0.sol

@@ -0,0 +1,13 @@
+contract C {
+    event E(uint);
+
+    function emitNoKeyword() public {
+        E(1);
+    }
+
+    function cursed() public {
+        var x = E;
+        x(1);
+        x(2);
+    }
+}

+ 22 - 0
tests/ast-parsing/emit-0.4.21.sol

@@ -0,0 +1,22 @@
+contract C {
+    event E(uint);
+
+    function emitNoKeyword() public {
+        E(1);
+        C.E(1);
+    }
+
+    function emitWithKeyword() public {
+        emit E(1);
+        emit C.E(1);
+    }
+
+    function cursed() public {
+        var x = E;
+        x(1);
+        x(2);
+
+        emit x(1);
+        emit x(2);
+    }
+}

+ 14 - 0
tests/ast-parsing/emit-0.4.8.sol

@@ -0,0 +1,14 @@
+contract C {
+    event E(uint);
+
+    function emitNoKeyword() public {
+        E(1);
+        C.E(1);
+    }
+
+    function cursed() public {
+        var x = E;
+        x(1);
+        x(2);
+    }
+}

+ 8 - 0
tests/ast-parsing/emit-0.5.0.sol

@@ -0,0 +1,8 @@
+contract C {
+    event E(uint);
+
+    function emitWithKeyword() public {
+        emit E(1);
+        emit C.E(1);
+    }
+}

+ 29 - 0
tests/ast-parsing/enum-all.sol

@@ -0,0 +1,29 @@
+contract C {
+    enum E1 {
+        A,
+        B,
+        C
+    }
+    
+    // this enum contains more than 256 elements
+    // which means it can't be stored in a uint8
+    enum E2 {
+        A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,
+        A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27,A28,A29,A30,A31,A32,
+        A33,A34,A35,A36,A37,A38,A39,A40,A41,A42,A43,A44,A45,A46,A47,A48,
+        A49,A50,A51,A52,A53,A54,A55,A56,A57,A58,A59,A60,A61,A62,A63,A64,
+        A65,A66,A67,A68,A69,A70,A71,A72,A73,A74,A75,A76,A77,A78,A79,A80,
+        A81,A82,A83,A84,A85,A86,A87,A88,A89,A90,A91,A92,A93,A94,A95,A96,
+        A97,A98,A99,A100,A101,A102,A103,A104,A105,A106,A107,A108,A109,A110,A111,A112,
+        A113,A114,A115,A116,A117,A118,A119,A120,A121,A122,A123,A124,A125,A126,A127,A128,
+        A129,A130,A131,A132,A133,A134,A135,A136,A137,A138,A139,A140,A141,A142,A143,A144,
+        A145,A146,A147,A148,A149,A150,A151,A152,A153,A154,A155,A156,A157,A158,A159,A160,
+        A161,A162,A163,A164,A165,A166,A167,A168,A169,A170,A171,A172,A173,A174,A175,A176,
+        A177,A178,A179,A180,A181,A182,A183,A184,A185,A186,A187,A188,A189,A190,A191,A192,
+        A193,A194,A195,A196,A197,A198,A199,A200,A201,A202,A203,A204,A205,A206,A207,A208,
+        A209,A210,A211,A212,A213,A214,A215,A216,A217,A218,A219,A220,A221,A222,A223,A224,
+        A225,A226,A227,A228,A229,A230,A231,A232,A233,A234,A235,A236,A237,A238,A239,A240,
+        A241,A242,A243,A244,A245,A246,A247,A248,A249,A250,A251,A252,A253,A254,A255,A256,
+        A257
+    }
+}

+ 6 - 0
tests/ast-parsing/event-all.sol

@@ -0,0 +1,6 @@
+contract C {
+    event NoParams();
+    event Anonymous() anonymous;
+    event OneParam(address addr);
+    event OneParamIndexed(address indexed addr);
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

+ 5 - 0
tests/ast-parsing/expected/assembly-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: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
+  }
+}

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


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