mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-12-19 15:29:48 +00:00
Added array length mismatch error in Pass1.
This commit is contained in:
parent
19a040345f
commit
6532fdd002
@ -116,6 +116,7 @@ public class Compiler {
|
||||
new Pass1FixLValuesLoHi(program).execute();
|
||||
new Pass1AssertNoLValueIntermediate(program).execute();
|
||||
new Pass1AddTypePromotions(program).execute();
|
||||
new Pass1AssertArrayLengths(program).execute();
|
||||
|
||||
getLog().append("INITIAL CONTROL FLOW GRAPH");
|
||||
getLog().append(program.getGraph().toString(program));
|
||||
|
@ -0,0 +1,47 @@
|
||||
package dk.camelot64.kickc.passes;
|
||||
|
||||
import dk.camelot64.kickc.model.*;
|
||||
|
||||
/**
|
||||
* Asserts that all arrays with lengths and initializers have matching lengths.
|
||||
*/
|
||||
public class Pass1AssertArrayLengths extends Pass1Base {
|
||||
|
||||
public Pass1AssertArrayLengths(Program program) {
|
||||
super(program);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean step() {
|
||||
for(ControlFlowBlock block : getGraph().getAllBlocks()) {
|
||||
for(Statement statement : block.getStatements()) {
|
||||
if(statement instanceof StatementAssignment) {
|
||||
StatementAssignment assignment = (StatementAssignment) statement;
|
||||
LValue lValue = assignment.getlValue();
|
||||
if(lValue instanceof VariableRef) {
|
||||
Variable variable = getScope().getVariable((VariableRef) lValue);
|
||||
if(variable.getType() instanceof SymbolTypeArray) {
|
||||
Integer declaredSize = ((SymbolTypeArray) variable.getType()).getSize();
|
||||
if(declaredSize != null) {
|
||||
if(assignment.getrValue1() == null && assignment.getOperator() == null) {
|
||||
RValue value = assignment.getrValue2();
|
||||
if(value instanceof ValueList) {
|
||||
if(((ValueList) value).getList().size()!=declaredSize) {
|
||||
throw new CompileError("Error! Array length mismatch "+statement.toString(getProgram(), false));
|
||||
}
|
||||
} else if(value instanceof ConstantString) {
|
||||
if(((ConstantString) value).getValue().length()!=declaredSize) {
|
||||
throw new CompileError("Error! Array length mismatch "+statement.toString(getProgram(), false));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -351,6 +351,14 @@ public class TestPrograms extends TestCase {
|
||||
assertError("array-uninitialized", "Cannot determine array size.");
|
||||
}
|
||||
|
||||
public void testArrayLengthMismatch() throws IOException, URISyntaxException {
|
||||
assertError("array-length-mismatch", "Array length mismatch");
|
||||
}
|
||||
|
||||
public void testStringLengthMismatch() throws IOException, URISyntaxException {
|
||||
assertError("string-length-mismatch", "Array length mismatch");
|
||||
}
|
||||
|
||||
private void assertError(String kcFile, String expectError) throws IOException, URISyntaxException {
|
||||
try {
|
||||
compileAndCompare(kcFile);
|
||||
|
@ -0,0 +1,3 @@
|
||||
byte[3] b = { 1, 2 };
|
||||
|
||||
void main() {}
|
@ -0,0 +1,3 @@
|
||||
byte[3] b = "qwe!";
|
||||
|
||||
void main() {}
|
Loading…
Reference in New Issue
Block a user