summaryrefslogtreecommitdiff
path: root/chapter15/src
diff options
context:
space:
mode:
authorRobert Obkircher <robert.obkircher@gmail.com>2024-10-05 00:51:33 +0200
committerCliff Click <cliffc@acm.org>2024-10-06 08:56:22 -0700
commitd2791c7283be71f6f3103fbedfd709c4d0f70c59 (patch)
tree037c54f93f2accde37055df2ae2ca60fe77a27e1 /chapter15/src
parentea41e5ca82736ad8380f856c3901cb0efb65e957 (diff)
downloadSimple-d2791c7283be71f6f3103fbedfd709c4d0f70c59.tar.gz
Simple-d2791c7283be71f6f3103fbedfd709c4d0f70c59.zip
fix parsing nested structs
Diffstat (limited to 'chapter15/src')
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/StartNode.java3
-rw-r--r--chapter15/src/test/java/com/seaofnodes/simple/Chapter15Test.java13
2 files changed, 16 insertions, 0 deletions
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/StartNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/StartNode.java
index 14bf37f5..5964e19f 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/StartNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/StartNode.java
@@ -45,6 +45,9 @@ public class StartNode extends CFGNode implements MultiNode {
n._type = args[f._alias];
scope.define(name, tm_decl, n);
}
+ for (int i = 0; i < args.length; i++)
+ if (args[i] == null)
+ args[i] = Type.TOP; // We parsed a nested struct/array. Avoid nulls until a caller replaces this alias.
_type = _args = TypeTuple.make(args);
}
diff --git a/chapter15/src/test/java/com/seaofnodes/simple/Chapter15Test.java b/chapter15/src/test/java/com/seaofnodes/simple/Chapter15Test.java
index dff39ba3..88924c52 100644
--- a/chapter15/src/test/java/com/seaofnodes/simple/Chapter15Test.java
+++ b/chapter15/src/test/java/com/seaofnodes/simple/Chapter15Test.java
@@ -181,6 +181,19 @@ return root;
assertEquals("Obj<Tree>{_kids=Obj<*Tree?[]>{#=2,[]=[Obj<Tree>{_kids=null},null]}}", Evaluator.evaluate(stop, 0).toString());
}
+ @Test
+ public void testNestedStructAddMemProj() {
+ Parser parser = new Parser(
+"""
+struct S {
+ int a;
+ int[] b;
+}
+return 0;
+""");
+ StopNode stop = parser.parse(false);
+ assertEquals("return 0;", stop.toString());
+ }
@Test
public void testRollingSum() {