diff options
Diffstat (limited to 'src/mem/slicc/ast/OperatorExprAST.py')
-rw-r--r-- | src/mem/slicc/ast/OperatorExprAST.py | 16 |
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) |