ast: undefined %foo_clear() silently pass 87/21187/3
Clement David [Mon, 23 Dec 2019 10:29:06 +0000 (11:29 +0100)]
After %foo_clear() introduction on 6ee5c6ff, some tests start failing as
they are using mlist without defining the clear operation. This make
them pass again by avoiding the error report when the overloading is
undefined.

Change-Id: Ia586b4118f4ad1d81c186e88a3eb18ed4ff1d99e

scilab/modules/ast/includes/types/overload.hxx
scilab/modules/ast/src/cpp/types/mlist.cpp
scilab/modules/ast/src/cpp/types/overload.cpp

index 0013e1d..a145fac 100644 (file)
@@ -33,12 +33,12 @@ public:
     /**
      */
     static types::Function::ReturnValue generateNameAndCall(const std::wstring& _stFunctionName, types::typed_list &in, int _iRetCount,
-            types::typed_list &out, bool _isOperator = false);
+            types::typed_list &out, bool _isOperator = false, bool errorOnUndefined = true);
 
     /**
      */
     static types::Function::ReturnValue call(const std::wstring& _stFunctionName, types::typed_list &in, int _iRetCount,
-            types::typed_list &out, bool _isOperator = false);
+            types::typed_list &out, bool _isOperator = false, bool errorOnUndefined = true);
 
     static std::wstring getNameFromOper(const int);
 
index d3a5604..ce1dd6d 100644 (file)
@@ -39,7 +39,7 @@ MList::~MList()
 
     try
     {
-        Overload::generateNameAndCall(L"clear", in, 0, out);
+        Overload::generateNameAndCall(L"clear", in, 0, out, false, false);
     }
     catch (ast::InternalError& /*se*/)
     {
index 31b0c42..aa47683 100644 (file)
@@ -53,7 +53,7 @@ std::wstring Overload::buildOverloadName(const std::wstring& _stFunctionName, ty
     return _stFunctionName;
 }
 
-types::Function::ReturnValue Overload::generateNameAndCall(const std::wstring& _stFunctionName, types::typed_list &in, int _iRetCount, types::typed_list &out, bool _isOperator)
+types::Function::ReturnValue Overload::generateNameAndCall(const std::wstring& _stFunctionName, types::typed_list& in, int _iRetCount, types::typed_list& out, bool _isOperator, bool errorOnUndefined)
 {
     _iRetCount = std::max(1,_iRetCount);
     std::wstring stFunc = buildOverloadName(_stFunctionName, in, _iRetCount, _isOperator);
@@ -79,18 +79,24 @@ types::Function::ReturnValue Overload::generateNameAndCall(const std::wstring& _
     }
 
     // get exeception with overloading error
-    return call(stFunc, in, _iRetCount, out, _isOperator);
+    return call(stFunc, in, _iRetCount, out, _isOperator, errorOnUndefined);
 }
 
-types::Function::ReturnValue Overload::call(const std::wstring& _stOverloadingFunctionName, types::typed_list &in, int _iRetCount, types::typed_list &out, bool _isOperator)
+types::Function::ReturnValue Overload::call(const std::wstring& _stOverloadingFunctionName, types::typed_list& in, int _iRetCount, types::typed_list& out, bool _isOperator, bool errorOnUndefined)
 {
     _iRetCount = std::max(1,_iRetCount);
     types::InternalType *pIT = symbol::Context::getInstance()->get(symbol::Symbol(_stOverloadingFunctionName));
-    types::Callable *pCall = NULL;
+    types::Callable* pCall = NULL;
     try
     {
         if (pIT == NULL || pIT->isCallable() == false)
         {
+            if (!errorOnUndefined)
+            {
+                // don't report an error if requested
+                return types::Function::ReturnValue::OK_NoResult;
+            }
+
             char pstError1[512];
             char pstError2[512];
             char *pstFuncName = wide_string_to_UTF8(_stOverloadingFunctionName.c_str());