* net/loveruby/cflat/compiler/TypeChecker.java (checkCond): cond expr might be an array, which is a parameter.

* net/loveruby/cflat/compiler/TypeChecker.java (isInvalidReturnType): array is returnable.
* net/loveruby/cflat/compiler/TypeChecker.java (isInvalidLHSType): "unallocated array" means an array which is parameter.  Length does not matter.
* net/loveruby/cflat/compiler/DereferenceChecker.java: should check an operand of ++/-- is assignable.


git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@3911 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2008-02-17 18:33:18 +00:00
parent b8a0f0ecde
commit 95deed38e4
3 changed files with 37 additions and 10 deletions

View File

@ -1,3 +1,18 @@
Mon Feb 18 03:33:12 2008 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/TypeChecker.java (checkCond): cond
expr might be an array, which is a parameter.
* net/loveruby/cflat/compiler/TypeChecker.java
(isInvalidReturnType): array is returnable.
* net/loveruby/cflat/compiler/TypeChecker.java (isInvalidLHSType):
"unallocated array" means an array which is parameter. Length
does not matter.
* net/loveruby/cflat/compiler/DereferenceChecker.java: should
check an operand of ++/-- is assignable.
Mon Feb 18 02:33:16 2008 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/ast/UndefinedVariable.java: should always be

View File

@ -97,6 +97,20 @@ class DereferenceChecker extends Visitor {
// Expressions
//
public void visit(PrefixOpNode node) {
super.visit(node);
if (! node.expr().isAssignable()) {
semanticError(node.expr(), "cannot increment/decrement");
}
}
public void visit(SuffixOpNode node) {
super.visit(node);
if (! node.expr().isAssignable()) {
semanticError(node.expr(), "cannot increment/decrement");
}
}
public void visit(FuncallNode node) {
super.visit(node);
if (! node.expr().isCallable()) {
@ -109,7 +123,6 @@ class DereferenceChecker extends Visitor {
if (! node.expr().isDereferable()) {
semanticError(node, "indexing non-array/pointer expression");
}
check(node.index());
}
public void visit(MemberNode node) {

View File

@ -106,11 +106,7 @@ class TypeChecker extends Visitor {
}
protected void checkCond(ExprNode cond) {
Type t = cond.type();
if (!t.isInteger() && !t.isPointer()) {
notIntegerError(cond, t);
return;
}
mustBeScalar(cond);
}
public void visit(SwitchNode node) {
@ -193,11 +189,11 @@ class TypeChecker extends Visitor {
}
protected boolean isInvalidReturnType(Type t) {
return t.isStruct() || t.isUnion() || t.isArray();
return isNotScalarType(t);
}
protected boolean isInvalidParameterType(Type t) {
return isInvalidLHSType(t);
return isNotScalarType(t);
}
protected boolean isInvalidVariableType(Type t) {
@ -205,11 +201,14 @@ class TypeChecker extends Visitor {
}
protected boolean isInvalidLHSType(Type t) {
return t.isStruct() || t.isUnion()
|| t.isAllocatedArray() || t.isVoid();
return isNotScalarType(t);
}
protected boolean isInvalidRHSType(Type t) {
return isNotScalarType(t);
}
protected boolean isNotScalarType(Type t) {
return t.isStruct() || t.isUnion() || t.isVoid();
}