From 1da92e298c9243fb6066759861fb59dc0c2aa2c5 Mon Sep 17 00:00:00 2001 From: Alexandre Bique Date: Mon, 16 Mar 2009 00:26:20 +0000 Subject: [PATCH] local variable was not typed as referenced type --- src/ast/llvm-generator-visitor.cc | 4 ++-- src/ast/scope-builder-visitor.cc | 4 +++- src/ast/type-checker-visitor.cc | 13 +++++++++---- tests/lang/mugiwara/input/flow-control/while.mgw | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/ast/llvm-generator-visitor.cc b/src/ast/llvm-generator-visitor.cc index dc16019..c143b46 100644 --- a/src/ast/llvm-generator-visitor.cc +++ b/src/ast/llvm-generator-visitor.cc @@ -442,8 +442,8 @@ namespace ast void LLVMGeneratorVisitor::visit(const CastExp & node) { - Type * from = node.exp->type; - Type * to = node.type; + Type * from = unreferencedType(node.exp->type); + Type * to = unreferencedType(node.type); assert(from); assert(to); diff --git a/src/ast/scope-builder-visitor.cc b/src/ast/scope-builder-visitor.cc index a57d1b1..b22dbde 100644 --- a/src/ast/scope-builder-visitor.cc +++ b/src/ast/scope-builder-visitor.cc @@ -101,7 +101,9 @@ namespace ast assert(varDecl); symbol->name = varDecl->name; - symbol->type = varDecl->type; + ReferenceType * rtype = new ReferenceType; + rtype->type = varDecl->type; + symbol->type = rtype; symbol->address = new MemoryAddress; node.scope->addSymbol(symbol); } diff --git a/src/ast/type-checker-visitor.cc b/src/ast/type-checker-visitor.cc index 58db11d..a8a31ee 100644 --- a/src/ast/type-checker-visitor.cc +++ b/src/ast/type-checker-visitor.cc @@ -75,12 +75,14 @@ namespace ast { check(node.dest); check(node.value); + assert(node.dest->type); + assert(node.dest->address); + CastExp * castExp = new CastExp(); - castExp->type = node.dest->type; + castExp->type = unreferencedType(node.dest->type); castExp->exp = node.value; - assert(node.dest->type); node.value = castExp; - node.type = node.dest->type; + node.type = castExp->type; } void @@ -94,8 +96,9 @@ namespace ast Symbol * s = scope_->findSymbol(node.symbol->name); assert(s); assert(s->type); - node.type = s->type; + assert(s->address); node.symbol = s; + node.type = s->type; } void @@ -134,7 +137,9 @@ namespace ast const Symbol * s = scope_->findSymbol(node.name); assert(s); assert(s->type); + assert(s->address); node.type = s->type; + node.address = s->address; } void diff --git a/tests/lang/mugiwara/input/flow-control/while.mgw b/tests/lang/mugiwara/input/flow-control/while.mgw index 72a1a38..91d569e 100644 --- a/tests/lang/mugiwara/input/flow-control/while.mgw +++ b/tests/lang/mugiwara/input/flow-control/while.mgw @@ -2,7 +2,7 @@ int32 main() { int64 a; - a = 0; + a = 1; while (a) a = a + 1; return a; -- 2.11.4.GIT