diff --git a/src/language/ASTNodeFunctionExpressionBuilder.cpp b/src/language/ASTNodeFunctionExpressionBuilder.cpp
index 156811f7847b3e7e1f737181e1844dcf64b7e719..188af83054ef79f79374f620ef1323997f9e0bf7 100644
--- a/src/language/ASTNodeFunctionExpressionBuilder.cpp
+++ b/src/language/ASTNodeFunctionExpressionBuilder.cpp
@@ -5,6 +5,7 @@
 #include <SymbolTable.hpp>
 
 #include <ASTNodeDataTypeFlattener.hpp>
+#include <ASTNodeNaturalConversionChecker.hpp>
 
 #include <node_processor/FunctionProcessor.hpp>
 
@@ -15,6 +16,9 @@ ASTNodeFunctionExpressionBuilder::_getArgumentConverter(SymbolType& parameter_sy
 {
   const size_t parameter_id = std::get<size_t>(parameter_symbol.attributes().value());
 
+  ASTNodeNaturalConversionChecker{node_sub_data_type.m_parent_node, node_sub_data_type.m_data_type,
+                                  parameter_symbol.attributes().dataType()};
+
   auto get_function_argument_converter_for =
     [&](const auto& parameter_v) -> std::unique_ptr<IFunctionArgumentConverter> {
     using ParameterT = std::decay_t<decltype(parameter_v)>;
diff --git a/tests/test_ASTNodeFunctionExpressionBuilder.cpp b/tests/test_ASTNodeFunctionExpressionBuilder.cpp
index c45708ddd241d875a30d11b5b2e4450893a3df23..4393ee9dd142f2fa66b6066416ddcbc71ca6795d 100644
--- a/tests/test_ASTNodeFunctionExpressionBuilder.cpp
+++ b/tests/test_ASTNodeFunctionExpressionBuilder.cpp
@@ -102,59 +102,6 @@ not_v(true);
 
         CHECK_AST(data, result);
       }
-
-      SECTION("N parameter")
-      {
-        std::string_view data = R"(
-let not_v : B -> B, a -> not a;
-N n = 1;
-not_v(n);
-)";
-
-        std::string_view result = R"(
-(root:ASTNodeListProcessor)
- `-(language::function_evaluation:FunctionProcessor)
-     +-(language::name:not_v:NameProcessor)
-     `-(language::name:n:NameProcessor)
-)";
-
-        CHECK_AST(data, result);
-      }
-
-      SECTION("Z parameter")
-      {
-        std::string_view data = R"(
-let not_v : B -> B, a -> not a;
-not_v(-1);
-)";
-
-        std::string_view result = R"(
-(root:ASTNodeListProcessor)
- `-(language::function_evaluation:FunctionProcessor)
-     +-(language::name:not_v:NameProcessor)
-     `-(language::unary_minus:UnaryExpressionProcessor<language::unary_minus, long, long>)
-         `-(language::integer:1:ValueProcessor)
-)";
-
-        CHECK_AST(data, result);
-      }
-
-      SECTION("R parameter")
-      {
-        std::string_view data = R"(
-let not_v : B -> B, a -> not a;
-not_v(1.3);
-)";
-
-        std::string_view result = R"(
-(root:ASTNodeListProcessor)
- `-(language::function_evaluation:FunctionProcessor)
-     +-(language::name:not_v:NameProcessor)
-     `-(language::real:1.3:ValueProcessor)
-)";
-
-        CHECK_AST(data, result);
-      }
     }
 
     SECTION("N argument")
@@ -215,14 +162,14 @@ test(2.1);
     {
       std::string_view data = R"(
 let test : N -> N, n -> n+2;
-test(2.1);
+test(2);
 )";
 
       std::string_view result = R"(
 (root:ASTNodeListProcessor)
  `-(language::function_evaluation:FunctionProcessor)
      +-(language::name:test:NameProcessor)
-     `-(language::real:2.1:ValueProcessor)
+     `-(language::integer:2:ValueProcessor)
 )";
 
       CHECK_AST(data, result);
@@ -416,5 +363,59 @@ bad_conv(2);
 
       CHECK_AST_THROWS_WITH(data, std::string{"invalid string conversion"});
     }
+
+    SECTION("invalid argument implicit conversion")
+    {
+      SECTION("N -> B")
+      {
+        std::string_view data = R"(
+let negate : B -> B, b -> not b;
+N n = 2;
+negate(n);
+)";
+
+        CHECK_AST_THROWS_WITH(data, std::string{"invalid implicit conversion: N -> B"});
+      }
+
+      SECTION("Z -> B")
+      {
+        std::string_view data = R"(
+let negate : B -> B, b -> not b;
+negate(3-4);
+)";
+
+        CHECK_AST_THROWS_WITH(data, std::string{"invalid implicit conversion: Z -> B"});
+      }
+
+      SECTION("R -> B")
+      {
+        std::string_view data = R"(
+let negate : B -> B, b -> not b;
+negate(3.24);
+)";
+
+        CHECK_AST_THROWS_WITH(data, std::string{"invalid implicit conversion: R -> B"});
+      }
+
+      SECTION("R -> N")
+      {
+        std::string_view data = R"(
+let next : N -> N, n -> n+1;
+next(3.24);
+)";
+
+        CHECK_AST_THROWS_WITH(data, std::string{"invalid implicit conversion: R -> N"});
+      }
+
+      SECTION("R -> Z")
+      {
+        std::string_view data = R"(
+let prev : Z -> Z, z -> z-1;
+prev(3 + .24);
+)";
+
+        CHECK_AST_THROWS_WITH(data, std::string{"invalid implicit conversion: R -> Z"});
+      }
+    }
   }
 }
diff --git a/tests/test_FunctionProcessor.cpp b/tests/test_FunctionProcessor.cpp
index c28b196ef6f37d55276fabe888f6ace8f5985c94..be13e03159cc0a4cf6cab4bbf6ef1b119eddfa12 100644
--- a/tests/test_FunctionProcessor.cpp
+++ b/tests/test_FunctionProcessor.cpp
@@ -67,34 +67,6 @@ TEST_CASE("FunctionProcessor", "[language]")
           std::string_view data = R"(
 let f : B -> B, b -> not b;
 B b = f(true);
-)";
-          CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
-        }
-
-        SECTION("from N")
-        {
-          std::string_view data = R"(
-let f : B -> B, b -> not b;
-N n = 2;
-B b = f(n);
-)";
-          CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
-        }
-
-        SECTION("from Z")
-        {
-          std::string_view data = R"(
-let f : B -> B, b -> not b;
-B b = f(0);
-)";
-          CHECK_FUNCTION_EVALUATION_RESULT(data, "b", true);
-        }
-
-        SECTION("from R")
-        {
-          std::string_view data = R"(
-let f : B -> B, b -> not b;
-B b = f(0.3);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
         }
@@ -126,15 +98,6 @@ B b = f(n);
           std::string_view data = R"(
 let f : N -> B, (n) -> (n > 2);
 B b = f(2);
-)";
-          CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
-        }
-
-        SECTION("from R")
-        {
-          std::string_view data = R"(
-let f : N -> B, n -> n > 2;
-B b = f(2.3);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
         }
@@ -166,15 +129,6 @@ B b = f(n);
           std::string_view data = R"(
 let f : Z -> B, z -> (z-3 >= 0);
 B b = f(2);
-)";
-          CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
-        }
-
-        SECTION("from R")
-        {
-          std::string_view data = R"(
-let f : Z -> B, (z) -> z-3 > 0;
-B b = f(3.3);
 )";
           CHECK_FUNCTION_EVALUATION_RESULT(data, "b", false);
         }