* net/loveruby/cflat/compiler/TypeChecker.java: check &expr is assignable.

* net/loveruby/cflat/ast/Node.java: new generic method #isAssignable.
* net/loveruby/cflat/ast/VariableNode.java: is assignable.
* net/loveruby/cflat/ast/DereferenceNode.java: is assignable.
* net/loveruby/cflat/ast/ArefNode.java: is assignable.
* net/loveruby/cflat/ast/MemberNode.java: is assignable.
* net/loveruby/cflat/ast/PtrMemberNode.java: is assignable.


git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@3772 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
Minero Aoki 2008-01-02 10:46:28 +00:00
parent c2298ffbd2
commit 16a2210512
9 changed files with 53 additions and 5 deletions

View File

@ -1,3 +1,21 @@
Wed Jan 2 19:45:01 2008 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/TypeChecker.java: check &expr is
assignable.
* net/loveruby/cflat/ast/Node.java: new generic method
#isAssignable.
* net/loveruby/cflat/ast/VariableNode.java: is assignable.
* net/loveruby/cflat/ast/DereferenceNode.java: is assignable.
* net/loveruby/cflat/ast/ArefNode.java: is assignable.
* net/loveruby/cflat/ast/MemberNode.java: is assignable.
* net/loveruby/cflat/ast/PtrMemberNode.java: is assignable.
Wed Jan 2 19:18:29 2008 Minero Aoki <aamine@loveruby.net>
* net/loveruby/cflat/compiler/TypeChecker.java: check return type.

6
ToDo
View File

@ -120,9 +120,7 @@
- *ptr = val
- ptr->memb
- ptr->memb = val
- &expr
- as RHS
* ?? as LHS
- &expr
- function pointer
- refer
- call ptr(arg)
@ -166,7 +164,7 @@
- check duplicated struct/union members
- ptr + int; ptr - int
- check return type
* check if assignable
- check if &expr is assignable
* use user type instead of struct/union
- op for various types
- signed char

View File

@ -26,6 +26,10 @@ public class ArefNode extends Node implements LHSNode {
visitor.visit(this);
}
public boolean isAssignable() {
return true;
}
public boolean isConstantAddress() {
// FIXME
return false;

View File

@ -10,10 +10,16 @@ public class DereferenceNode extends UnaryOpNode implements LHSNode {
visitor.visit(this);
}
public boolean isAssignable() {
return true;
}
// LHS node requirement
public boolean isConstantAddress() {
return false;
}
// LHS node requirement
public AsmEntity address() {
throw new Error("DereferenceNode#address");
}

View File

@ -35,10 +35,16 @@ public class MemberNode extends Node implements LHSNode {
return baseType().memberOffset(name);
}
public boolean isAssignable() {
return true;
}
// LHS node requirement
public boolean isConstantAddress() {
return ((LHSNode)expr).isConstantAddress();
}
// LHS node requirement
public AsmEntity address() {
return expr.address().add(offset());
}

View File

@ -23,4 +23,8 @@ abstract public class Node {
public boolean isIndexable() {
return type().isIndexable();
}
public boolean isAssignable() {
return false;
}
}

View File

@ -28,10 +28,16 @@ public class PtrMemberNode extends Node implements LHSNode {
return name;
}
public boolean isAssignable() {
return true;
}
// LHS node requirement
public boolean isConstantAddress() {
return false;
}
// LHS node requirement
public AsmEntity address() {
throw new Error("PtrMemberNode#address");
}

View File

@ -38,6 +38,10 @@ public class VariableNode extends Node implements LHSNode {
visitor.visit(this);
}
public boolean isAssignable() {
return true;
}
// LHS node requirement
public boolean isConstantAddress() {
return true;

View File

@ -451,7 +451,9 @@ class TypeChecker extends Visitor {
super.visit(node);
Type t = typeTable.pointerTo(node.expr().type());
node.setType(t);
// FIXME: what is "assignable"??
if (! node.expr().isAssignable()) {
errorHandler.error("invalid LHS expression for &");
}
}
public void visit(CastNode node) {