* net/loveruby/cflat/compiler/TypeChecker.java (checkCond): cond expr might be an array.

* net/loveruby/cflat/compiler/TypeChecker.java (SwitchNode): cond expr should not be pointer.
* net/loveruby/cflat/compiler/TypeChecker.java: <</>> expects same integer.
* net/loveruby/cflat/compiler/TypeChecker.java: comparison operators accept arrays.
* net/loveruby/cflat/compiler/TypeChecker.java: "!" accepts a pointer and an array.
* net/loveruby/cflat/compiler/TypeChecker.java: new method #mustBeScalarAlike.
* net/loveruby/cflat/compiler/TypeChecker.java (mustBeInteger, mustBeScalar, mustBeScalarAlike): takes operator name.


git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@3914 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2008-02-17 20:39:32 +00:00
parent d27ddfebee
commit d1d388ab0c
2 changed files with 56 additions and 35 deletions

View File

@ -1,3 +1,26 @@
Mon Feb 18 05:35:14 2008 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/TypeChecker.java (checkCond): cond
expr might be an array.
* net/loveruby/cflat/compiler/TypeChecker.java (SwitchNode): cond
expr should not be pointer.
* net/loveruby/cflat/compiler/TypeChecker.java: <</>> expects same
integer.
* net/loveruby/cflat/compiler/TypeChecker.java: comparison
operators accept arrays.
* net/loveruby/cflat/compiler/TypeChecker.java: "!" accepts a
pointer and an array.
* net/loveruby/cflat/compiler/TypeChecker.java: new method
#mustBeScalarAlike.
* net/loveruby/cflat/compiler/TypeChecker.java (mustBeInteger,
mustBeScalar, mustBeScalarAlike): takes operator name.
Mon Feb 18 04:10:40 2008 Minero Aoki <aamine@loveruby.net> Mon Feb 18 04:10:40 2008 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/TypeChecker.java (mustBeScalar): * net/loveruby/cflat/compiler/TypeChecker.java (mustBeScalar):

View File

@ -106,12 +106,12 @@ class TypeChecker extends Visitor {
} }
protected void checkCond(ExprNode cond) { protected void checkCond(ExprNode cond) {
mustBeScalar(cond); mustBeScalarAlike(cond, "condition expression");
} }
public void visit(SwitchNode node) { public void visit(SwitchNode node) {
super.visit(node); super.visit(node);
mustBeScalar(node.cond()); mustBeInteger(node.cond(), "condition expression");
} }
public void visit(ReturnNode node) { public void visit(ReturnNode node) {
@ -250,13 +250,10 @@ class TypeChecker extends Visitor {
|| node.operator().equals("%") || node.operator().equals("%")
|| node.operator().equals("&") || node.operator().equals("&")
|| node.operator().equals("|") || node.operator().equals("|")
|| node.operator().equals("^")) { || node.operator().equals("^")
expectsSameInteger(node); || node.operator().equals("<<")
}
else if (node.operator().equals("<<")
|| node.operator().equals(">>")) { || node.operator().equals(">>")) {
expectsIntegers(node); expectsSameInteger(node);
expectsIntegers(node);
} }
else if (node.operator().equals("==") else if (node.operator().equals("==")
|| node.operator().equals("!=") || node.operator().equals("!=")
@ -290,11 +287,11 @@ class TypeChecker extends Visitor {
*/ */
protected void expectsSameIntegerOrPointerDiff(BinaryOpNode node) { protected void expectsSameIntegerOrPointerDiff(BinaryOpNode node) {
if (node.left().type().isPointer()) { if (node.left().type().isPointer()) {
mustBeInteger(node.right()); mustBeInteger(node.right(), node.operator());
node.setType(node.left().type()); node.setType(node.left().type());
} }
else if (node.right().type().isPointer()) { else if (node.right().type().isPointer()) {
mustBeInteger(node.left()); mustBeInteger(node.left(), node.operator());
node.setType(node.right().type()); node.setType(node.right().type());
} }
else { else {
@ -302,23 +299,17 @@ class TypeChecker extends Visitor {
} }
} }
// *, /, %, &, |, ^ // +, -, *, /, %, &, |, ^, <<, >>
protected void expectsSameInteger(BinaryOpNode node) { protected void expectsSameInteger(BinaryOpNode node) {
mustBeInteger(node.left()); mustBeInteger(node.left(), node.operator());
mustBeInteger(node.right()); mustBeInteger(node.right(), node.operator());
insertImplicitCast(node); insertImplicitCast(node);
} }
// <<, >>
protected void expectsIntegers(BinaryOpNode node) {
mustBeInteger(node.left());
mustBeInteger(node.right());
}
// ==, !=, <, <=, >, >=, &&, || // ==, !=, <, <=, >, >=, &&, ||
protected void expectsComparableScalars(BinaryOpNode node) { protected void expectsComparableScalars(BinaryOpNode node) {
mustBeScalar(node.left()); mustBeScalarAlike(node.left(), node.operator());
mustBeScalar(node.right()); mustBeScalarAlike(node.right(), node.operator());
insertImplicitCast(node); insertImplicitCast(node);
} }
@ -344,19 +335,24 @@ class TypeChecker extends Visitor {
// +, -, !, ~ // +, -, !, ~
public void visit(UnaryOpNode node) { public void visit(UnaryOpNode node) {
super.visit(node); super.visit(node);
mustBeInteger(node.expr()); if (node.operator().equals("!")) {
mustBeScalarAlike(node.expr(), node.operator());
}
else {
mustBeInteger(node.expr(), node.operator());
}
} }
// ++, -- // ++, --
public void visit(PrefixOpNode node) { public void visit(PrefixOpNode node) {
super.visit(node); super.visit(node);
mustBeScalar(node.expr()); mustBeScalar(node.expr(), node.operator());
} }
// ++, -- // ++, --
public void visit(SuffixOpNode node) { public void visit(SuffixOpNode node) {
super.visit(node); super.visit(node);
mustBeScalar(node.expr()); mustBeScalar(node.expr(), node.operator());
} }
/** /**
@ -393,7 +389,7 @@ class TypeChecker extends Visitor {
public void visit(ArefNode node) { public void visit(ArefNode node) {
super.visit(node); super.visit(node);
mustBeInteger(node.index()); mustBeInteger(node.index(), "[]");
} }
public void visit(CastNode node) { public void visit(CastNode node) {
@ -411,27 +407,29 @@ class TypeChecker extends Visitor {
return new CastNode(new TypeNode(t), n); return new CastNode(new TypeNode(t), n);
} }
protected void mustBeInteger(ExprNode node) { protected void mustBeInteger(ExprNode node, String op) {
if (node.type().isInteger()) return; if (node.type().isInteger()) return;
notIntegerError(node, node.type()); notIntegerError(node, node.type(), op);
} }
protected void mustBeScalar(ExprNode node) { protected void mustBeScalar(ExprNode node, String op) {
if (node.type().isInteger()) return;
if (node.type().isPointer()) return;
notIntegerError(node, node.type(), op);
}
protected void mustBeScalarAlike(ExprNode node, String op) {
if (node.type().isInteger()) return; if (node.type().isInteger()) return;
if (node.type().isPointerAlike()) return; if (node.type().isPointerAlike()) return;
notIntegerError(node, node.type()); notIntegerError(node, node.type(), op);
} }
protected void incompatibleTypeError(Node n, Type l, Type r) { protected void incompatibleTypeError(Node n, Type l, Type r) {
error(n, "incompatible type: " + l + " and " + r); error(n, "incompatible type: " + l + " and " + r);
} }
protected void notIntegerError(Node n, Type type) { protected void notIntegerError(Node n, Type type, String op) {
error(n, "non-integer argument for unary op: " + type); error(n, "wrong operand type for " + op + ": " + type);
}
protected void undereferableError(Node n, Type type) {
error(n, "dereferencing non-pointer expression: " + type);
} }
protected void warn(Node n, String msg) { protected void warn(Node n, String msg) {