return(x) without assignation is not a correct expression 53/17553/2
Antoine ELIAS [Wed, 9 Dec 2015 10:07:54 +0000 (11:07 +0100)]
Change-Id: I05a52b7b029bd916bc4788c0f9d203323c4fefa3

scilab/modules/ast/src/cpp/ast/runvisitor.cpp
scilab/modules/ast/tests/unit_tests/return.dia.ref
scilab/modules/ast/tests/unit_tests/return.tst

index 4bc1f51..08ced71 100644 (file)
@@ -920,6 +920,11 @@ void RunVisitorT<T>::visitprivate(const ReturnExp &e)
     {
         //return(x)
 
+        if (e.getParent() == nullptr || e.getParent()->isAssignExp() == false)
+        {
+            CoverageInstance::stopChrono((void*)&e);
+            throw InternalError(_W("With input arguments, return / resume expect output arguments.\n"), 999, e.getLocation());
+        }
         //in case of CallExp, we can return only one values
         int iSaveExpectedSize = getExpectedSize();
         setExpectedSize(1);
@@ -935,6 +940,8 @@ void RunVisitorT<T>::visitprivate(const ReturnExp &e)
         setExpectedSize(iSaveExpectedSize);
         const_cast<ReturnExp*>(&e)->setReturn();
     }
+
+    CoverageInstance::stopChrono((void*)&e);
 }
 
 template <class T>
index 4d1a152..f9103da 100644 (file)
@@ -49,7 +49,12 @@ function v = for_if_return()
     end
     v = 3;
 endfunction
+function y=foo()
+    y = [];
+    return y;
+end
 assert_checkequal(while_return(), 1);
 assert_checkequal(while_if_return(), 1);
 assert_checkequal(for_return(), 1);
 assert_checkequal(for_if_return(), 1);
+assert_checkerror("foo()", _("With input arguments, return / resume expect output arguments."));
index 0d0f3d3..5a11264 100644 (file)
@@ -55,7 +55,13 @@ function v = for_if_return()
     v = 3;
 endfunction
 
+function y=foo()
+    y = [];
+    return y;
+end
+
 assert_checkequal(while_return(), 1);
 assert_checkequal(while_if_return(), 1);
 assert_checkequal(for_return(), 1);
 assert_checkequal(for_if_return(), 1);
+assert_checkerror("foo()", _("With input arguments, return / resume expect output arguments."));