Skip to content
Snippets Groups Projects
Commit a3c1fb0d authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Fix issue #18

++ and -- operators are now forbidden in function definitions.
This is the correct behavior for mathematical functions

- concerning function arguments, it was already not supported but
  resulted in a crash
- with regard to outer variables, the behavior is changed since now
  these cannot be modified anymore while calling the
  function. (observe these external parameters can still be modified
  outside of the function definition itself)
parent 991199e3
Branches
Tags
1 merge request!102Fix issue #18
......@@ -25,6 +25,19 @@
#include <language/node_processor/WhileProcessor.hpp>
#include <language/utils/ParseError.hpp>
void
ASTNodeExpressionBuilder::_checkIsPureFunction(const ASTNode& node) const
{
if (node.is_type<language::unary_plusplus>() or node.is_type<language::unary_minusminus>() or
node.is_type<language::post_plusplus>() or node.is_type<language::post_minusminus>()) {
throw ParseError("invalid function definition. Function data must be constant!", node.begin());
}
for (auto&& child : node.children) {
this->_checkIsPureFunction(*child);
}
}
void
ASTNodeExpressionBuilder::_buildExpression(ASTNode& n)
{
......@@ -42,6 +55,8 @@ ASTNodeExpressionBuilder::_buildExpression(ASTNode& n)
} else if (n.is_type<language::tuple_expression>()) {
n.m_node_processor = std::make_unique<TupleToVectorProcessor<ASTNodeExpressionListProcessor>>(n);
} else if (n.is_type<language::function_definition>()) {
this->_checkIsPureFunction(n);
n.m_node_processor = std::make_unique<FakeProcessor>();
} else if (n.is_type<language::function_evaluation>()) {
......
......@@ -5,7 +5,9 @@
class ASTNodeExpressionBuilder
{
private:
void _buildExpression(ASTNode& n);
void _checkIsPureFunction(const ASTNode& n) const;
public:
ASTNodeExpressionBuilder(ASTNode& n);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment