summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mem/slicc/ast/OperatorExprAST.py16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/mem/slicc/ast/OperatorExprAST.py b/src/mem/slicc/ast/OperatorExprAST.py
index f449a358a..b1614b6a0 100644
--- a/src/mem/slicc/ast/OperatorExprAST.py
+++ b/src/mem/slicc/ast/OperatorExprAST.py
@@ -107,8 +107,22 @@ class PrefixOperatorExprAST(ExprAST):
opcode = self.slicc.codeFormatter()
optype = self.operand.generate(opcode)
+ # Figure out what the input and output types should be
+ opmap = {"!": "bool", "-": "int", "++": "Scalar"}
+ if self.op in opmap:
+ output = opmap[self.op]
+ type_in_symtab = self.symtab.find(opmap[self.op], Type)
+ if (optype != type_in_symtab):
+ self.error("Type mismatch: right operand of " +
+ "unary operator '%s' must be of type '%s'. ",
+ self.op, type_in_symtab)
+ else:
+ self.error("Invalid prefix operator '%s'",
+ self.op)
+
+ # All is well
fix = code.nofix()
code("(${{self.op}} $opcode)")
code.fix(fix)
- return self.symtab.find("void", Type)
+ return self.symtab.find(output, Type)