aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <phil@nebuloninc.com>2020-05-16 23:05:19 +0100
committerPhilip Herron <philip.herron@embecosm.com>2020-11-28 19:13:36 +0000
commit289cbcc7e694ab3ed62011c86f2d43c8ee2e9dd9 (patch)
tree6f86579f21ffefcb739646b2e64af4099e2e6988
parent821e1fb4a6ad8d969753524341fbb8bfb59ef4b8 (diff)
downloadgcc-289cbcc7e694ab3ed62011c86f2d43c8ee2e9dd9.zip
gcc-289cbcc7e694ab3ed62011c86f2d43c8ee2e9dd9.tar.gz
gcc-289cbcc7e694ab3ed62011c86f2d43c8ee2e9dd9.tar.bz2
Infer types to scope for FunctionParams
-rw-r--r--gcc/rust/analysis/rust-resolution.cc39
1 files changed, 21 insertions, 18 deletions
diff --git a/gcc/rust/analysis/rust-resolution.cc b/gcc/rust/analysis/rust-resolution.cc
index 1c0fad1..a14b64c 100644
--- a/gcc/rust/analysis/rust-resolution.cc
+++ b/gcc/rust/analysis/rust-resolution.cc
@@ -254,9 +254,7 @@ TypeResolution::visit (AST::ComparisonExpr &expr)
void
TypeResolution::visit (AST::LazyBooleanExpr &expr)
-{
- printf ("LazyBooleanExpr: %s\n", expr.as_string ().c_str ());
-}
+{}
void
TypeResolution::visit (AST::TypeCastExpr &expr)
@@ -270,9 +268,7 @@ TypeResolution::visit (AST::AssignmentExpr &expr)
void
TypeResolution::visit (AST::CompoundAssignmentExpr &expr)
-{
- printf ("CompoundAssignmentExpr: %s\n", expr.as_string ().c_str ());
-}
+{}
void
TypeResolution::visit (AST::GroupedExpr &expr)
@@ -340,9 +336,13 @@ TypeResolution::visit (AST::EnumExprTuple &expr)
void
TypeResolution::visit (AST::EnumExprFieldless &expr)
{}
+
void
TypeResolution::visit (AST::CallExpr &expr)
-{}
+{
+ printf ("CallExpr: %s\n", expr.as_string ().c_str ());
+}
+
void
TypeResolution::visit (AST::MethodCallExpr &expr)
{}
@@ -481,18 +481,25 @@ TypeResolution::visit (AST::UseDeclaration &use_decl)
void
TypeResolution::visit (AST::Function &function)
{
+ // always emit the function with return type in the event of nil return type
+ // its a marker for a void function
scope.Insert (function.function_name, function.return_type.get ());
scope.Push ();
- printf ("INSIDE FUNCTION: %s\n", function.function_name.c_str ());
-
for (auto &param : function.function_params)
{
- printf ("FUNC PARAM: %s\n", param.as_string ().c_str ());
- }
+ auto before = letPatternBuffer.size ();
+ param.param_name->accept_vis (*this);
+ if (letPatternBuffer.size () <= before)
+ {
+ rust_error_at (param.locus, "failed to analyse parameter name");
+ return;
+ }
- // ensure return types
- // TODO
+ auto paramName = letPatternBuffer.back ();
+ letPatternBuffer.pop_back ();
+ scope.Insert (paramName.variable_ident, param.type.get ());
+ }
// walk the expression body
for (auto &stmt : function.function_body->statements)
@@ -743,16 +750,12 @@ TypeResolution::visit (AST::LetStmt &stmt)
void
TypeResolution::visit (AST::ExprStmtWithoutBlock &stmt)
{
- printf ("ExprStmtWithoutBlock: %s\n", stmt.as_string ().c_str ());
stmt.expr->accept_vis (*this);
}
void
TypeResolution::visit (AST::ExprStmtWithBlock &stmt)
-{
- printf ("ExprStmtWithBlock: %s\n", stmt.as_string ().c_str ());
- stmt.expr->accept_vis (*this);
-}
+{}
// rust-type.h
void