diff --git a/src/main/java/dk/camelot64/kickc/Compiler.java b/src/main/java/dk/camelot64/kickc/Compiler.java index 007887de0..7357dface 100644 --- a/src/main/java/dk/camelot64/kickc/Compiler.java +++ b/src/main/java/dk/camelot64/kickc/Compiler.java @@ -164,7 +164,6 @@ public class Compiler { } Pass0GenerateStatementSequence pass0GenerateStatementSequence = new Pass0GenerateStatementSequence(cParser, cFileContext, program, variableBuilderConfig, callingConvention); - pass0GenerateStatementSequence.generate(); StatementSequence sequence = program.getStatementSequence(); @@ -199,6 +198,7 @@ public class Compiler { new Pass1GenerateControlFlowGraph(program).execute(); new Pass1ResolveForwardReferences(program).execute(); + new Pass1AssertProcedureDefined(program).execute(); new PassNAssertStructMembers(program).execute(); new Pass1UnwindBlockScopes(program).execute(); new Pass1Procedures(program).execute(); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java index 842612738..59ccb37a9 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java @@ -245,7 +245,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor allProcedures = getScope().getAllProcedures(true); + for(Procedure procedure : allProcedures) { + final Label procedureLabel = procedure.getLabel(); + final ControlFlowBlock procedureBlock = getGraph().getBlock(procedureLabel.getRef()); + if(procedureBlock == null) + throw new CompileError("Error! Function is never declared: " + procedure.getFullName()); + } + return false; + } + +} diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 77d68f409..f63f1065c 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -37,14 +37,19 @@ public class TestPrograms { public TestPrograms() { } + @Test + public void testCStyleDeclMissing() throws IOException, URISyntaxException { + assertError("cstyle-decl-missing", "Error! Function is never declared: sum"); + } + @Test public void testCStyleDeclRedefinition() throws IOException, URISyntaxException { - assertError("cstyle-decl-redefinition", "Error! Redefinition of function sum"); + assertError("cstyle-decl-redefinition", "Error! Redefinition of function: sum"); } @Test public void testCStyleDeclMismatch() throws IOException, URISyntaxException { - assertError("cstyle-decl-mismatch", "Error! Conflicting declarations for sum"); + assertError("cstyle-decl-mismatch", "Error! Conflicting declarations for: sum"); } @Test diff --git a/src/test/kc/cstyle-decl-missing.kc b/src/test/kc/cstyle-decl-missing.kc new file mode 100644 index 000000000..969b98867 --- /dev/null +++ b/src/test/kc/cstyle-decl-missing.kc @@ -0,0 +1,18 @@ +// Test function declarations +// Definition of function missing + +// Declaration of a sum-function +char sum(char a, int b); + +char * const SCREEN = 0x0400; + +// Definition of main() +void main() { + SCREEN[0] = sum('a', 2); + SCREEN[1] = sum('a', 12); +} + + + + +