mirror of https://github.com/aamine/cbc
* 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:
parent
b8a0f0ecde
commit
95deed38e4
15
ChangeLog
15
ChangeLog
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue