From d58c46e46f5e8b7906aac0084b4e5087e4040906 Mon Sep 17 00:00:00 2001 From: Jesper Gravgaard Date: Fri, 7 Jun 2019 13:46:36 +0200 Subject: [PATCH] Added two struct value error tests. --- .../Pass0GenerateStatementSequence.java | 6 ++++- .../kickc/passes/Pass1UnwindStructValues.java | 6 ++--- .../dk/camelot64/kickc/test/TestPrograms.java | 8 +++++++ src/test/kc/struct-err-0.kc | 6 +++++ src/test/kc/struct-err-1.kc | 23 +++++++++++++++++++ 5 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 src/test/kc/struct-err-0.kc create mode 100644 src/test/kc/struct-err-1.kc diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java index 65a7c5e25..993e32399 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java @@ -463,7 +463,8 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { @Override public Object visitDeclTypes(KickCParser.DeclTypesContext ctx) { List directive = ctx.directive(); - this.declVarType = (SymbolType) visit(ctx.typeDecl()); + SymbolType varType = (SymbolType) visit(ctx.typeDecl()); + this.declVarType = varType; this.declVarDirectives = getDirectives(directive); this.declVarComments = getCommentsSymbol(ctx.getParent()); return null; @@ -1195,6 +1196,9 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { public Object visitStructRef(KickCParser.StructRefContext ctx) { String structDefName = ctx.NAME().getText(); StructDefinition structDefinition = getCurrentScope().getStructDefinition(structDefName); + if(structDefinition==null) { + throw new CompileError("Unknown struct type "+structDefName, new StatementSource(ctx)); + } return structDefinition.getType(); } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java index e9d05299b..b94cee6d3 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java @@ -1,9 +1,7 @@ package dk.camelot64.kickc.passes; -import dk.camelot64.kickc.model.Comment; -import dk.camelot64.kickc.model.ControlFlowBlock; +import dk.camelot64.kickc.model.*; import dk.camelot64.kickc.model.InternalError; -import dk.camelot64.kickc.model.Program; import dk.camelot64.kickc.model.iterator.ProgramValueIterator; import dk.camelot64.kickc.model.statements.Statement; import dk.camelot64.kickc.model.statements.StatementAssignment; @@ -120,7 +118,7 @@ public class Pass1UnwindStructValues extends Pass1Base { stmtIt.remove(); } } else { - throw new RuntimeException("Struct assignment not implemented yet " + statement.toString(getProgram(), false)); + throw new CompileError("Incompatible struct assignment " + statement.toString(getProgram(), false), statement); } } } diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 0eb72ae40..1c51f1a8b 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -50,7 +50,15 @@ public class TestPrograms { compileAndCompare("struct-ptr-0", log()); } + @Test + public void testError1() throws IOException, URISyntaxException { + assertError("struct-err-1", "Incompatible struct assignment"); + } + @Test + public void testError0() throws IOException, URISyntaxException { + assertError("struct-err-0", "Unknown struct type"); + } @Test public void testStruct5() throws IOException, URISyntaxException { diff --git a/src/test/kc/struct-err-0.kc b/src/test/kc/struct-err-0.kc new file mode 100644 index 000000000..0fe18257a --- /dev/null +++ b/src/test/kc/struct-err-0.kc @@ -0,0 +1,6 @@ +// Undeclared struct + +void main() { + struct Point p1; +} + diff --git a/src/test/kc/struct-err-1.kc b/src/test/kc/struct-err-1.kc new file mode 100644 index 000000000..1e1944060 --- /dev/null +++ b/src/test/kc/struct-err-1.kc @@ -0,0 +1,23 @@ +// Incompatible struct assignment + +struct Point1 { + byte x; + byte y; +}; + +struct Point2 { + byte x; + byte y; +}; + +void main() { + struct Point1 p1; + struct Point2 p2; + p1.x = 4; + p2 = p1; + const byte* SCREEN = 0x0400; + SCREEN[0] = p2.x; + SCREEN[0] = p2.y; + +} +