* Bug #10216 fixed - Invalid syntaxes for zeros, ones, eye, rand, like zeros(2,:). 53/11653/3
Charlotte HECQUET [Wed, 5 Jun 2013 14:42:03 +0000 (16:42 +0200)]
Change-Id: I8f8b988d5e230de4384b60b9f157164da98e2e0a

scilab/CHANGES_5.5.X
scilab/modules/elementary_functions/sci_gateway/fortran/sci_f_eye.f
scilab/modules/elementary_functions/sci_gateway/fortran/sci_f_ones.f
scilab/modules/elementary_functions/sci_gateway/fortran/sci_f_rand.f
scilab/modules/elementary_functions/sci_gateway/fortran/sci_f_zeros.f
scilab/modules/elementary_functions/src/fortran/core_Import.def
scilab/modules/elementary_functions/tests/nonreg_tests/bug_10216.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/nonreg_tests/bug_10216.tst [new file with mode: 0644]

index 500c182..850553f 100644 (file)
@@ -335,6 +335,8 @@ Bug fixes
 
 * Bug #10213 fixed - sci2exp can be impacted by format which has been mentionned in its help page.
 
+* Bug #10216 fixed - Invalid syntaxes for zeros, ones, eye, rand, like zeros(2,:).
+
 * Bug #10226 fixed - When a // <empty session> line is delete, all sessions
                      histories are folded.
 
index 0e0aad6..dfb7854 100644 (file)
@@ -10,10 +10,11 @@ c
       subroutine inteye(id)
       INCLUDE 'stack.h'
       integer id(nsiz)
+      logical  getmat
 
       integer tops
       double precision s
-      integer iadr,sadr
+      integer iadr,sadr, mattyp1, areadr1, aimadr1
 c
       iadr(l)=l+l-1
       sadr(l)=(l/2)+1
@@ -46,6 +47,10 @@ c     eye sans argument
          if(istk(il).lt.0) il=iadr(istk(il+1))
          m=istk(il+1)
          n=istk(il+2)
+         if(m.eq.-1.and.n.eq.-1) then !To avoid eye(:)
+            call error(21)
+            return
+         endif
 c     eye(matrice)
       elseif(rhs.eq.2) then
 c     eye(m,n)
@@ -54,6 +59,18 @@ c     eye(m,n)
          top=top-1
          call getdimfromvar(top,1,m)
          if(err.gt.0.or.err1.gt.0) return
+         if (.not.getmat('eye', tops, top-rhs+2, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #1 
+         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
+            call error(21) !To avoid eye(:,5)
+            return
+         endif
+         if (.not.getmat('eye', tops, top-rhs+3, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2
+         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
+            call error(21) !To avoid eye(5,:)
+            return
+         endif
       endif
 c
       mn=m*n
index 64fb67c..538fbcb 100644 (file)
@@ -10,10 +10,11 @@ c
       subroutine intones(id)
       INCLUDE 'stack.h'
       integer id(nsiz)
+      logical  getmat
 
       integer tops
       double precision s
-      integer iadr,sadr
+      integer iadr,sadr, mattyp1, areadr1, aimadr1
 c
       iadr(l)=l+l-1
       sadr(l)=(l/2)+1
@@ -48,6 +49,10 @@ c     ones sans argument
          if(istk(il).lt.0) il=iadr(istk(il+1))
          m=istk(il+1)
          n=istk(il+2)
+         if(m.eq.-1.and.n.eq.-1) then !To avoid ones(:)
+            call error(21)
+            return
+         endif
 c     ones(matrice)
       elseif(rhs.eq.2) then
 c     ones(m,n)
@@ -56,6 +61,18 @@ c     ones(m,n)
          top=top-1
          call getdimfromvar(top,1,m)
          if(err.gt.0.or.err1.gt.0) return
+         if (.not.getmat('ones', tops, top-rhs+2, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #1 
+         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
+            call error(21) !To avoid ones(:,5)
+            return
+         endif
+         if (.not.getmat('ones', tops, top-rhs+3, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2
+         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
+            call error(21) !To avoid ones(5,:)
+            return
+         endif
       endif
 c
       mn=m*n
index 2b4794d..a8e4fb9 100644 (file)
@@ -17,11 +17,11 @@ c     Interface for rand function
       integer id(nsiz),tops,topk
       double precision urand
       logical checkrhs,checklhs,getsmat,getscalar,cremat
-      logical cresmat2
+      logical cresmat2, getmat
       integer gettype
       character*(20) randtype
       logical phase
-      integer iadr
+      integer iadr, mattyp1, areadr1, aimadr1
       save    phase
       data    phase /.true./
       
@@ -144,6 +144,34 @@ c     . rand(n1,n2)
          top=top-1
          call getdimfromvar(top,rhs-irt-1,m)
          if(err.gt.0.or.err1.gt.0) return
+         if(rhs.eq.2) then
+            if (.not.getmat('rand', tops, top-rhs-irt+2, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #1 
+            if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
+               call error(21) !To avoid rand(:,5)
+               return
+            endif
+            if (.not.getmat('rand', tops, top-rhs-irt+3, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2
+            if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
+               call error(21) !To avoid rand(5,:)
+               return
+            endif
+         endif
+         if(rhs.eq.3) then
+            if (.not.getmat('rand', tops, top-rhs-irt+4, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #1 
+            if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
+               call error(21) !To avoid rand(:,5)
+               return
+            endif
+            if (.not.getmat('rand', tops, top-rhs-irt+5, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2
+            if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
+               call error(21) !To avoid rand(5,:)
+               return
+            endif
+         endif
       else
 c     . rand(A)
          if(gettype(top).le.10) then
@@ -151,6 +179,10 @@ c     . rand(A)
             if(istk(il).lt.0) il=iadr(istk(il+1))
             m=istk(il+1)
             n=istk(il+2)
+            if(m.eq.-1.and.n.eq.-1) then !To avoid rand(:)
+               call error(21)
+               return
+            endif
             if(gettype(top).le.2.or.gettype(top).eq.5) then
 c     .        ask for result of the same real/complex type
                itres=istk(il+3)
index 0cf8194..b1e297a 100644 (file)
@@ -10,10 +10,11 @@ c
       subroutine intzeros(id)
       INCLUDE 'stack.h'
       integer id(nsiz)
+      logical  getmat
 
       integer tops
       double precision s
-      integer iadr,sadr
+      integer iadr,sadr, mattyp1, areadr1, aimadr1
 c
       iadr(l)=l+l-1
       sadr(l)=(l/2)+1
@@ -48,6 +49,10 @@ c     ones sans argument
          if(istk(il).lt.0) il=iadr(istk(il+1))
          m=istk(il+1)
          n=istk(il+2)
+         if(m.eq.-1.and.n.eq.-1) then !To avoid zeros(:)
+            call error(21)
+            return
+         endif
 c     ones(matrice)
       elseif(rhs.eq.2) then
 c     ones(m,n)
@@ -56,6 +61,18 @@ c     ones(m,n)
          top=top-1
          call getdimfromvar(top,1,m)
          if(err.gt.0.or.err1.gt.0) return
+         if (.not.getmat('zeros', tops, top-rhs+2, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #1 
+         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
+            call error(21) !To avoid zeros(:,5)
+            return
+         endif
+         if (.not.getmat('zeros', tops, top-rhs+3, 
+     +            mattyp1, u1, v1, areadr1, aimadr1)) return !To have the dimensions of argument #2
+         if(u1.ne.u1.and.v1.ne.v1) then !detect nan because isanan does not work here
+            call error(21) !To avoid zeros(5,:)
+            return
+         endif
       endif
 c
       mn=m*n
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_10216.dia.ref b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_10216.dia.ref
new file mode 100644 (file)
index 0000000..7a108f9
--- /dev/null
@@ -0,0 +1,38 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 10216 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=10216
+//
+// <-- Short Description -->
+// Invalid syntaxes for zeros, ones, eye, rand like zeros(2,:)
+errmsg1=msprintf(_("Invalid index.\n"));
+assert_checkerror("zeros(:)", errmsg1, 21);
+assert_checkerror("zeros(:,2)", errmsg1, 21);
+assert_checkerror("zeros(2,:)", errmsg1, 21);
+assert_checkerror("zeros(:,:)", errmsg1, 21);
+assert_checkerror("ones(:)", errmsg1, 21);
+assert_checkerror("ones(:,2)", errmsg1, 21);
+assert_checkerror("ones(2,:)", errmsg1, 21);
+assert_checkerror("ones(:,:)", errmsg1, 21);
+assert_checkerror("eye(:)", errmsg1, 21);
+assert_checkerror("eye(:,2)", errmsg1, 21);
+assert_checkerror("eye(2,:)", errmsg1, 21);
+assert_checkerror("eye(:,:)", errmsg1, 21);
+assert_checkerror("rand(:)", errmsg1, 21);
+assert_checkerror("rand(:,""uniform"")", errmsg1, 21);
+assert_checkerror("rand(:,""normal"")", errmsg1, 21);
+assert_checkerror("rand(:,2)", errmsg1, 21);
+assert_checkerror("rand(2,:)", errmsg1, 21);
+assert_checkerror("rand(:,2,""uniform"")", errmsg1, 21);
+assert_checkerror("rand(2,:,""uniform"")", errmsg1, 21);
+assert_checkerror("rand(:,2,""normal"")", errmsg1, 21);
+assert_checkerror("rand(2,:,""normal"")", errmsg1, 21);
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_10216.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_10216.tst
new file mode 100644 (file)
index 0000000..49a81dc
--- /dev/null
@@ -0,0 +1,42 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 10216 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=10216
+//
+// <-- Short Description -->
+// Invalid syntaxes for zeros, ones, eye, rand like zeros(2,:)
+
+errmsg1=msprintf(_("Invalid index.\n"));
+assert_checkerror("zeros(:)", errmsg1, 21);
+assert_checkerror("zeros(:,2)", errmsg1, 21);
+assert_checkerror("zeros(2,:)", errmsg1, 21);
+assert_checkerror("zeros(:,:)", errmsg1, 21);
+
+assert_checkerror("ones(:)", errmsg1, 21);
+assert_checkerror("ones(:,2)", errmsg1, 21);
+assert_checkerror("ones(2,:)", errmsg1, 21);
+assert_checkerror("ones(:,:)", errmsg1, 21);
+
+assert_checkerror("eye(:)", errmsg1, 21);
+assert_checkerror("eye(:,2)", errmsg1, 21);
+assert_checkerror("eye(2,:)", errmsg1, 21);
+assert_checkerror("eye(:,:)", errmsg1, 21);
+
+assert_checkerror("rand(:)", errmsg1, 21);
+assert_checkerror("rand(:,""uniform"")", errmsg1, 21);
+assert_checkerror("rand(:,""normal"")", errmsg1, 21);
+assert_checkerror("rand(:,2)", errmsg1, 21);
+assert_checkerror("rand(2,:)", errmsg1, 21);
+assert_checkerror("rand(:,2,""uniform"")", errmsg1, 21);
+assert_checkerror("rand(2,:,""uniform"")", errmsg1, 21);
+assert_checkerror("rand(:,2,""normal"")", errmsg1, 21);
+assert_checkerror("rand(2,:,""normal"")", errmsg1, 21);