diff --git a/src/binops.cpp b/src/binops.cpp index 548120f..2929654 100644 --- a/src/binops.cpp +++ b/src/binops.cpp @@ -187,6 +187,12 @@ namespace types { return builder.builder->CreateNeg(value, "neg"); } }); + definitions.push_back(UnopDefinition{ + ty, types::Unary::Plus, ty, + [](codegen::Builder&, std::shared_ptr, llvm::Value* value) { + return value; + } + }); } return definitions; diff --git a/src/binops.h b/src/binops.h index e42a183..3a48d4f 100644 --- a/src/binops.h +++ b/src/binops.h @@ -22,6 +22,7 @@ namespace types { SubPrefix, Not, Negation, + Plus, }; int operator_precedence(BinOp& op); diff --git a/src/parsing.cpp b/src/parsing.cpp index 4e31fda..8210bd1 100644 --- a/src/parsing.cpp +++ b/src/parsing.cpp @@ -349,6 +349,14 @@ namespace parsing { new AST::UnaryExpression(before_meta + inner.metadata(), std::move(expr), types::Unary::Negation) }; } + else if (inner.peek().content == "+") { + inner.next(); + auto expr = parse_primary_expression(inner, scope).unwrap(); + stream.m_position = inner.m_position; + return std::unique_ptr { + new AST::UnaryExpression(before_meta + inner.metadata(), std::move(expr), types::Unary::Plus) + }; + } auto plain_expr = parse_plain_expression(inner, scope); while (inner.peek().content == "(" || inner.peek().content == "[" || inner.peek().content == ".") {