mirror of https://github.com/aamine/cbc
* 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:
parent
c2298ffbd2
commit
16a2210512
18
ChangeLog
18
ChangeLog
|
|
@ -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
6
ToDo
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,4 +23,8 @@ abstract public class Node {
|
|||
public boolean isIndexable() {
|
||||
return type().isIndexable();
|
||||
}
|
||||
|
||||
public boolean isAssignable() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue