changeset 29416:3f45f5b6fa7f

svd.cc: Use std::max<F77_INT> for Fortran integers (bug #55727). * liboctave/numeric/svd.cc (gejsv_lwork<T>::optimal, svd<T>::svd): Use std::max<F77_INT> for Fortran integers.
author Markus Mützel <markus.muetzel@gmx.de>
date Tue, 09 Mar 2021 20:15:27 +0100
parents eb52033f4e2a
children a6ab7069a87c
files liboctave/numeric/svd.cc
diffstat 1 files changed, 10 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/numeric/svd.cc	Mon Mar 08 11:58:10 2021 -0800
+++ b/liboctave/numeric/svd.cc	Tue Mar 09 20:15:27 2021 +0100
@@ -237,7 +237,7 @@
   std::vector<P> work (2);  // dummy work space
   
   // variables that mimic running environment of gejsv
-  F77_INT lda  = std::max (m, 1);
+  F77_INT lda  = std::max<F77_INT> (m, 1);
   F77_INT ierr = 0;
   char side  = 'L';
   char trans = 'N';
@@ -261,10 +261,10 @@
     {
       // only SIGMA is needed
       if (! (joba == 'E' || joba == 'G') )
-        lwork = std::max<int> ({2*m + n, n + lw_geqp3, n + lw_geqrf, 7});
+        lwork = std::max<F77_INT> ({2*m + n, n + lw_geqp3, n + lw_geqrf, 7});
       else
-        lwork = std::max<int> ({2*m + n, n + lw_geqp3, n + lw_geqrf,
-                                n + n*n + lw_pocon, 7});
+        lwork = std::max<F77_INT> ({2*m + n, n + lw_geqp3, n + lw_geqrf,
+                                    n + n*n + lw_pocon, 7});
     }
   else if (need_rsvec && ! need_lsvec)
     {
@@ -274,8 +274,8 @@
       trans = 'T';
       F77_INT lw_ormlq = ormlq_lwork (side, trans, n, n, n, a, lda,
                                       tau, v, n, work.data (), -1, ierr);
-      lwork = std::max<int> ({2*m + n, n + lw_geqp3, n + lw_pocon,
-                              n + lw_gelqf, 2*n + lw_geqrf, n + lw_ormlq});
+      lwork = std::max<F77_INT> ({2*m + n, n + lw_geqp3, n + lw_pocon,
+                                  n + lw_gelqf, 2*n + lw_geqrf, n + lw_ormlq});
     }
   else if (need_lsvec && ! need_rsvec)
     {
@@ -283,15 +283,15 @@
       F77_INT n1 = (jobu == 'U') ? n : m;  // size of U is m x n1
       F77_INT lw_ormqr = ormqr_lwork (side, trans, m, n1, n, a, lda,
                                       tau, u, m, work.data (), -1, ierr);
-      lwork = std::max<int> ({2*m + n, n + lw_geqp3, n + lw_pocon,
-                              2*n + lw_geqrf, n + lw_ormqr});
+      lwork = std::max<F77_INT> ({2*m + n, n + lw_geqp3, n + lw_pocon,
+                                  2*n + lw_geqrf, n + lw_ormqr});
     }
   else  // full SVD is needed
     {
       if (jobv == 'V')
         lwork = std::max (2*m + n, 6*n + 2*n*n);
       else if (jobv == 'J')
-        lwork = std::max<int> ({2*m + n, 4*n + n*n, 2*n + n*n + 6});
+        lwork = std::max<F77_INT> ({2*m + n, 4*n + n*n, 2*n + n*n + 6});
 
       F77_INT n1 = (jobu == 'U') ? n : m;  // size of U is m x n1
       F77_INT lw_ormqr = ormqr_lwork (side, trans, m, n1, n, a, lda,
@@ -825,7 +825,7 @@
           char jobt = 'N';  // or 'T', but that requires U and V appear together
           char jobp = 'N';  // use 'P' if denormal is poorly implemented.
           
-          std::vector<F77_INT> iwork (std::max (m + 3*n, 1));
+          std::vector<F77_INT> iwork (std::max<F77_INT> (m + 3*n, 1));
 
           gejsv (joba, jobu, jobv, jobr, jobt, jobp, m, n, tmp_data, m1,
                  s_vec, u, vt, nrow_vt1, work, lwork, iwork, info);