Analysis: fix bug in listexp analysis 92/17192/2
Calixte DENIZET [Thu, 10 Sep 2015 16:37:01 +0000 (18:37 +0200)]
Change-Id: Ic97e231ebf88a83aac32b060b2c90806c3d02a48

scilab/modules/ast/src/cpp/analysis/VisitForExp.cpp
scilab/modules/ast/src/cpp/analysis/VisitListExp.cpp
scilab/modules/ast/src/cpp/ast/debugvisitor.cpp

index 74820ac..2d057c3 100644 (file)
@@ -27,8 +27,6 @@ void AnalysisVisitor::visit(ast::ForExp & e)
 
     if (dm.requiresAnotherTrip())
     {
-        std::wcerr << "Invalid forexp: types or refcount are not the same before and after the loop" << std::endl;
-
         dm.finalizeBlock();
         dm.addBlock(Block::NORMAL, &e.getBody());
         e.getBody().accept(*this);
index 6cb6670..d17bf8e 100644 (file)
@@ -68,7 +68,9 @@ void AnalysisVisitor::visit(ast::ListExp & e)
         // TODO: finish all the cases
     }
 
-    double start, step, end;
+    double start = 1;
+    double step = 1;
+    double end = 1;
     if (Rstart.getConstant().getDblValue(start) && Rstep.getConstant().getDblValue(step) && Rend.getConstant().getDblValue(end))
     {
         double out;
@@ -85,12 +87,20 @@ void AnalysisVisitor::visit(ast::ListExp & e)
             case 2:
             {
                 const uint64_t N = ForList64::size(start, end, step);
-                TIType T(dm.getGVN(), TIType::DOUBLE, 1, N);
-                if (N == 1)
+                if (e.getParent()->isVarDec())
                 {
-                    out = start;
+                    TIType T(dm.getGVN(), TIType::DOUBLE, 1, 1);
+                    e.getDecorator().setResult(Result(T));
+                }
+                else
+                {
+                    TIType T(dm.getGVN(), TIType::DOUBLE, 1, N);
+                    if (N == 1)
+                    {
+                        out = start;
+                    }
+                    e.getDecorator().setResult(Result(T, dm.getTmpId(T, false)));
                 }
-                e.getDecorator().setResult(Result(T, dm.getTmpId(T, false)));
                 break;
             }
             default:
@@ -102,6 +112,14 @@ void AnalysisVisitor::visit(ast::ListExp & e)
         return;
     }
 
+    if (step == 0 || tools::isNaN(step) || !tools::isFinite(step)
+            || tools::isNaN(start) || !tools::isFinite(start)
+            ||  tools::isNaN(end) || !tools::isFinite(end))
+    {
+        e.getDecorator().setResult(Result(TIType(dm.getGVN(), TIType::EMPTY), -1));
+        return;
+    }
+
     if (!Rstep.getConstant().getDblValue(step) || (step != -1 && step != 1))
     {
         Result & res = e.getDecorator().setResult(Result(TIType(dm.getGVN(), Rstart.getType().type, false), -1));
index d530969..ed49e4a 100644 (file)
@@ -175,14 +175,14 @@ void DebugVisitor::visit (const SimpleVar &e)
     analysis::TIType type = e.getDecorator().getResult().getType();
     if (type.type != analysis::TIType::UNKNOWN)
     {
-       if (type.isscalar())
-       {
-           ty = L" (" + analysis::TIType::toString(type.type) + L")";
-       }
-       else
-       {
-           ty = L" (" + analysis::TIType::toString(type.type) + L"*)";
-       }
+        if (type.isscalar())
+        {
+            ty = L" (" + analysis::TIType::toString(type.type) + L")";
+        }
+        else
+        {
+            ty = L" (" + analysis::TIType::toString(type.type) + L"*)";
+        }
     }
 
     DEBUG_START_NODE(e);