Analysis: fix some warnings to be strongly typed 68/17768/5
Clément DAVID [Thu, 4 Feb 2016 16:35:47 +0000 (17:35 +0100)]
Rationale: int64_t is supposed to by wide enough to handle dimensions but
sometimes we let the user specify dimensions as double. We have to enforce
the cast to always promote 2^53 values to 2^64 ones.

Change-Id: I8eccaabb4ab771a0dd1e957486ae74ea48dbecd8

scilab/modules/ast/includes/analysis/TIType.hxx
scilab/modules/ast/includes/analysis/gvn/GVN.hxx
scilab/modules/ast/includes/analysis/gvn/TestGVNVisitor.hxx
scilab/modules/ast/src/cpp/analysis/DiagAnalyzer.cpp
scilab/modules/ast/src/cpp/analysis/GVN.cpp
scilab/modules/ast/src/cpp/analysis/IndexAnalyzer.cpp
scilab/modules/ast/src/cpp/analysis/VisitListExp.cpp

index 63c8ea2..62501ab 100644 (file)
@@ -39,7 +39,7 @@ struct TIType
     bool scalar;
 
     TIType(const Type _type = UNKNOWN) : type(_type), scalar(true) { }
-    TIType(GVN & gvn) : type(UNKNOWN), rows(gvn, 0.), cols(gvn, 0.), scalar(false) { }
+    TIType(GVN & gvn) : type(UNKNOWN), rows(gvn, int64_t(0)), cols(gvn, int64_t(0)), scalar(false) { }
     TIType(GVN & gvn, const Type _type) : type(_type), rows(gvn, _type == EMPTY ? 0 : 1), cols(gvn, _type == EMPTY ? 0 : 1), scalar(_type != EMPTY) { }
     TIType(GVN & gvn, const Type _type, const int _rows, const int _cols) : type(_type), rows(gvn, _rows), cols(gvn, _cols), scalar(_rows == 1 && _cols == 1) { }
     TIType(GVN & /*gvn*/, Type _type, const SymbolicDimension & _rows, const SymbolicDimension & _cols) : type(_type), rows(_rows), cols(_cols), scalar(_rows == 1 && _cols == 1) { }
@@ -156,8 +156,8 @@ struct TIType
         else if ((this->type != COMPLEX || type.type != DOUBLE) && this->type != type.type)
         {
             this->type = UNKNOWN;
-            rows.setValue(0.);
-            cols.setValue(0.);
+            rows.setValue(int64_t(0));
+            cols.setValue(int64_t(0));
         }
         else if ((!scalar || !type.scalar) && (rows != type.rows || cols != type.cols))
         {
index d967f7d..b483b2f 100644 (file)
@@ -169,6 +169,13 @@ public:
     Value * getExistingValue(const symbol::Symbol & sym);
 
     /**
+    * \brief Get a value associated with an integer
+    * \param x an integer
+    * \return a Value
+    */
+    Value * getValue(const int64_t x);
+
+    /**
      * \brief Get a value associated with a double
      * \param x a double
      * \return a Value
index f316195..8661c84 100644 (file)
@@ -165,21 +165,21 @@ private:
             case ast::OpExp::eq:
                 if (LV.value == RV.value)
                 {
-                    setResult(gvn.getValue(1));
+                    setResult(gvn.getValue(int64_t(1)));
                 }
                 else
                 {
-                    setResult(gvn.getValue(0));
+                    setResult(gvn.getValue(int64_t(0)));
                 }
                 break;
             case ast::OpExp::ne:
                 if (LV.value != RV.value)
                 {
-                    setResult(gvn.getValue(1));
+                    setResult(gvn.getValue(int64_t(1)));
                 }
                 else
                 {
-                    setResult(gvn.getValue(0));
+                    setResult(gvn.getValue(int64_t(0)));
                 }
                 break;
         }
index 52ee65c..475bf24 100644 (file)
@@ -64,7 +64,7 @@ bool DiagAnalyzer::analyze(AnalysisVisitor & visitor, const unsigned int lhs, as
     bool isOneDim = false;
     GVN::Value * dim;
     TIType & type = R1.getType();
-    GVN::Value * ONE = visitor.getGVN().getValue(1);
+    GVN::Value * ONE = visitor.getGVN().getValue(int64_t(1));
     isOneDim = visitor.getCM().check(ConstraintManager::EQUAL, type.rows.getValue(), ONE);
     if (isOneDim)
     {
@@ -81,7 +81,7 @@ bool DiagAnalyzer::analyze(AnalysisVisitor & visitor, const unsigned int lhs, as
 
     if (isOneDim)
     {
-        SymbolicDimension sdim = index == 0 ? SymbolicDimension(&visitor.getGVN(), dim) : SymbolicDimension(&visitor.getGVN(), visitor.getGVN().getValue(OpValue::Kind::PLUS, *dim, *visitor.getGVN().getValue(std::abs(index))));
+        SymbolicDimension sdim = index == 0 ? SymbolicDimension(&visitor.getGVN(), dim) : SymbolicDimension(&visitor.getGVN(), visitor.getGVN().getValue(OpValue::Kind::PLUS, *dim, *visitor.getGVN().getValue(int64_t(std::abs(index)))));
         TIType resT(visitor.getGVN(), R1.getType().type, sdim, sdim);
         e.getDecorator().setResult(Result(resT, visitor.getDM().getTmpId(resT, false)));
     }
index bcfdbf5..0437fcb 100644 (file)
@@ -126,23 +126,28 @@ GVN::Value * GVN::getExistingValue(const symbol::Symbol & sym)
     }
 }
 
+GVN::Value * GVN::getValue(const int64_t x)
+{
+    const auto i = mapi64.find(x);
+    if (i == mapi64.end())
+    {
+        GVN::Value & value = mapi64.emplace(x, current++).first->second;
+        insertValue(x, value);
+
+        return &value;
+    }
+    else
+    {
+        return &i->second;
+    }
+}
+
 GVN::Value * GVN::getValue(const double x)
 {
     int64_t _x;
     if (tools::asInteger(x, _x))
     {
-        const auto i = mapi64.find(_x);
-        if (i == mapi64.end())
-        {
-            GVN::Value & value = mapi64.emplace(_x, current++).first->second;
-            insertValue(_x, value);
-
-            return &value;
-        }
-        else
-        {
-            return &i->second;
-        }
+        return getValue(_x);
     }
 
     return nullptr;
index 97884e2..afca73e 100644 (file)
@@ -253,8 +253,8 @@ bool AnalysisVisitor::getDimension(SymbolicDimension & dim, ast::Exp & arg, bool
                     types::Bool * const pBool = static_cast<types::Bool *>(pIT);
                     const int size = pBool->getSize();
                     const int * data = pBool->get();
-                    int max = -1;
-                    int count = 0;
+                    int64_t max = -1;
+                    int64_t count = 0;
                     for (int i = 0; i < size; ++i)
                     {
                         if (data[i])
@@ -273,11 +273,11 @@ bool AnalysisVisitor::getDimension(SymbolicDimension & dim, ast::Exp & arg, bool
             {
                 if (be.getValue())
                 {
-                    out = SymbolicDimension(getGVN(), 1.);
+                    out = SymbolicDimension(getGVN(), int64_t(1));
                 }
                 else
                 {
-                    out = SymbolicDimension(getGVN(), 0.);
+                    out = SymbolicDimension(getGVN(), int64_t(0));
                 }
                 safe = true;
                 return true;
@@ -312,7 +312,7 @@ bool AnalysisVisitor::getDimension(SymbolicDimension & dim, ast::Exp & arg, bool
             if (range.isValid())
             {
                 //std::wcerr << *range.getStart()->poly << ":" << *range.getEnd()->poly << ",," << *dim.getValue()->poly << std::endl;
-                safe = getCM().check(ConstraintManager::VALID_RANGE, range.getStart(), range.getEnd(), getGVN().getValue(1), dim.getValue());
+                safe = getCM().check(ConstraintManager::VALID_RANGE, range.getStart(), range.getEnd(), getGVN().getValue(int64_t(1)), dim.getValue());
                 out = _res.getType().rows * _res.getType().cols;
 
                 return true;
index de9c4f9..d25536d 100644 (file)
@@ -141,7 +141,7 @@ void AnalysisVisitor::visit(ast::ListExp & e)
         }
     }
 
-    GVN::Value * ONEValue = getGVN().getValue(1);
+    GVN::Value * ONEValue = getGVN().getValue(int64_t(1));
     SymbolicDimension ONE(getGVN(), ONEValue);
     GVN::Value * v;