diff --git a/src/ast.cpp b/src/ast.cpp index 26ff5c0..b5b908a 100644 --- a/src/ast.cpp +++ b/src/ast.cpp @@ -86,7 +86,10 @@ namespace AST { for (auto& param : this->m_params) { if (counter++ > 0) out << ", "; - out << param.second->formatted() << " " << param.first; + out << param.second->formatted(); + if (param.first) { + out << " " << *param.first; + } } out << ") -> "; diff --git a/src/ast.h b/src/ast.h index 2a46fde..060fa00 100644 --- a/src/ast.h +++ b/src/ast.h @@ -175,14 +175,14 @@ namespace AST { class Function : public TopLevelStatement { private: std::unique_ptr m_return_ty; - std::vector>> m_params; + std::vector, std::unique_ptr>> m_params; std::string m_name; std::optional>> m_statements; public: Function( token::Metadata meta, std::unique_ptr return_ty, - std::vector>> params, + std::vector, std::unique_ptr>> params, std::string name, std::optional>> statements) : TopLevelStatement{ meta } diff --git a/src/codegen.cpp b/src/codegen.cpp index 4c5917a..15fea41 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -209,11 +209,13 @@ namespace AST { for (auto& param : this->m_params) { auto param_ty_ptr = param_ty_ptrs[counter]; auto arg = function->getArg(counter++); - arg->setName(param.first); - inner_scope.values[param.first] = codegen::StackValue{ - arg, - param_ty_ptr, - }; + if (param.first) { + arg->setName(*param.first); + inner_scope.values[*param.first] = codegen::StackValue{ + arg, + param_ty_ptr, + }; + } } for (auto& statement : *this->m_statements) { diff --git a/src/parsing.cpp b/src/parsing.cpp index 82347ad..0b591dd 100644 --- a/src/parsing.cpp +++ b/src/parsing.cpp @@ -274,14 +274,17 @@ namespace parsing { auto name_token = inner.expect(token::Type::Ident); inner.expect(token::Type::Symbol, "("); - std::vector>> params; + std::vector, std::unique_ptr>> params; while (inner.peek().content != ")") { if (params.size() > 0) { inner.expect(token::Type::Symbol, ","); } auto param_ty = parse_type(inner).unwrap(); - auto param_name = inner.expect(token::Type::Ident); - params.push_back(std::pair(param_name.content, std::move(param_ty))); + std::optional param_name{}; + if (inner.peek().type == token::Type::Ident) { + param_name = inner.expect(token::Type::Ident).content; + } + params.push_back(std::pair(param_name, std::move(param_ty))); } inner.expect(token::Type::Symbol, ")"); diff --git a/test.c b/test.c index c312b01..75c3f0c 100644 --- a/test.c +++ b/test.c @@ -1,4 +1,4 @@ -void printf(char* b, int num); +void printf(char*, int); int fibonacci(int n) { if (n < 2)