changeset 22135:407c66ae1e20

reduce warnings from GCC's link-time optimization feature (bug #48531) * f77-fcn.h (F77_DBLE_CMPLX, F77_CMPLX): Use C types instead of typedefs for std::complex<T> types. (F77_CMPLX_ARG, F77_CONST_CMPLX_ARG, F77_DBLE_CMPLX_ARG, F77_CONST_DBLE_CMPLX_ARG): New macros. * dot.cc, ordschur.cc, qz.cc, CColVector.cc, CMatrix.cc, CRowVector.cc, CSparse.cc, dSparse.cc, fCColVector.cc, fCMatrix.cc, fCRowVector.cc, f77-fcn.h, EIG.cc, aepbalance.cc, chol.cc, eigs-base.cc, fEIG.cc, gepbalance.cc, hess.cc, lo-specfun.cc, lu.cc, oct-convn.cc, qr.cc, qrp.cc, schur.cc, svd.cc: Use new macros for passing complex arguments to Fortran function. Always pass pointers to complex arguments.
author John W. Eaton <jwe@octave.org>
date Mon, 18 Jul 2016 09:38:57 -0400
parents a51d5c5c71e6
children 9c3ace79cc3b
files libinterp/corefcn/dot.cc libinterp/corefcn/ordschur.cc libinterp/corefcn/qz.cc liboctave/array/CColVector.cc liboctave/array/CMatrix.cc liboctave/array/CRowVector.cc liboctave/array/CSparse.cc liboctave/array/dSparse.cc liboctave/array/fCColVector.cc liboctave/array/fCMatrix.cc liboctave/array/fCRowVector.cc liboctave/cruft/misc/f77-fcn.h liboctave/numeric/EIG.cc liboctave/numeric/aepbalance.cc liboctave/numeric/chol.cc liboctave/numeric/eigs-base.cc liboctave/numeric/fEIG.cc liboctave/numeric/gepbalance.cc liboctave/numeric/hess.cc liboctave/numeric/lo-specfun.cc liboctave/numeric/lu.cc liboctave/numeric/oct-convn.cc liboctave/numeric/qr.cc liboctave/numeric/qrp.cc liboctave/numeric/schur.cc liboctave/numeric/svd.cc
diffstat 26 files changed, 541 insertions(+), 517 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/dot.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/libinterp/corefcn/dot.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -171,8 +171,8 @@
           FloatComplexNDArray z (dimz);
 
           F77_XFCN (cdotc3, CDOTC3, (m, n, k,
-                                     x.data (), y.data (),
-                                     z.fortran_vec ()));
+                                     F77_CONST_CMPLX_ARG (x.data ()), F77_CONST_CMPLX_ARG (y.data ()),
+                                     F77_CMPLX_ARG (z.fortran_vec ())));
           retval = z;
         }
       else
@@ -183,8 +183,8 @@
           ComplexNDArray z (dimz);
 
           F77_XFCN (zdotc3, ZDOTC3, (m, n, k,
-                                     x.data (), y.data (),
-                                     z.fortran_vec ()));
+                                     F77_CONST_DBLE_CMPLX_ARG (x.data ()), F77_CONST_DBLE_CMPLX_ARG (y.data ()),
+                                     F77_DBLE_CMPLX_ARG (z.fortran_vec ())));
           retval = z;
         }
     }
@@ -327,8 +327,8 @@
           FloatComplexNDArray z (dimz);
 
           F77_XFCN (cmatm3, CMATM3, (m, n, k, np,
-                                     x.data (), y.data (),
-                                     z.fortran_vec ()));
+                                     F77_CONST_CMPLX_ARG (x.data ()), F77_CONST_CMPLX_ARG (y.data ()),
+                                     F77_CMPLX_ARG (z.fortran_vec ())));
           retval = z;
         }
       else
@@ -338,8 +338,8 @@
           ComplexNDArray z (dimz);
 
           F77_XFCN (zmatm3, ZMATM3, (m, n, k, np,
-                                     x.data (), y.data (),
-                                     z.fortran_vec ()));
+                                     F77_CONST_DBLE_CMPLX_ARG (x.data ()), F77_CONST_DBLE_CMPLX_ARG (y.data ()),
+                                     F77_DBLE_CMPLX_ARG (z.fortran_vec ())));
           retval = z;
         }
     }
--- a/libinterp/corefcn/ordschur.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/libinterp/corefcn/ordschur.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -152,8 +152,8 @@
 
           F77_XFCN (ztrsen, ztrsen,
                     (F77_CONST_CHAR_ARG ("N"), F77_CONST_CHAR_ARG ("V"),
-                     sel.data (), n, S.fortran_vec (), n, U.fortran_vec (), n,
-                     w.fortran_vec (), m, cond1, cond2, work.fortran_vec (), n,
+                     sel.data (), n, F77_DBLE_CMPLX_ARG (S.fortran_vec ()), n, F77_DBLE_CMPLX_ARG (U.fortran_vec ()), n,
+                     F77_DBLE_CMPLX_ARG (w.fortran_vec ()), m, cond1, cond2, F77_DBLE_CMPLX_ARG (work.fortran_vec ()), n,
                      info));
 
           PREPARE_OUTPUT()
@@ -181,8 +181,8 @@
 
           F77_XFCN (ctrsen, ctrsen,
                     (F77_CONST_CHAR_ARG ("N"), F77_CONST_CHAR_ARG ("V"),
-                     sel.data (), n, S.fortran_vec (), n, U.fortran_vec (), n,
-                     w.fortran_vec (), m, cond1, cond2, work.fortran_vec (), n,
+                     sel.data (), n, F77_CMPLX_ARG (S.fortran_vec ()), n, F77_CMPLX_ARG (U.fortran_vec ()), n,
+                     F77_CMPLX_ARG (w.fortran_vec ()), m, cond1, cond2, F77_CMPLX_ARG (work.fortran_vec ()), n,
                      info));
 
           PREPARE_OUTPUT ()
--- a/libinterp/corefcn/qz.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/libinterp/corefcn/qz.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -546,7 +546,7 @@
 
       F77_XFCN (zggbal, ZGGBAL,
                 (F77_CONST_CHAR_ARG2 (&bal_job, 1),
-                 nn, caa.fortran_vec (), nn, cbb.fortran_vec (),
+                 nn, F77_DBLE_CMPLX_ARG (caa.fortran_vec ()), nn, F77_DBLE_CMPLX_ARG (cbb.fortran_vec ()),
                  nn, ilo, ihi, lscale.fortran_vec (),
                  rscale.fortran_vec (), work.fortran_vec (), info
                  F77_CHAR_ARG_LEN (1)));
@@ -623,9 +623,9 @@
       F77_XFCN (zgghrd, ZGGHRD,
                 (F77_CONST_CHAR_ARG2 (&compq, 1),
                  F77_CONST_CHAR_ARG2 (&compz, 1),
-                 nn, ilo, ihi, caa.fortran_vec (),
-                 nn, cbb.fortran_vec (), nn, CQ.fortran_vec (), nn,
-                 CZ.fortran_vec (), nn, info
+                 nn, ilo, ihi, F77_DBLE_CMPLX_ARG (caa.fortran_vec ()),
+                 nn, F77_DBLE_CMPLX_ARG (cbb.fortran_vec ()), nn, F77_DBLE_CMPLX_ARG (CQ.fortran_vec ()), nn,
+                 F77_DBLE_CMPLX_ARG (CZ.fortran_vec ()), nn, info
                  F77_CHAR_ARG_LEN (1)
                  F77_CHAR_ARG_LEN (1)));
 
@@ -636,12 +636,13 @@
                  F77_CONST_CHAR_ARG2 (&compq, 1),
                  F77_CONST_CHAR_ARG2 (&compz, 1),
                  nn, ilo, ihi,
-                 caa.fortran_vec (), nn,
-                 cbb.fortran_vec (),nn,
-                 xalpha.fortran_vec (), xbeta.fortran_vec (),
-                 CQ.fortran_vec (), nn,
-                 CZ.fortran_vec (), nn,
-                 cwork.fortran_vec (), nn, rwork.fortran_vec (), info
+                 F77_DBLE_CMPLX_ARG (caa.fortran_vec ()), nn,
+                 F77_DBLE_CMPLX_ARG (cbb.fortran_vec ()), nn,
+                 F77_DBLE_CMPLX_ARG (xalpha.fortran_vec ()),
+                 F77_DBLE_CMPLX_ARG (xbeta.fortran_vec ()),
+                 F77_DBLE_CMPLX_ARG (CQ.fortran_vec ()), nn,
+                 F77_DBLE_CMPLX_ARG (CZ.fortran_vec ()), nn,
+                 F77_DBLE_CMPLX_ARG (cwork.fortran_vec ()), nn, rwork.fortran_vec (), info
                  F77_CHAR_ARG_LEN (1)
                  F77_CHAR_ARG_LEN (1)
                  F77_CHAR_ARG_LEN (1)));
@@ -653,7 +654,7 @@
                     (F77_CONST_CHAR_ARG2 (&bal_job, 1),
                      F77_CONST_CHAR_ARG2 ("L", 1),
                      nn, ilo, ihi, lscale.data (), rscale.data (),
-                     nn, CQ.fortran_vec (), nn, info
+                     nn, F77_DBLE_CMPLX_ARG (CQ.fortran_vec ()), nn, info
                      F77_CHAR_ARG_LEN (1)
                      F77_CHAR_ARG_LEN (1)));
         }
@@ -665,7 +666,7 @@
                     (F77_CONST_CHAR_ARG2 (&bal_job, 1),
                      F77_CONST_CHAR_ARG2 ("R", 1),
                      nn, ilo, ihi, lscale.data (), rscale.data (),
-                     nn, CZ.fortran_vec (), nn, info
+                     nn, F77_DBLE_CMPLX_ARG (CZ.fortran_vec ()), nn, info
                      F77_CHAR_ARG_LEN (1)
                      F77_CHAR_ARG_LEN (1)));
         }
@@ -1052,9 +1053,9 @@
           F77_XFCN (ztgevc, ZTGEVC,
                     (F77_CONST_CHAR_ARG2 (&side, 1),
                      F77_CONST_CHAR_ARG2 (&howmny, 1),
-                     select, nn, caa.fortran_vec (), nn, cbb.fortran_vec (),
-                     nn, CVL.fortran_vec (), nn, CVR.fortran_vec (), nn, nn,
-                     m, cwork2.fortran_vec (), rwork2.fortran_vec (), info
+                     select, nn, F77_DBLE_CMPLX_ARG (caa.fortran_vec ()), nn, F77_DBLE_CMPLX_ARG (cbb.fortran_vec ()),
+                     nn, F77_DBLE_CMPLX_ARG (CVL.fortran_vec ()), nn, F77_DBLE_CMPLX_ARG (CVR.fortran_vec ()), nn, nn,
+                     m, F77_DBLE_CMPLX_ARG (cwork2.fortran_vec ()), rwork2.fortran_vec (), info
                      F77_CHAR_ARG_LEN (1)
                      F77_CHAR_ARG_LEN (1)));
         }
--- a/liboctave/array/CColVector.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/array/CColVector.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -334,8 +334,10 @@
           Complex *y = retval.fortran_vec ();
 
           F77_XFCN (zgemv, ZGEMV, (F77_CONST_CHAR_ARG2 ("N", 1),
-                                   nr, nc, 1.0, m.data (), nr,
-                                   a.data (), 1, 0.0, y, 1
+                                   nr, nc, 1.0,
+                                   F77_CONST_DBLE_CMPLX_ARG (m.data ()), nr,
+                                   F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, 0.0,
+                                   F77_DBLE_CMPLX_ARG (y), 1
                                    F77_CHAR_ARG_LEN (1)));
         }
     }
--- a/liboctave/array/CMatrix.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/array/CMatrix.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -119,12 +119,12 @@
   F77_RET_T
   F77_FUNC (xzdotu, XZDOTU) (const F77_INT&, const F77_DBLE_CMPLX*,
                              const F77_INT&, const F77_DBLE_CMPLX*,
-                             const F77_INT&, F77_DBLE_CMPLX&);
+                             const F77_INT&, F77_DBLE_CMPLX*);
 
   F77_RET_T
   F77_FUNC (xzdotc, XZDOTC) (const F77_INT&, const F77_DBLE_CMPLX*,
                              const F77_INT&, const F77_DBLE_CMPLX*,
-                             const F77_INT&, F77_DBLE_CMPLX&);
+                             const F77_INT&, F77_DBLE_CMPLX*);
 
   F77_RET_T
   F77_FUNC (zsyrk, ZSYRK) (F77_CONST_CHAR_ARG_DECL,
@@ -241,8 +241,8 @@
                              F77_CHAR_ARG_LEN_DECL);
 
   F77_RET_T
-  F77_FUNC (zlartg, ZLARTG) (const F77_DBLE_CMPLX&, const F77_DBLE_CMPLX&, F77_DBLE&,
-                             F77_DBLE_CMPLX&, F77_DBLE_CMPLX&);
+  F77_FUNC (zlartg, ZLARTG) (const F77_DBLE_CMPLX*, const F77_DBLE_CMPLX*, F77_DBLE&,
+                             F77_DBLE_CMPLX*, F77_DBLE_CMPLX*);
 
   F77_RET_T
   F77_FUNC (ztrsyl, ZTRSYL) (F77_CONST_CHAR_ARG_DECL,
@@ -974,11 +974,11 @@
   retval = *this;
   Complex *tmp_data = retval.fortran_vec ();
 
-  F77_XFCN (ztrtri, ZTRTRI, (F77_CONST_CHAR_ARG2 (&uplo, 1),
-                             F77_CONST_CHAR_ARG2 (&udiag, 1),
-                             nr, tmp_data, nr, info
-                             F77_CHAR_ARG_LEN (1)
-                             F77_CHAR_ARG_LEN (1)));
+  F77_XFCN (ztrtri, ZTRTRI,(F77_CONST_CHAR_ARG2 (&uplo, 1),
+                            F77_CONST_CHAR_ARG2 (&udiag, 1),
+                            nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, info
+                            F77_CHAR_ARG_LEN (1)
+                            F77_CHAR_ARG_LEN (1)));
 
   // Throw-away extra info LAPACK gives so as to not change output.
   rcon = 0.0;
@@ -995,8 +995,8 @@
       F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&job, 1),
                                  F77_CONST_CHAR_ARG2 (&uplo, 1),
                                  F77_CONST_CHAR_ARG2 (&udiag, 1),
-                                 nr, tmp_data, nr, rcon,
-                                 cwork, rwork, ztrcon_info
+                                 nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, rcon,
+                                 F77_DBLE_CMPLX_ARG (cwork), rwork, ztrcon_info
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)));
@@ -1034,8 +1034,8 @@
 
   // Query the optimum work array size.
 
-  F77_XFCN (zgetri, ZGETRI, (nc, tmp_data, nr, pipvt,
-                             z.fortran_vec (), lwork, info));
+  F77_XFCN (zgetri, ZGETRI, (nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt,
+                             F77_DBLE_CMPLX_ARG (z.fortran_vec ()), lwork, info));
 
   lwork = static_cast<octave_idx_type> (std::real (z(0)));
   lwork = (lwork <  2 *nc ? 2*nc : lwork);
@@ -1053,7 +1053,7 @@
   if (octave::math::isnan (anorm) || octave::math::isinf (anorm))
     info = -1;
   else
-    F77_XFCN (zgetrf, ZGETRF, (nc, nc, tmp_data, nr, pipvt, info));
+    F77_XFCN (zgetrf, ZGETRF, (nc, nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt, info));
 
   // Throw-away extra info LAPACK gives so as to not change output.
   rcon = 0.0;
@@ -1067,8 +1067,8 @@
       Array<double> rz (dim_vector (2 * nc, 1));
       double *prz = rz.fortran_vec ();
       F77_XFCN (zgecon, ZGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nc, tmp_data, nr, anorm,
-                                 rcon, pz, prz, zgecon_info
+                                 nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm,
+                                 rcon, F77_DBLE_CMPLX_ARG (pz), prz, zgecon_info
                                  F77_CHAR_ARG_LEN (1)));
 
       if (zgecon_info != 0)
@@ -1081,8 +1081,8 @@
     {
       octave_idx_type zgetri_info = 0;
 
-      F77_XFCN (zgetri, ZGETRI, (nc, tmp_data, nr, pipvt,
-                                 pz, lwork, zgetri_info));
+      F77_XFCN (zgetri, ZGETRI, (nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt,
+                                 F77_DBLE_CMPLX_ARG (pz), lwork, zgetri_info));
 
       if (zgetri_info != 0)
         info = -1;
@@ -1569,7 +1569,7 @@
 
       char job = 'L';
       F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
-                                 tmp_data, nr, info
+                                 F77_DBLE_CMPLX_ARG (tmp_data), nr, info
                                  F77_CHAR_ARG_LEN (1)));
 
       if (info != 0)
@@ -1586,8 +1586,8 @@
           double *prz = rz.fortran_vec ();
 
           F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, tmp_data, nr, anorm,
-                                     rcon, pz, prz, info
+                                     nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm,
+                                     rcon, F77_DBLE_CMPLX_ARG (pz), prz, info
                                      F77_CHAR_ARG_LEN (1)));
 
           if (info != 0)
@@ -1619,7 +1619,7 @@
       if (octave::math::isnan (anorm))
         info = -1;
       else
-        F77_XFCN (zgetrf, ZGETRF, (nr, nr, tmp_data, nr, pipvt, info));
+        F77_XFCN (zgetrf, ZGETRF, (nr, nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt, info));
 
       // Throw-away extra info LAPACK gives so as to not change output.
       rcon = 0.0;
@@ -1640,8 +1640,8 @@
               double *prz = rz.fortran_vec ();
 
               F77_XFCN (zgecon, ZGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                         nc, tmp_data, nr, anorm,
-                                         rcon, pz, prz, info
+                                         nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm,
+                                         rcon, F77_DBLE_CMPLX_ARG (pz), prz, info
                                          F77_CHAR_ARG_LEN (1)));
             }
 
@@ -1707,8 +1707,8 @@
           F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
                                      F77_CONST_CHAR_ARG2 (&uplo, 1),
                                      F77_CONST_CHAR_ARG2 (&dia, 1),
-                                     nr, tmp_data, nr, rcon,
-                                     pz, prz, info
+                                     nr, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr, rcon,
+                                     F77_DBLE_CMPLX_ARG (pz), prz, info
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)));
@@ -1735,8 +1735,8 @@
           F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
                                      F77_CONST_CHAR_ARG2 (&uplo, 1),
                                      F77_CONST_CHAR_ARG2 (&dia, 1),
-                                     nr, tmp_data, nr, rcon,
-                                     pz, prz, info
+                                     nr, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr, rcon,
+                                     F77_DBLE_CMPLX_ARG (pz), prz, info
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)));
@@ -1763,7 +1763,7 @@
                       row(static_cast<octave_idx_type>(0)).max();
 
               F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
-                                         tmp_data, nr, info
+                                         F77_DBLE_CMPLX_ARG (tmp_data), nr, info
                                          F77_CHAR_ARG_LEN (1)));
 
               if (info != 0)
@@ -1781,8 +1781,8 @@
                   double *prz = rz.fortran_vec ();
 
                   F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nr, tmp_data, nr, anorm,
-                                             rcon, pz, prz, info
+                                             nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm,
+                                             rcon, F77_DBLE_CMPLX_ARG (pz), prz, info
                                              F77_CHAR_ARG_LEN (1)));
 
                   if (info != 0)
@@ -1813,7 +1813,7 @@
               if (octave::math::isnan (anorm))
                 info = -1;
               else
-                F77_XFCN (zgetrf, ZGETRF, (nr, nr, tmp_data, nr, pipvt, info));
+                F77_XFCN (zgetrf, ZGETRF, (nr, nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt, info));
 
               if (info != 0)
                 {
@@ -1824,8 +1824,8 @@
                 {
                   char job = '1';
                   F77_XFCN (zgecon, ZGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nc, tmp_data, nr, anorm,
-                                             rcon, pz, prz, info
+                                             nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm,
+                                             rcon, F77_DBLE_CMPLX_ARG (pz), prz, info
                                              F77_CHAR_ARG_LEN (1)));
 
                   if (info != 0)
@@ -1884,8 +1884,8 @@
       F77_XFCN (ztrtrs, ZTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1),
                                  F77_CONST_CHAR_ARG2 (&trans, 1),
                                  F77_CONST_CHAR_ARG2 (&dia, 1),
-                                 nr, b_nc, tmp_data, nr,
-                                 result, nr, info
+                                 nr, b_nc, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr,
+                                 F77_DBLE_CMPLX_ARG (result), nr, info
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)));
@@ -1904,8 +1904,8 @@
           F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
                                      F77_CONST_CHAR_ARG2 (&uplo, 1),
                                      F77_CONST_CHAR_ARG2 (&dia, 1),
-                                     nr, tmp_data, nr, rcon,
-                                     pz, prz, info
+                                     nr, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr, rcon,
+                                     F77_DBLE_CMPLX_ARG (pz), prz, info
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)));
@@ -1974,8 +1974,8 @@
       F77_XFCN (ztrtrs, ZTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1),
                                  F77_CONST_CHAR_ARG2 (&trans, 1),
                                  F77_CONST_CHAR_ARG2 (&dia, 1),
-                                 nr, b_nc, tmp_data, nr,
-                                 result, nr, info
+                                 nr, b_nc, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr,
+                                 F77_DBLE_CMPLX_ARG (result), nr, info
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)));
@@ -1994,8 +1994,8 @@
           F77_XFCN (ztrcon, ZTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
                                      F77_CONST_CHAR_ARG2 (&uplo, 1),
                                      F77_CONST_CHAR_ARG2 (&dia, 1),
-                                     nr, tmp_data, nr, rcon,
-                                     pz, prz, info
+                                     nr, F77_CONST_DBLE_CMPLX_ARG (tmp_data), nr, rcon,
+                                     F77_DBLE_CMPLX_ARG (pz), prz, info
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)));
@@ -2055,7 +2055,7 @@
           anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max();
 
           F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
-                                     tmp_data, nr, info
+                                     F77_DBLE_CMPLX_ARG (tmp_data), nr, info
                                      F77_CHAR_ARG_LEN (1)));
 
           // Throw-away extra info LAPACK gives so as to not change output.
@@ -2077,8 +2077,8 @@
                   double *prz = rz.fortran_vec ();
 
                   F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nr, tmp_data, nr, anorm,
-                                             rcon, pz, prz, info
+                                             nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm,
+                                             rcon, F77_DBLE_CMPLX_ARG (pz), prz, info
                                              F77_CHAR_ARG_LEN (1)));
 
                   if (info != 0)
@@ -2105,8 +2105,8 @@
                   octave_idx_type b_nc = b.cols ();
 
                   F77_XFCN (zpotrs, ZPOTRS, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nr, b_nc, tmp_data, nr,
-                                             result, b.rows (), info
+                                             nr, b_nc, F77_DBLE_CMPLX_ARG (tmp_data), nr,
+                                             F77_DBLE_CMPLX_ARG (result), b.rows (), info
                                              F77_CHAR_ARG_LEN (1)));
                 }
               else
@@ -2142,7 +2142,7 @@
           if (octave::math::isnan (anorm) || octave::math::isinf (anorm))
             info = -2;
           else
-            F77_XFCN (zgetrf, ZGETRF, (nr, nr, tmp_data, nr, pipvt, info));
+            F77_XFCN (zgetrf, ZGETRF, (nr, nr, F77_DBLE_CMPLX_ARG (tmp_data), nr, pipvt, info));
 
           // Throw-away extra info LAPACK gives so as to not change output.
           rcon = 0.0;
@@ -2165,8 +2165,8 @@
                   // non-singular matrix.
                   char job = '1';
                   F77_XFCN (zgecon, ZGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nc, tmp_data, nr, anorm,
-                                             rcon, pz, prz, info
+                                             nc, F77_DBLE_CMPLX_ARG (tmp_data), nr, anorm,
+                                             rcon, F77_DBLE_CMPLX_ARG (pz), prz, info
                                              F77_CHAR_ARG_LEN (1)));
 
                   if (info != 0)
@@ -2194,8 +2194,8 @@
 
                   char job = 'N';
                   F77_XFCN (zgetrs, ZGETRS, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nr, b_nc, tmp_data, nr,
-                                             pipvt, result, b.rows (), info
+                                             nr, b_nc, F77_DBLE_CMPLX_ARG (tmp_data), nr,
+                                             pipvt, F77_DBLE_CMPLX_ARG (result), b.rows (), info
                                              F77_CHAR_ARG_LEN (1)));
                 }
               else
@@ -2642,8 +2642,8 @@
       Array<octave_idx_type> iwork (dim_vector (liwork, 1));
       octave_idx_type* piwork = iwork.fortran_vec ();
 
-      F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
-                                 ps, rcon, rank, work.fortran_vec (),
+      F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, F77_DBLE_CMPLX_ARG (tmp_data), m, F77_DBLE_CMPLX_ARG (pretval), maxmn,
+                                 ps, rcon, rank, F77_DBLE_CMPLX_ARG (work.fortran_vec ()),
                                  lwork, prwork, piwork, info));
 
       // The workspace query is broken in at least LAPACK 3.0.0
@@ -2679,9 +2679,9 @@
       lwork = static_cast<octave_idx_type> (std::real (work(0)));
       work.resize (dim_vector (lwork, 1));
 
-      F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval,
+      F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, F77_DBLE_CMPLX_ARG (tmp_data), m, F77_DBLE_CMPLX_ARG (pretval),
                                  maxmn, ps, rcon, rank,
-                                 work.fortran_vec (), lwork,
+                                 F77_DBLE_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  prwork, piwork, info));
 
       if (s.elem (0) == 0.0)
@@ -2830,8 +2830,8 @@
       Array<octave_idx_type> iwork (dim_vector (liwork, 1));
       octave_idx_type* piwork = iwork.fortran_vec ();
 
-      F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
-                                 ps, rcon, rank, work.fortran_vec (),
+      F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, F77_DBLE_CMPLX_ARG (tmp_data), m, F77_DBLE_CMPLX_ARG (pretval), maxmn,
+                                 ps, rcon, rank, F77_DBLE_CMPLX_ARG (work.fortran_vec ()),
                                  lwork, prwork, piwork, info));
 
       lwork = static_cast<octave_idx_type> (std::real (work(0)));
@@ -2839,9 +2839,9 @@
       rwork.resize (dim_vector (static_cast<octave_idx_type> (rwork(0)), 1));
       iwork.resize (dim_vector (iwork(0), 1));
 
-      F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval,
+      F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, F77_DBLE_CMPLX_ARG (tmp_data), m, F77_DBLE_CMPLX_ARG (pretval),
                                  maxmn, ps, rcon, rank,
-                                 work.fortran_vec (), lwork,
+                                 F77_DBLE_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  prwork, piwork, info));
 
       if (rank < minmn)
@@ -2890,8 +2890,8 @@
 
       F77_XFCN (zgemm, ZGEMM, (F77_CONST_CHAR_ARG2 ("N", 1),
                                F77_CONST_CHAR_ARG2 ("N", 1),
-                               len, a_len, 1, 1.0, v.data (), len,
-                               a.data (), 1, 0.0, c, len
+                               len, a_len, 1, 1.0, F77_CONST_DBLE_CMPLX_ARG (v.data ()), len,
+                               F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, 0.0, F77_DBLE_CMPLX_ARG (c), len
                                F77_CHAR_ARG_LEN (1)
                                F77_CHAR_ARG_LEN (1)));
     }
@@ -3469,7 +3469,7 @@
   double cc;
   Complex cs, temp_r;
 
-  F77_FUNC (zlartg, ZLARTG) (x, y, cc, cs, temp_r);
+  F77_FUNC (zlartg, ZLARTG) (F77_CONST_DBLE_CMPLX_ARG (&x), F77_CONST_DBLE_CMPLX_ARG (&y), cc, F77_DBLE_CMPLX_ARG (&cs), F77_DBLE_CMPLX_ARG (&temp_r));
 
   ComplexMatrix g (2, 2);
 
@@ -3518,8 +3518,8 @@
 
   F77_XFCN (ztrsyl, ZTRSYL, (F77_CONST_CHAR_ARG2 ("N", 1),
                              F77_CONST_CHAR_ARG2 ("N", 1),
-                             1, a_nr, b_nr, pa, a_nr, pb,
-                             b_nr, px, a_nr, scale, info
+                             1, a_nr, b_nr, F77_DBLE_CMPLX_ARG (pa), a_nr, F77_DBLE_CMPLX_ARG (pb),
+                             b_nr, F77_DBLE_CMPLX_ARG (px), a_nr, scale, info
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)));
 
@@ -3619,7 +3619,7 @@
           F77_XFCN (zherk, ZHERK, (F77_CONST_CHAR_ARG2 ("U", 1),
                                    F77_CONST_CHAR_ARG2 (&ctra, 1),
                                    a_nr, a_nc, 1.0,
-                                   a.data (), lda, 0.0, c, a_nr
+                                   F77_CONST_DBLE_CMPLX_ARG (a.data ()), lda, 0.0, F77_DBLE_CMPLX_ARG (c), a_nr
                                    F77_CHAR_ARG_LEN (1)
                                    F77_CHAR_ARG_LEN (1)));
           for (octave_idx_type j = 0; j < a_nr; j++)
@@ -3631,7 +3631,7 @@
           F77_XFCN (zsyrk, ZSYRK, (F77_CONST_CHAR_ARG2 ("U", 1),
                                    F77_CONST_CHAR_ARG2 (&ctra, 1),
                                    a_nr, a_nc, 1.0,
-                                   a.data (), lda, 0.0, c, a_nr
+                                   F77_CONST_DBLE_CMPLX_ARG (a.data ()), lda, 0.0, F77_DBLE_CMPLX_ARG (c), a_nr
                                    F77_CHAR_ARG_LEN (1)
                                    F77_CHAR_ARG_LEN (1)));
           for (octave_idx_type j = 0; j < a_nr; j++)
@@ -3655,31 +3655,31 @@
         {
           if (cja == cjb)
             {
-              F77_FUNC (xzdotu, XZDOTU) (a_nc, a.data (), 1, b.data (), 1,
-                                         *c);
+              F77_FUNC (xzdotu, XZDOTU) (a_nc, F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, F77_CONST_DBLE_CMPLX_ARG (b.data ()), 1,
+                                         F77_DBLE_CMPLX_ARG (c));
               if (cja) *c = std::conj (*c);
             }
           else if (cja)
-            F77_FUNC (xzdotc, XZDOTC) (a_nc, a.data (), 1, b.data (), 1,
-                                       *c);
+            F77_FUNC (xzdotc, XZDOTC) (a_nc, F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, F77_CONST_DBLE_CMPLX_ARG (b.data ()), 1,
+                                       F77_DBLE_CMPLX_ARG (c));
           else
-            F77_FUNC (xzdotc, XZDOTC) (a_nc, b.data (), 1, a.data (), 1,
-                                       *c);
+            F77_FUNC (xzdotc, XZDOTC) (a_nc, F77_CONST_DBLE_CMPLX_ARG (b.data ()), 1, F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1,
+                                       F77_DBLE_CMPLX_ARG (c));
         }
       else if (b_nc == 1 && ! cjb)
         {
           const char ctra = get_blas_trans_arg (tra, cja);
           F77_XFCN (zgemv, ZGEMV, (F77_CONST_CHAR_ARG2 (&ctra, 1),
-                                   lda, tda, 1.0,  a.data (), lda,
-                                   b.data (), 1, 0.0, c, 1
+                                   lda, tda, 1.0,  F77_CONST_DBLE_CMPLX_ARG (a.data ()), lda,
+                                   F77_CONST_DBLE_CMPLX_ARG (b.data ()), 1, 0.0, F77_DBLE_CMPLX_ARG (c), 1
                                    F77_CHAR_ARG_LEN (1)));
         }
       else if (a_nr == 1 && ! cja && ! cjb)
         {
           const char crevtrb = get_blas_trans_arg (! trb, cjb);
           F77_XFCN (zgemv, ZGEMV, (F77_CONST_CHAR_ARG2 (&crevtrb, 1),
-                                   ldb, tdb, 1.0,  b.data (), ldb,
-                                   a.data (), 1, 0.0, c, 1
+                                   ldb, tdb, 1.0,  F77_CONST_DBLE_CMPLX_ARG (b.data ()), ldb,
+                                   F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, 0.0, F77_DBLE_CMPLX_ARG (c), 1
                                    F77_CHAR_ARG_LEN (1)));
         }
       else
@@ -3688,8 +3688,8 @@
           const char ctrb = get_blas_trans_arg (trb, cjb);
           F77_XFCN (zgemm, ZGEMM, (F77_CONST_CHAR_ARG2 (&ctra, 1),
                                    F77_CONST_CHAR_ARG2 (&ctrb, 1),
-                                   a_nr, b_nc, a_nc, 1.0, a.data (),
-                                   lda, b.data (), ldb, 0.0, c, a_nr
+                                   a_nr, b_nc, a_nc, 1.0, F77_CONST_DBLE_CMPLX_ARG (a.data ()),
+                                   lda, F77_CONST_DBLE_CMPLX_ARG (b.data ()), ldb, 0.0, F77_DBLE_CMPLX_ARG (c), a_nr
                                    F77_CHAR_ARG_LEN (1)
                                    F77_CHAR_ARG_LEN (1)));
         }
--- a/liboctave/array/CRowVector.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/array/CRowVector.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -51,7 +51,7 @@
   F77_RET_T
   F77_FUNC (xzdotu, XZDOTU) (const F77_INT&, const F77_DBLE_CMPLX*,
                              const F77_INT&, const F77_DBLE_CMPLX*,
-                             const F77_INT&, F77_DBLE_CMPLX&);
+                             const F77_INT&, F77_DBLE_CMPLX*);
 }
 
 // Complex Row Vector class
@@ -321,8 +321,8 @@
       Complex *y = retval.fortran_vec ();
 
       F77_XFCN (zgemv, ZGEMV, (F77_CONST_CHAR_ARG2 ("T", 1),
-                               a_nr, a_nc, 1.0, a.data (),
-                               ld, v.data (), 1, 0.0, y, 1
+                               a_nr, a_nc, 1.0, F77_CONST_DBLE_CMPLX_ARG (a.data ()),
+                               ld, F77_CONST_DBLE_CMPLX_ARG (v.data ()), 1, 0.0, F77_DBLE_CMPLX_ARG (y), 1
                                F77_CHAR_ARG_LEN (1)));
     }
 
@@ -432,7 +432,7 @@
   if (len != a_len)
     err_nonconformant ("operator *", len, a_len);
   if (len != 0)
-    F77_FUNC (xzdotu, XZDOTU) (len, v.data (), 1, a.data (), 1, retval);
+    F77_FUNC (xzdotu, XZDOTU) (len, F77_CONST_DBLE_CMPLX_ARG (v.data ()), 1, F77_CONST_DBLE_CMPLX_ARG (a.data ()), 1, F77_DBLE_CMPLX_ARG (&retval));
 
   return retval;
 }
--- a/liboctave/array/CSparse.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/array/CSparse.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -3756,7 +3756,7 @@
           retval = ComplexMatrix (b);
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result,
+          F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (result),
                                    b.rows (), err));
 
           if (err != 0)
@@ -3813,7 +3813,7 @@
           retval = ComplexMatrix (b);
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result,
+          F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (result),
                                    b.rows (), err));
 
           if (err != 0)
@@ -3912,7 +3912,7 @@
                   }
             }
 
-          F77_XFCN (zgttrf, ZGTTRF, (nr, DL, D, DU, DU2, pipvt, err));
+          F77_XFCN (zgttrf, ZGTTRF, (nr, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (DU2), pipvt, err));
 
           if (err != 0)
             {
@@ -3948,8 +3948,8 @@
 
                   F77_XFCN (zgttrs, ZGTTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, 1, DL, D, DU, DU2, pipvt,
-                             work, b.rows (), err
+                             nr, 1, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (DU2), pipvt,
+                             F77_DBLE_CMPLX_ARG (work), b.rows (), err
                              F77_CHAR_ARG_LEN (1)));
 
                   // Count nonzeros in work vector and adjust
@@ -4056,7 +4056,7 @@
           retval = ComplexMatrix (b);
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result,
+          F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (result),
                                    b_nr, err));
 
           if (err != 0)
@@ -4114,7 +4114,7 @@
           retval = ComplexMatrix (b);
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result,
+          F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (result),
                                    b_nr, err));
 
           if (err != 0)
@@ -4211,7 +4211,7 @@
                   }
             }
 
-          F77_XFCN (zgttrf, ZGTTRF, (nr, DL, D, DU, DU2, pipvt, err));
+          F77_XFCN (zgttrf, ZGTTRF, (nr, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (DU2), pipvt, err));
 
           if (err != 0)
             {
@@ -4249,8 +4249,8 @@
 
                   F77_XFCN (zgttrs, ZGTTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, 1, DL, D, DU, DU2, pipvt,
-                             Bx, b_nr, err
+                             nr, 1, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (DU2), pipvt,
+                             F77_DBLE_CMPLX_ARG (Bx), b_nr, err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -4354,7 +4354,7 @@
 
           char job = 'L';
           F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, tmp_data, ldm, err
+                                     nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, err
                                      F77_CHAR_ARG_LEN (1)));
 
           if (err != 0)
@@ -4377,8 +4377,8 @@
 
                   F77_XFCN (zpbcon, ZPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, tmp_data, ldm,
-                             anorm, rcond, pz, piz, err
+                             nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -4411,8 +4411,8 @@
 
                   F77_XFCN (zpbtrs, ZPBTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, b_nc, tmp_data,
-                             ldm, result, b.rows (), err
+                             nr, n_lower, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
+                             ldm, F77_DBLE_CMPLX_ARG (result), b.rows (), err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -4466,7 +4466,7 @@
           Array<octave_idx_type> ipvt (dim_vector (nr, 1));
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
-          F77_XFCN (zgbtrf, ZGBTRF, (nr, nc, n_lower, n_upper, tmp_data,
+          F77_XFCN (zgbtrf, ZGBTRF, (nr, nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data),
                                      ldm, pipvt, err));
 
           // Throw-away extra info LAPACK gives so as to not
@@ -4496,8 +4496,8 @@
 
                   F77_XFCN (zgbcon, ZGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, tmp_data, ldm, pipvt,
-                             anorm, rcond, pz, piz, err
+                             nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -4531,8 +4531,8 @@
                   char job = 'N';
                   F77_XFCN (zgbtrs, ZGBTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, n_upper, b_nc, tmp_data,
-                             ldm, pipvt, result, b.rows (), err
+                             nr, n_lower, n_upper, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
+                             ldm, pipvt, F77_DBLE_CMPLX_ARG (result), b.rows (), err
                              F77_CHAR_ARG_LEN (1)));
                 }
             }
@@ -4600,7 +4600,7 @@
 
           char job = 'L';
           F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, tmp_data, ldm, err
+                                     nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, err
                                      F77_CHAR_ARG_LEN (1)));
 
           if (err != 0)
@@ -4621,8 +4621,8 @@
 
                   F77_XFCN (zpbcon, ZPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, tmp_data, ldm,
-                             anorm, rcond, pz, piz, err
+                             nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -4666,8 +4666,8 @@
 
                       F77_XFCN (zpbtrs, ZPBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, 1, tmp_data,
-                                 ldm, Bx, b_nr, err
+                                 nr, n_lower, 1, F77_DBLE_CMPLX_ARG (tmp_data),
+                                 ldm, F77_DBLE_CMPLX_ARG (Bx), b_nr, err
                                  F77_CHAR_ARG_LEN (1)));
 
                       if (err != 0)
@@ -4745,7 +4745,7 @@
           Array<octave_idx_type> ipvt (dim_vector (nr, 1));
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
-          F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data,
+          F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data),
                                      ldm, pipvt, err));
 
           if (err != 0)
@@ -4773,8 +4773,8 @@
 
                   F77_XFCN (zgbcon, ZGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, tmp_data, ldm, pipvt,
-                             anorm, rcond, pz, piz, err
+                             nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -4819,8 +4819,8 @@
 
                       F77_XFCN (zgbtrs, ZGBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, n_upper, 1, tmp_data,
-                                 ldm, pipvt, work, b.rows (), err
+                                 nr, n_lower, n_upper, 1, F77_DBLE_CMPLX_ARG (tmp_data),
+                                 ldm, pipvt, F77_DBLE_CMPLX_ARG (work), b.rows (), err
                                  F77_CHAR_ARG_LEN (1)));
 
                       // Count nonzeros in work vector and adjust
@@ -4914,7 +4914,7 @@
 
           char job = 'L';
           F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, tmp_data, ldm, err
+                                     nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, err
                                      F77_CHAR_ARG_LEN (1)));
 
           if (err != 0)
@@ -4937,8 +4937,8 @@
 
                   F77_XFCN (zpbcon, ZPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, tmp_data, ldm,
-                             anorm, rcond, pz, piz, err
+                             nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -4971,8 +4971,8 @@
 
                   F77_XFCN (zpbtrs, ZPBTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, b_nc, tmp_data,
-                             ldm, result, b_nr, err
+                             nr, n_lower, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
+                             ldm, F77_DBLE_CMPLX_ARG (result), b_nr, err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -5026,7 +5026,7 @@
           Array<octave_idx_type> ipvt (dim_vector (nr, 1));
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
-          F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data,
+          F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data),
                                      ldm, pipvt, err));
 
           if (err != 0)
@@ -5054,8 +5054,8 @@
 
                   F77_XFCN (zgbcon, ZGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, tmp_data, ldm, pipvt,
-                             anorm, rcond, pz, piz, err
+                             nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -5088,8 +5088,8 @@
 
                   F77_XFCN (zgbtrs, ZGBTRS,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, n_upper, b_nc, tmp_data,
-                             ldm, pipvt, result, b.rows (), err
+                             nr, n_lower, n_upper, b_nc, F77_DBLE_CMPLX_ARG (tmp_data),
+                             ldm, pipvt, F77_DBLE_CMPLX_ARG (result), b.rows (), err
                              F77_CHAR_ARG_LEN (1)));
                 }
             }
@@ -5157,7 +5157,7 @@
 
           char job = 'L';
           F77_XFCN (zpbtrf, ZPBTRF, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, n_lower, tmp_data, ldm, err
+                                     nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm, err
                                      F77_CHAR_ARG_LEN (1)));
 
           if (err != 0)
@@ -5181,8 +5181,8 @@
 
                   F77_XFCN (zpbcon, ZPBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nr, n_lower, tmp_data, ldm,
-                             anorm, rcond, pz, piz, err
+                             nr, n_lower, F77_DBLE_CMPLX_ARG (tmp_data), ldm,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -5227,8 +5227,8 @@
 
                       F77_XFCN (zpbtrs, ZPBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, 1, tmp_data,
-                                 ldm, Bx, b_nr, err
+                                 nr, n_lower, 1, F77_DBLE_CMPLX_ARG (tmp_data),
+                                 ldm, F77_DBLE_CMPLX_ARG (Bx), b_nr, err
                                  F77_CHAR_ARG_LEN (1)));
 
                       if (err != 0)
@@ -5310,7 +5310,7 @@
           Array<octave_idx_type> ipvt (dim_vector (nr, 1));
           octave_idx_type *pipvt = ipvt.fortran_vec ();
 
-          F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, tmp_data,
+          F77_XFCN (zgbtrf, ZGBTRF, (nr, nr, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data),
                                      ldm, pipvt, err));
 
           if (err != 0)
@@ -5338,8 +5338,8 @@
 
                   F77_XFCN (zgbcon, ZGBCON,
                             (F77_CONST_CHAR_ARG2 (&job, 1),
-                             nc, n_lower, n_upper, tmp_data, ldm, pipvt,
-                             anorm, rcond, pz, piz, err
+                             nc, n_lower, n_upper, F77_DBLE_CMPLX_ARG (tmp_data), ldm, pipvt,
+                             anorm, rcond, F77_DBLE_CMPLX_ARG (pz), piz, err
                              F77_CHAR_ARG_LEN (1)));
 
                   if (err != 0)
@@ -5385,8 +5385,8 @@
 
                       F77_XFCN (zgbtrs, ZGBTRS,
                                 (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nr, n_lower, n_upper, 1, tmp_data,
-                                 ldm, pipvt, Bx, b.rows (), err
+                                 nr, n_lower, n_upper, 1, F77_DBLE_CMPLX_ARG (tmp_data),
+                                 ldm, pipvt, F77_DBLE_CMPLX_ARG (Bx), b.rows (), err
                                  F77_CHAR_ARG_LEN (1)));
 
                       // Count nonzeros in work vector and adjust
--- a/liboctave/array/dSparse.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/array/dSparse.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -4146,7 +4146,7 @@
           retval = b;
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, DL, result,
+          F77_XFCN (zptsv, ZPTSV, (nr, b_nc, D, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (result),
                                    b_nr, err));
 
           if (err != 0)
@@ -4204,7 +4204,7 @@
           retval = b;
           Complex *result = retval.fortran_vec ();
 
-          F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, DL, D, DU, result,
+          F77_XFCN (zgtsv, ZGTSV, (nr, b_nc, F77_DBLE_CMPLX_ARG (DL), F77_DBLE_CMPLX_ARG (D), F77_DBLE_CMPLX_ARG (DU), F77_DBLE_CMPLX_ARG (result),
                                    b_nr, err));
 
           if (err != 0)
--- a/liboctave/array/fCColVector.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/array/fCColVector.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -337,8 +337,8 @@
           FloatComplex *y = retval.fortran_vec ();
 
           F77_XFCN (cgemv, CGEMV, (F77_CONST_CHAR_ARG2 ("N", 1),
-                                   nr, nc, 1.0f, m.data (), nr,
-                                   a.data (), 1, 0.0f, y, 1
+                                   nr, nc, 1.0f, F77_CONST_CMPLX_ARG (m.data ()), nr,
+                                   F77_CONST_CMPLX_ARG (a.data ()), 1, 0.0f, F77_CMPLX_ARG (y), 1
                                    F77_CHAR_ARG_LEN (1)));
         }
     }
--- a/liboctave/array/fCMatrix.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/array/fCMatrix.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -118,12 +118,12 @@
   F77_RET_T
   F77_FUNC (xcdotu, XCDOTU) (const F77_INT&, const F77_CMPLX*,
                              const F77_INT&, const F77_CMPLX*,
-                             const F77_INT&, F77_CMPLX&);
+                             const F77_INT&, F77_CMPLX*);
 
   F77_RET_T
   F77_FUNC (xcdotc, XCDOTC) (const F77_INT&, const F77_CMPLX*,
                              const F77_INT&, const F77_CMPLX*,
-                             const F77_INT&, F77_CMPLX&);
+                             const F77_INT&, F77_CMPLX*);
 
   F77_RET_T
   F77_FUNC (csyrk, CSYRK) (F77_CONST_CHAR_ARG_DECL,
@@ -241,8 +241,8 @@
                              F77_CHAR_ARG_LEN_DECL);
 
   F77_RET_T
-  F77_FUNC (clartg, CLARTG) (const F77_CMPLX&, const F77_CMPLX&,
-                             F77_REAL&, F77_CMPLX&, F77_CMPLX&);
+  F77_FUNC (clartg, CLARTG) (const F77_CMPLX*, const F77_CMPLX*,
+                             F77_REAL&, F77_CMPLX*, F77_CMPLX*);
 
   F77_RET_T
   F77_FUNC (ctrsyl, CTRSYL) (F77_CONST_CHAR_ARG_DECL,
@@ -981,7 +981,7 @@
 
   F77_XFCN (ctrtri, CTRTRI, (F77_CONST_CHAR_ARG2 (&uplo, 1),
                              F77_CONST_CHAR_ARG2 (&udiag, 1),
-                             nr, tmp_data, nr, info
+                             nr, F77_CMPLX_ARG (tmp_data), nr, info
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)));
 
@@ -1000,8 +1000,8 @@
       F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&job, 1),
                                  F77_CONST_CHAR_ARG2 (&uplo, 1),
                                  F77_CONST_CHAR_ARG2 (&udiag, 1),
-                                 nr, tmp_data, nr, rcon,
-                                 cwork, rwork, ztrcon_info
+                                 nr, F77_CMPLX_ARG (tmp_data), nr, rcon,
+                                 F77_CMPLX_ARG (cwork), rwork, ztrcon_info
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)));
@@ -1039,8 +1039,8 @@
 
   // Query the optimum work array size.
 
-  F77_XFCN (cgetri, CGETRI, (nc, tmp_data, nr, pipvt,
-                             z.fortran_vec (), lwork, info));
+  F77_XFCN (cgetri, CGETRI, (nc, F77_CMPLX_ARG (tmp_data), nr, pipvt,
+                             F77_CMPLX_ARG (z.fortran_vec ()), lwork, info));
 
   lwork = static_cast<octave_idx_type> (std::real (z(0)));
   lwork = (lwork <  2 *nc ? 2*nc : lwork);
@@ -1058,7 +1058,7 @@
   if (octave::math::isnan (anorm) || octave::math::isinf (anorm))
     info = -1;
   else
-    F77_XFCN (cgetrf, CGETRF, (nc, nc, tmp_data, nr, pipvt, info));
+    F77_XFCN (cgetrf, CGETRF, (nc, nc, F77_CMPLX_ARG (tmp_data), nr, pipvt, info));
 
   // Throw-away extra info LAPACK gives so as to not change output.
   rcon = 0.0;
@@ -1072,8 +1072,8 @@
       Array<float> rz (dim_vector (2 * nc, 1));
       float *prz = rz.fortran_vec ();
       F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nc, tmp_data, nr, anorm,
-                                 rcon, pz, prz, zgecon_info
+                                 nc, F77_CMPLX_ARG (tmp_data), nr, anorm,
+                                 rcon, F77_CMPLX_ARG (pz), prz, zgecon_info
                                  F77_CHAR_ARG_LEN (1)));
 
       if (zgecon_info != 0)
@@ -1086,8 +1086,8 @@
     {
       octave_idx_type zgetri_info = 0;
 
-      F77_XFCN (cgetri, CGETRI, (nc, tmp_data, nr, pipvt,
-                                 pz, lwork, zgetri_info));
+      F77_XFCN (cgetri, CGETRI, (nc, F77_CMPLX_ARG (tmp_data), nr, pipvt,
+                                 F77_CMPLX_ARG (pz), lwork, zgetri_info));
 
       if (zgetri_info != 0)
         info = -1;
@@ -1569,7 +1569,7 @@
 
       char job = 'L';
       F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
-                                 tmp_data, nr, info
+                                 F77_CMPLX_ARG (tmp_data), nr, info
                                  F77_CHAR_ARG_LEN (1)));
 
       if (info != 0)
@@ -1586,8 +1586,8 @@
           float *prz = rz.fortran_vec ();
 
           F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                     nr, tmp_data, nr, anorm,
-                                     rcon, pz, prz, info
+                                     nr, F77_CMPLX_ARG (tmp_data), nr, anorm,
+                                     rcon, F77_CMPLX_ARG (pz), prz, info
                                      F77_CHAR_ARG_LEN (1)));
 
           if (info != 0)
@@ -1619,7 +1619,7 @@
       if (octave::math::isnan (anorm))
         info = -1;
       else
-        F77_XFCN (cgetrf, CGETRF, (nr, nr, tmp_data, nr, pipvt, info));
+        F77_XFCN (cgetrf, CGETRF, (nr, nr, F77_CMPLX_ARG (tmp_data), nr, pipvt, info));
 
       // Throw-away extra info LAPACK gives so as to not change output.
       rcon = 0.0;
@@ -1640,8 +1640,8 @@
               float *prz = rz.fortran_vec ();
 
               F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                         nc, tmp_data, nr, anorm,
-                                         rcon, pz, prz, info
+                                         nc, F77_CMPLX_ARG (tmp_data), nr, anorm,
+                                         rcon, F77_CMPLX_ARG (pz), prz, info
                                          F77_CHAR_ARG_LEN (1)));
             }
 
@@ -1707,8 +1707,8 @@
           F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
                                      F77_CONST_CHAR_ARG2 (&uplo, 1),
                                      F77_CONST_CHAR_ARG2 (&dia, 1),
-                                     nr, tmp_data, nr, rcon,
-                                     pz, prz, info
+                                     nr, F77_CONST_CMPLX_ARG (tmp_data), nr, rcon,
+                                     F77_CMPLX_ARG (pz), prz, info
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)));
@@ -1735,8 +1735,8 @@
           F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
                                      F77_CONST_CHAR_ARG2 (&uplo, 1),
                                      F77_CONST_CHAR_ARG2 (&dia, 1),
-                                     nr, tmp_data, nr, rcon,
-                                     pz, prz, info
+                                     nr, F77_CONST_CMPLX_ARG (tmp_data), nr, rcon,
+                                     F77_CMPLX_ARG (pz), prz, info
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)
                                      F77_CHAR_ARG_LEN (1)));
@@ -1763,7 +1763,7 @@
                       row(static_cast<octave_idx_type>(0)).max();
 
               F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
-                                         tmp_data, nr, info
+                                         F77_CMPLX_ARG (tmp_data), nr, info
                                          F77_CHAR_ARG_LEN (1)));
 
               if (info != 0)
@@ -1781,8 +1781,8 @@
                   float *prz = rz.fortran_vec ();
 
                   F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nr, tmp_data, nr, anorm,
-                                             rcon, pz, prz, info
+                                             nr, F77_CMPLX_ARG (tmp_data), nr, anorm,
+                                             rcon, F77_CMPLX_ARG (pz), prz, info
                                              F77_CHAR_ARG_LEN (1)));
 
                   if (info != 0)
@@ -1813,7 +1813,7 @@
               if (octave::math::isnan (anorm))
                 info = -1;
               else
-                F77_XFCN (cgetrf, CGETRF, (nr, nr, tmp_data, nr, pipvt, info));
+                F77_XFCN (cgetrf, CGETRF, (nr, nr, F77_CMPLX_ARG (tmp_data), nr, pipvt, info));
 
               if (info != 0)
                 {
@@ -1824,8 +1824,8 @@
                 {
                   char job = '1';
                   F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nc, tmp_data, nr, anorm,
-                                             rcon, pz, prz, info
+                                             nc, F77_CMPLX_ARG (tmp_data), nr, anorm,
+                                             rcon, F77_CMPLX_ARG (pz), prz, info
                                              F77_CHAR_ARG_LEN (1)));
 
                   if (info != 0)
@@ -1884,8 +1884,8 @@
               F77_XFCN (ctrtrs, CTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1),
                                          F77_CONST_CHAR_ARG2 (&trans, 1),
                                          F77_CONST_CHAR_ARG2 (&dia, 1),
-                                         nr, b_nc, tmp_data, nr,
-                                         result, nr, info
+                                         nr, b_nc, F77_CONST_CMPLX_ARG (tmp_data), nr,
+                                         F77_CMPLX_ARG (result), nr, info
                                          F77_CHAR_ARG_LEN (1)
                                          F77_CHAR_ARG_LEN (1)
                                          F77_CHAR_ARG_LEN (1)));
@@ -1904,8 +1904,8 @@
                   F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
                                              F77_CONST_CHAR_ARG2 (&uplo, 1),
                                              F77_CONST_CHAR_ARG2 (&dia, 1),
-                                             nr, tmp_data, nr, rcon,
-                                             pz, prz, info
+                                             nr, F77_CONST_CMPLX_ARG (tmp_data), nr, rcon,
+                                             F77_CMPLX_ARG (pz), prz, info
                                              F77_CHAR_ARG_LEN (1)
                                              F77_CHAR_ARG_LEN (1)
                                              F77_CHAR_ARG_LEN (1)));
@@ -1978,8 +1978,8 @@
               F77_XFCN (ctrtrs, CTRTRS, (F77_CONST_CHAR_ARG2 (&uplo, 1),
                                          F77_CONST_CHAR_ARG2 (&trans, 1),
                                          F77_CONST_CHAR_ARG2 (&dia, 1),
-                                         nr, b_nc, tmp_data, nr,
-                                         result, nr, info
+                                         nr, b_nc, F77_CONST_CMPLX_ARG (tmp_data), nr,
+                                         F77_CMPLX_ARG (result), nr, info
                                          F77_CHAR_ARG_LEN (1)
                                          F77_CHAR_ARG_LEN (1)
                                          F77_CHAR_ARG_LEN (1)));
@@ -1998,8 +1998,8 @@
                   F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1),
                                              F77_CONST_CHAR_ARG2 (&uplo, 1),
                                              F77_CONST_CHAR_ARG2 (&dia, 1),
-                                             nr, tmp_data, nr, rcon,
-                                             pz, prz, info
+                                             nr, F77_CONST_CMPLX_ARG (tmp_data), nr, rcon,
+                                             F77_CMPLX_ARG (pz), prz, info
                                              F77_CHAR_ARG_LEN (1)
                                              F77_CHAR_ARG_LEN (1)
                                              F77_CHAR_ARG_LEN (1)));
@@ -2063,7 +2063,7 @@
           anorm = atmp.abs().sum().row(static_cast<octave_idx_type>(0)).max();
 
           F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr,
-                                     tmp_data, nr, info
+                                     F77_CMPLX_ARG (tmp_data), nr, info
                                      F77_CHAR_ARG_LEN (1)));
 
           // Throw-away extra info LAPACK gives so as to not change output.
@@ -2085,8 +2085,8 @@
                   float *prz = rz.fortran_vec ();
 
                   F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nr, tmp_data, nr, anorm,
-                                             rcon, pz, prz, info
+                                             nr, F77_CMPLX_ARG (tmp_data), nr, anorm,
+                                             rcon, F77_CMPLX_ARG (pz), prz, info
                                              F77_CHAR_ARG_LEN (1)));
 
                   if (info != 0)
@@ -2113,8 +2113,8 @@
                   octave_idx_type b_nc = b.cols ();
 
                   F77_XFCN (cpotrs, CPOTRS, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nr, b_nc, tmp_data, nr,
-                                             result, b.rows (), info
+                                             nr, b_nc, F77_CMPLX_ARG (tmp_data), nr,
+                                             F77_CMPLX_ARG (result), b.rows (), info
                                              F77_CHAR_ARG_LEN (1)));
                 }
               else
@@ -2150,7 +2150,7 @@
           if (octave::math::isnan (anorm) || octave::math::isinf (anorm))
             info = -2;
           else
-            F77_XFCN (cgetrf, CGETRF, (nr, nr, tmp_data, nr, pipvt, info));
+            F77_XFCN (cgetrf, CGETRF, (nr, nr, F77_CMPLX_ARG (tmp_data), nr, pipvt, info));
 
           // Throw-away extra info LAPACK gives so as to not change output.
           rcon = 0.0;
@@ -2173,8 +2173,8 @@
                   // non-singular matrix.
                   char job = '1';
                   F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nc, tmp_data, nr, anorm,
-                                             rcon, pz, prz, info
+                                             nc, F77_CMPLX_ARG (tmp_data), nr, anorm,
+                                             rcon, F77_CMPLX_ARG (pz), prz, info
                                              F77_CHAR_ARG_LEN (1)));
 
                   if (info != 0)
@@ -2202,8 +2202,8 @@
 
                   char job = 'N';
                   F77_XFCN (cgetrs, CGETRS, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                             nr, b_nc, tmp_data, nr,
-                                             pipvt, result, b.rows (), info
+                                             nr, b_nc, F77_CMPLX_ARG (tmp_data), nr,
+                                             pipvt, F77_CMPLX_ARG (result), b.rows (), info
                                              F77_CHAR_ARG_LEN (1)));
                 }
               else
@@ -2662,8 +2662,8 @@
       Array<octave_idx_type> iwork (dim_vector (liwork, 1));
       octave_idx_type* piwork = iwork.fortran_vec ();
 
-      F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
-                                 ps, rcon, rank, work.fortran_vec (),
+      F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, F77_CMPLX_ARG (tmp_data), m, F77_CMPLX_ARG (pretval), maxmn,
+                                 ps, rcon, rank, F77_CMPLX_ARG (work.fortran_vec ()),
                                  lwork, prwork, piwork, info));
 
       // The workspace query is broken in at least LAPACK 3.0.0
@@ -2699,9 +2699,9 @@
       lwork = static_cast<octave_idx_type> (std::real (work(0)));
       work.resize (dim_vector (lwork, 1));
 
-      F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval,
+      F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, F77_CMPLX_ARG (tmp_data), m, F77_CMPLX_ARG (pretval),
                                  maxmn, ps, rcon, rank,
-                                 work.fortran_vec (), lwork,
+                                 F77_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  prwork, piwork, info));
 
       if (s.elem (0) == 0.0)
@@ -2853,8 +2853,8 @@
       Array<octave_idx_type> iwork (dim_vector (liwork, 1));
       octave_idx_type* piwork = iwork.fortran_vec ();
 
-      F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
-                                 ps, rcon, rank, work.fortran_vec (),
+      F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, F77_CMPLX_ARG (tmp_data), m, F77_CMPLX_ARG (pretval), maxmn,
+                                 ps, rcon, rank, F77_CMPLX_ARG (work.fortran_vec ()),
                                  lwork, prwork, piwork, info));
 
       lwork = static_cast<octave_idx_type> (std::real (work(0)));
@@ -2862,9 +2862,9 @@
       rwork.resize (dim_vector (static_cast<octave_idx_type> (rwork(0)), 1));
       iwork.resize (dim_vector (iwork(0), 1));
 
-      F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval,
+      F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, F77_CMPLX_ARG (tmp_data), m, F77_CMPLX_ARG (pretval),
                                  maxmn, ps, rcon, rank,
-                                 work.fortran_vec (), lwork,
+                                 F77_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  prwork, piwork, info));
 
       if (rank < minmn)
@@ -2913,8 +2913,8 @@
 
       F77_XFCN (cgemm, CGEMM, (F77_CONST_CHAR_ARG2 ("N", 1),
                                F77_CONST_CHAR_ARG2 ("N", 1),
-                               len, a_len, 1, 1.0, v.data (), len,
-                               a.data (), 1, 0.0, c, len
+                               len, a_len, 1, 1.0, F77_CONST_CMPLX_ARG (v.data ()), len,
+                               F77_CONST_CMPLX_ARG (a.data ()), 1, 0.0, F77_CMPLX_ARG (c), len
                                F77_CHAR_ARG_LEN (1)
                                F77_CHAR_ARG_LEN (1)));
     }
@@ -3495,7 +3495,7 @@
   float cc;
   FloatComplex cs, temp_r;
 
-  F77_FUNC (clartg, CLARTG) (x, y, cc, cs, temp_r);
+  F77_FUNC (clartg, CLARTG) (F77_CONST_CMPLX_ARG (&x), F77_CONST_CMPLX_ARG (&y), cc, F77_CMPLX_ARG (&cs), F77_CMPLX_ARG (&temp_r));
 
   FloatComplexMatrix g (2, 2);
 
@@ -3546,8 +3546,8 @@
 
   F77_XFCN (ctrsyl, CTRSYL, (F77_CONST_CHAR_ARG2 ("N", 1),
                              F77_CONST_CHAR_ARG2 ("N", 1),
-                             1, a_nr, b_nr, pa, a_nr, pb,
-                             b_nr, px, a_nr, scale, info
+                             1, a_nr, b_nr, F77_CMPLX_ARG (pa), a_nr, F77_CMPLX_ARG (pb),
+                             b_nr, F77_CMPLX_ARG (px), a_nr, scale, info
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)));
 
@@ -3647,7 +3647,7 @@
           F77_XFCN (cherk, CHERK, (F77_CONST_CHAR_ARG2 ("U", 1),
                                    F77_CONST_CHAR_ARG2 (&ctra, 1),
                                    a_nr, a_nc, 1.0,
-                                   a.data (), lda, 0.0, c, a_nr
+                                   F77_CONST_CMPLX_ARG (a.data ()), lda, 0.0, F77_CMPLX_ARG (c), a_nr
                                    F77_CHAR_ARG_LEN (1)
                                    F77_CHAR_ARG_LEN (1)));
           for (octave_idx_type j = 0; j < a_nr; j++)
@@ -3659,7 +3659,7 @@
           F77_XFCN (csyrk, CSYRK, (F77_CONST_CHAR_ARG2 ("U", 1),
                                    F77_CONST_CHAR_ARG2 (&ctra, 1),
                                    a_nr, a_nc, 1.0,
-                                   a.data (), lda, 0.0, c, a_nr
+                                   F77_CONST_CMPLX_ARG (a.data ()), lda, 0.0, F77_CMPLX_ARG (c), a_nr
                                    F77_CHAR_ARG_LEN (1)
                                    F77_CHAR_ARG_LEN (1)));
           for (octave_idx_type j = 0; j < a_nr; j++)
@@ -3683,31 +3683,31 @@
         {
           if (cja == cjb)
             {
-              F77_FUNC (xcdotu, XCDOTU) (a_nc, a.data (), 1, b.data (), 1,
-                                         *c);
+              F77_FUNC (xcdotu, XCDOTU) (a_nc, F77_CONST_CMPLX_ARG (a.data ()), 1, F77_CONST_CMPLX_ARG (b.data ()), 1,
+                                         F77_CMPLX_ARG (&c));
               if (cja) *c = std::conj (*c);
             }
           else if (cja)
-            F77_FUNC (xcdotc, XCDOTC) (a_nc, a.data (), 1, b.data (), 1,
-                                       *c);
+            F77_FUNC (xcdotc, XCDOTC) (a_nc, F77_CONST_CMPLX_ARG (a.data ()), 1, F77_CONST_CMPLX_ARG (b.data ()), 1,
+                                       F77_CMPLX_ARG (&c));
           else
-            F77_FUNC (xcdotc, XCDOTC) (a_nc, b.data (), 1, a.data (), 1,
-                                       *c);
+            F77_FUNC (xcdotc, XCDOTC) (a_nc, F77_CONST_CMPLX_ARG (b.data ()), 1, F77_CONST_CMPLX_ARG (a.data ()), 1,
+                                       F77_CMPLX_ARG (&c));
         }
       else if (b_nc == 1 && ! cjb)
         {
           const char ctra = get_blas_trans_arg (tra, cja);
           F77_XFCN (cgemv, CGEMV, (F77_CONST_CHAR_ARG2 (&ctra, 1),
-                                   lda, tda, 1.0,  a.data (), lda,
-                                   b.data (), 1, 0.0, c, 1
+                                   lda, tda, 1.0,  F77_CONST_CMPLX_ARG (a.data ()), lda,
+                                   F77_CONST_CMPLX_ARG (b.data ()), 1, 0.0, F77_CMPLX_ARG (c), 1
                                    F77_CHAR_ARG_LEN (1)));
         }
       else if (a_nr == 1 && ! cja && ! cjb)
         {
           const char crevtrb = get_blas_trans_arg (! trb, cjb);
           F77_XFCN (cgemv, CGEMV, (F77_CONST_CHAR_ARG2 (&crevtrb, 1),
-                                   ldb, tdb, 1.0,  b.data (), ldb,
-                                   a.data (), 1, 0.0, c, 1
+                                   ldb, tdb, 1.0,  F77_CONST_CMPLX_ARG (b.data ()), ldb,
+                                   F77_CONST_CMPLX_ARG (a.data ()), 1, 0.0, F77_CMPLX_ARG (c), 1
                                    F77_CHAR_ARG_LEN (1)));
         }
       else
@@ -3716,8 +3716,8 @@
           const char ctrb = get_blas_trans_arg (trb, cjb);
           F77_XFCN (cgemm, CGEMM, (F77_CONST_CHAR_ARG2 (&ctra, 1),
                                    F77_CONST_CHAR_ARG2 (&ctrb, 1),
-                                   a_nr, b_nc, a_nc, 1.0, a.data (),
-                                   lda, b.data (), ldb, 0.0, c, a_nr
+                                   a_nr, b_nc, a_nc, 1.0, F77_CONST_CMPLX_ARG (a.data ()),
+                                   lda, F77_CONST_CMPLX_ARG (b.data ()), ldb, 0.0, F77_CMPLX_ARG (c), a_nr
                                    F77_CHAR_ARG_LEN (1)
                                    F77_CHAR_ARG_LEN (1)));
         }
--- a/liboctave/array/fCRowVector.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/array/fCRowVector.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -51,7 +51,7 @@
   F77_RET_T
   F77_FUNC (xcdotu, XCDOTU) (const F77_INT&, const F77_CMPLX*,
                              const F77_INT&, const F77_CMPLX*,
-                             const F77_INT&, F77_CMPLX&);
+                             const F77_INT&, F77_CMPLX*);
 }
 
 // FloatComplex Row Vector class
@@ -322,8 +322,8 @@
       FloatComplex *y = retval.fortran_vec ();
 
       F77_XFCN (cgemv, CGEMV, (F77_CONST_CHAR_ARG2 ("T", 1),
-                               a_nr, a_nc, 1.0, a.data (),
-                               ld, v.data (), 1, 0.0, y, 1
+                               a_nr, a_nc, 1.0, F77_CONST_CMPLX_ARG (a.data ()),
+                               ld, F77_CONST_CMPLX_ARG (v.data ()), 1, 0.0, F77_CMPLX_ARG (y), 1
                                F77_CHAR_ARG_LEN (1)));
     }
 
@@ -434,7 +434,7 @@
     err_nonconformant ("operator *", len, a_len);
 
   if (len != 0)
-    F77_FUNC (xcdotu, XCDOTU) (len, v.data (), 1, a.data (), 1, retval);
+    F77_FUNC (xcdotu, XCDOTU) (len, F77_CONST_CMPLX_ARG (v.data ()), 1, F77_CONST_CMPLX_ARG (a.data ()), 1, F77_CMPLX_ARG (&retval));
 
   return retval;
 }
--- a/liboctave/cruft/misc/f77-fcn.h	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/cruft/misc/f77-fcn.h	Mon Jul 18 09:38:57 2016 -0400
@@ -330,12 +330,24 @@
 
 #define F77_DBLE double
 #define F77_REAL float
-#define F77_DBLE_CMPLX Complex
-#define F77_CMPLX FloatComplex
+#define F77_DBLE_CMPLX double _Complex
+#define F77_CMPLX float _Complex
 #define F77_INT octave_idx_type
 #define F77_INT4 int32_t
 #define F77_LOGICAL octave_idx_type
 
+#define F77_CMPLX_ARG(x) \
+  reinterpret_cast<float _Complex *> (x)
+
+#define F77_CONST_CMPLX_ARG(x) \
+  reinterpret_cast<const float _Complex *> (x)
+
+#define F77_DBLE_CMPLX_ARG(x) \
+  reinterpret_cast<double _Complex *> (x)
+
+#define F77_CONST_DBLE_CMPLX_ARG(x) \
+  reinterpret_cast<const double _Complex *> (x)
+
 /* Build a C string local variable CS from the Fortran string parameter S
    declared as F77_CHAR_ARG_DEF(s, len) or F77_CONST_CHAR_ARG_DEF(s, len).
    The string will be cleaned up at the end of the current block.
--- a/liboctave/numeric/EIG.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/EIG.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -320,8 +320,8 @@
 
   F77_XFCN (zgeev, ZGEEV, (F77_CONST_CHAR_ARG2 ("N", 1),
                            F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
-                           n, tmp_data, n, pw, dummy, idummy,
-                           pv, n, &dummy_work, lwork, prwork, info
+                           n, F77_DBLE_CMPLX_ARG (tmp_data), n, F77_DBLE_CMPLX_ARG (pw), F77_DBLE_CMPLX_ARG (dummy), idummy,
+                           F77_DBLE_CMPLX_ARG (pv), n, F77_DBLE_CMPLX_ARG (&dummy_work), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
@@ -334,8 +334,8 @@
 
   F77_XFCN (zgeev, ZGEEV, (F77_CONST_CHAR_ARG2 ("N", 1),
                            F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
-                           n, tmp_data, n, pw, dummy, idummy,
-                           pv, n, pwork, lwork, prwork, info
+                           n, F77_DBLE_CMPLX_ARG (tmp_data), n, F77_DBLE_CMPLX_ARG (pw), F77_DBLE_CMPLX_ARG (dummy), idummy,
+                           F77_DBLE_CMPLX_ARG (pv), n, F77_DBLE_CMPLX_ARG (pwork), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
@@ -376,7 +376,7 @@
 
   F77_XFCN (zheev, ZHEEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
                            F77_CONST_CHAR_ARG2 ("U", 1),
-                           n, tmp_data, n, pwr, &dummy_work, lwork,
+                           n, F77_DBLE_CMPLX_ARG (tmp_data), n, pwr, F77_DBLE_CMPLX_ARG (&dummy_work), lwork,
                            prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
@@ -390,7 +390,7 @@
 
   F77_XFCN (zheev, ZHEEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
                            F77_CONST_CHAR_ARG2 ("U", 1),
-                           n, tmp_data, n, pwr, pwork, lwork, prwork, info
+                           n, F77_DBLE_CMPLX_ARG (tmp_data), n, pwr, F77_DBLE_CMPLX_ARG (pwork), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
@@ -610,7 +610,7 @@
   Complex*tmp_data = tmp.fortran_vec ();
 
   F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 ("L", 1),
-                             n, tmp_data, n,
+                             n, F77_DBLE_CMPLX_ARG (tmp_data), n,
                              info
                              F77_CHAR_ARG_LEN (1)));
 
@@ -645,9 +645,9 @@
 
   F77_XFCN (zggev, ZGGEV, (F77_CONST_CHAR_ARG2 ("N", 1),
                            F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
-                           n, atmp_data, n, btmp_data, n,
-                           palpha, pbeta, dummy, idummy,
-                           pv, n, &dummy_work, lwork, prwork, info
+                           n, F77_DBLE_CMPLX_ARG (atmp_data), n, F77_DBLE_CMPLX_ARG (btmp_data), n,
+                           F77_DBLE_CMPLX_ARG (palpha), F77_DBLE_CMPLX_ARG (pbeta), F77_DBLE_CMPLX_ARG (dummy), idummy,
+                           F77_DBLE_CMPLX_ARG (pv), n, F77_DBLE_CMPLX_ARG (&dummy_work), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
@@ -660,9 +660,9 @@
 
   F77_XFCN (zggev, ZGGEV, (F77_CONST_CHAR_ARG2 ("N", 1),
                            F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
-                           n, atmp_data, n, btmp_data, n,
-                           palpha, pbeta, dummy, idummy,
-                           pv, n, pwork, lwork, prwork, info
+                           n, F77_DBLE_CMPLX_ARG (atmp_data), n, F77_DBLE_CMPLX_ARG (btmp_data), n,
+                           F77_DBLE_CMPLX_ARG (palpha), F77_DBLE_CMPLX_ARG (pbeta), F77_DBLE_CMPLX_ARG (dummy), idummy,
+                           F77_DBLE_CMPLX_ARG (pv), n, F77_DBLE_CMPLX_ARG (pwork), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
@@ -715,9 +715,9 @@
 
   F77_XFCN (zhegv, ZHEGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
                            F77_CONST_CHAR_ARG2 ("U", 1),
-                           n, atmp_data, n,
-                           btmp_data, n,
-                           pwr, &dummy_work, lwork,
+                           n, F77_DBLE_CMPLX_ARG (atmp_data), n,
+                           F77_DBLE_CMPLX_ARG (btmp_data), n,
+                           pwr, F77_DBLE_CMPLX_ARG (&dummy_work), lwork,
                            prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
@@ -731,9 +731,9 @@
 
   F77_XFCN (zhegv, ZHEGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
                            F77_CONST_CHAR_ARG2 ("U", 1),
-                           n, atmp_data, n,
-                           btmp_data, n,
-                           pwr, pwork, lwork, prwork, info
+                           n, F77_DBLE_CMPLX_ARG (atmp_data), n,
+                           F77_DBLE_CMPLX_ARG (btmp_data), n,
+                           pwr, F77_DBLE_CMPLX_ARG (pwork), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
--- a/liboctave/numeric/aepbalance.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/aepbalance.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -215,7 +215,7 @@
   octave_idx_type info;
 
   F77_XFCN (zgebal, ZGEBAL, (F77_CONST_CHAR_ARG2 (&job, 1), n,
-                             balanced_mat.fortran_vec (), n, ilo, ihi,
+                             F77_DBLE_CMPLX_ARG (balanced_mat.fortran_vec ()), n, ilo, ihi,
                              scale.fortran_vec (), info
                              F77_CHAR_ARG_LEN (1)));
 }
@@ -236,7 +236,7 @@
   F77_XFCN (zgebak, ZGEBAK, (F77_CONST_CHAR_ARG2 (&job, 1),
                              F77_CONST_CHAR_ARG2 (&side, 1),
                              n, ilo, ihi, scale.data (), n,
-                             balancing_mat.fortran_vec (), n, info
+                             F77_DBLE_CMPLX_ARG (balancing_mat.fortran_vec ()), n, info
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)));
 
@@ -258,7 +258,7 @@
   octave_idx_type info;
 
   F77_XFCN (cgebal, CGEBAL, (F77_CONST_CHAR_ARG2 (&job, 1), n,
-                             balanced_mat.fortran_vec (), n, ilo, ihi,
+                             F77_CMPLX_ARG (balanced_mat.fortran_vec ()), n, ilo, ihi,
                              scale.fortran_vec (), info
                              F77_CHAR_ARG_LEN (1)));
 }
@@ -279,7 +279,7 @@
   F77_XFCN (cgebak, CGEBAK, (F77_CONST_CHAR_ARG2 (&job, 1),
                              F77_CONST_CHAR_ARG2 (&side, 1),
                              n, ilo, ihi, scale.data (), n,
-                             balancing_mat.fortran_vec (), n, info
+                             F77_CMPLX_ARG (balancing_mat.fortran_vec ()), n, info
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)));
 
--- a/liboctave/numeric/chol.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/chol.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -348,11 +348,11 @@
 
   if (is_upper)
     F77_XFCN (zpotri, ZPOTRI, (F77_CONST_CHAR_ARG2 ("U", 1), n,
-                               tmp.fortran_vec (), n, info
+                               F77_DBLE_CMPLX_ARG (tmp.fortran_vec ()), n, info
                                F77_CHAR_ARG_LEN (1)));
   else
     F77_XFCN (zpotri, ZPOTRI, (F77_CONST_CHAR_ARG2 ("L", 1), n,
-                               tmp.fortran_vec (), n, info
+                               F77_DBLE_CMPLX_ARG (tmp.fortran_vec ()), n, info
                                F77_CHAR_ARG_LEN (1)));
 
   // If someone thinks of a more graceful way of doing this (or
@@ -393,11 +393,11 @@
 
   if (is_upper)
     F77_XFCN (cpotri, CPOTRI, (F77_CONST_CHAR_ARG2 ("U", 1), n,
-                               tmp.fortran_vec (), n, info
+                               F77_CMPLX_ARG (tmp.fortran_vec ()), n, info
                                F77_CHAR_ARG_LEN (1)));
   else
     F77_XFCN (cpotri, CPOTRI, (F77_CONST_CHAR_ARG2 ("L", 1), n,
-                               tmp.fortran_vec (), n, info
+                               F77_CMPLX_ARG (tmp.fortran_vec ()), n, info
                                F77_CHAR_ARG_LEN (1)));
 
   // If someone thinks of a more graceful way of doing this (or
@@ -974,10 +974,10 @@
     anorm = xnorm (a, 1);
 
   if (is_upper)
-    F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 ("U", 1), n, h, n, info
+    F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 ("U", 1), n, F77_DBLE_CMPLX_ARG (h), n, info
                                F77_CHAR_ARG_LEN (1)));
   else
-    F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 ("L", 1), n, h, n, info
+    F77_XFCN (zpotrf, ZPOTRF, (F77_CONST_CHAR_ARG2 ("L", 1), n, F77_DBLE_CMPLX_ARG (h), n, info
                                F77_CHAR_ARG_LEN (1)));
 
   xrcond = 0.0;
@@ -992,8 +992,8 @@
       Complex *pz = z.fortran_vec ();
       Array<double> rz (dim_vector (n, 1));
       double *prz = rz.fortran_vec ();
-      F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 ("U", 1), n, h,
-                                 n, anorm, xrcond, pz, prz, zpocon_info
+      F77_XFCN (zpocon, ZPOCON, (F77_CONST_CHAR_ARG2 ("U", 1), n, F77_DBLE_CMPLX_ARG (h),
+                                 n, anorm, xrcond, F77_DBLE_CMPLX_ARG (pz), prz, zpocon_info
                                  F77_CHAR_ARG_LEN (1)));
 
       if (zpocon_info != 0)
@@ -1018,8 +1018,8 @@
 
   OCTAVE_LOCAL_BUFFER (double, rw, n);
 
-  F77_XFCN (zch1up, ZCH1UP, (n, chol_mat.fortran_vec (), chol_mat.rows (),
-                             utmp.fortran_vec (), rw));
+  F77_XFCN (zch1up, ZCH1UP, (n, F77_DBLE_CMPLX_ARG (chol_mat.fortran_vec ()), chol_mat.rows (),
+                             F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), rw));
 }
 
 template <>
@@ -1037,8 +1037,8 @@
 
   OCTAVE_LOCAL_BUFFER (double, rw, n);
 
-  F77_XFCN (zch1dn, ZCH1DN, (n, chol_mat.fortran_vec (), chol_mat.rows (),
-                             utmp.fortran_vec (), rw, info));
+  F77_XFCN (zch1dn, ZCH1DN, (n, F77_DBLE_CMPLX_ARG (chol_mat.fortran_vec ()), chol_mat.rows (),
+                             F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), rw, info));
 
   return info;
 }
@@ -1063,8 +1063,8 @@
 
   chol_mat.resize (n+1, n+1);
 
-  F77_XFCN (zchinx, ZCHINX, (n, chol_mat.fortran_vec (), chol_mat.rows (),
-                             j + 1, utmp.fortran_vec (), rw, info));
+  F77_XFCN (zchinx, ZCHINX, (n, F77_DBLE_CMPLX_ARG (chol_mat.fortran_vec ()), chol_mat.rows (),
+                             j + 1, F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), rw, info));
 
   return info;
 }
@@ -1080,7 +1080,7 @@
 
   OCTAVE_LOCAL_BUFFER (double, rw, n);
 
-  F77_XFCN (zchdex, ZCHDEX, (n, chol_mat.fortran_vec (), chol_mat.rows (),
+  F77_XFCN (zchdex, ZCHDEX, (n, F77_DBLE_CMPLX_ARG (chol_mat.fortran_vec ()), chol_mat.rows (),
                              j + 1, rw));
 
   chol_mat.resize (n-1, n-1);
@@ -1098,8 +1098,8 @@
   OCTAVE_LOCAL_BUFFER (Complex, w, n);
   OCTAVE_LOCAL_BUFFER (double, rw, n);
 
-  F77_XFCN (zchshx, ZCHSHX, (n, chol_mat.fortran_vec (), chol_mat.rows (),
-                             i + 1, j + 1, w, rw));
+  F77_XFCN (zchshx, ZCHSHX, (n, F77_DBLE_CMPLX_ARG (chol_mat.fortran_vec ()), chol_mat.rows (),
+                             i + 1, j + 1, F77_DBLE_CMPLX_ARG (w), rw));
 }
 
 #endif
@@ -1145,10 +1145,10 @@
     anorm = xnorm (a, 1);
 
   if (is_upper)
-    F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 ("U", 1), n, h, n, info
+    F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 ("U", 1), n, F77_CMPLX_ARG (h), n, info
                                F77_CHAR_ARG_LEN (1)));
   else
-    F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 ("L", 1), n, h, n, info
+    F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 ("L", 1), n, F77_CMPLX_ARG (h), n, info
                                F77_CHAR_ARG_LEN (1)));
 
   xrcond = 0.0;
@@ -1163,8 +1163,8 @@
       FloatComplex *pz = z.fortran_vec ();
       Array<float> rz (dim_vector (n, 1));
       float *prz = rz.fortran_vec ();
-      F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 ("U", 1), n, h,
-                                 n, anorm, xrcond, pz, prz, cpocon_info
+      F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 ("U", 1), n, F77_CMPLX_ARG (h),
+                                 n, anorm, xrcond, F77_CMPLX_ARG (pz), prz, cpocon_info
                                  F77_CHAR_ARG_LEN (1)));
 
       if (cpocon_info != 0)
@@ -1189,8 +1189,8 @@
 
   OCTAVE_LOCAL_BUFFER (float, rw, n);
 
-  F77_XFCN (cch1up, CCH1UP, (n, chol_mat.fortran_vec (), chol_mat.rows (),
-                             utmp.fortran_vec (), rw));
+  F77_XFCN (cch1up, CCH1UP, (n, F77_CMPLX_ARG (chol_mat.fortran_vec ()), chol_mat.rows (),
+                             F77_CMPLX_ARG (utmp.fortran_vec ()), rw));
 }
 
 template <>
@@ -1208,8 +1208,8 @@
 
   OCTAVE_LOCAL_BUFFER (float, rw, n);
 
-  F77_XFCN (cch1dn, CCH1DN, (n, chol_mat.fortran_vec (), chol_mat.rows (),
-                             utmp.fortran_vec (), rw, info));
+  F77_XFCN (cch1dn, CCH1DN, (n, F77_CMPLX_ARG (chol_mat.fortran_vec ()), chol_mat.rows (),
+                             F77_CMPLX_ARG (utmp.fortran_vec ()), rw, info));
 
   return info;
 }
@@ -1234,8 +1234,8 @@
 
   chol_mat.resize (n+1, n+1);
 
-  F77_XFCN (cchinx, CCHINX, (n, chol_mat.fortran_vec (), chol_mat.rows (),
-                             j + 1, utmp.fortran_vec (), rw, info));
+  F77_XFCN (cchinx, CCHINX, (n, F77_CMPLX_ARG (chol_mat.fortran_vec ()), chol_mat.rows (),
+                             j + 1, F77_CMPLX_ARG (utmp.fortran_vec ()), rw, info));
 
   return info;
 }
@@ -1251,7 +1251,7 @@
 
   OCTAVE_LOCAL_BUFFER (float, rw, n);
 
-  F77_XFCN (cchdex, CCHDEX, (n, chol_mat.fortran_vec (), chol_mat.rows (),
+  F77_XFCN (cchdex, CCHDEX, (n, F77_CMPLX_ARG (chol_mat.fortran_vec ()), chol_mat.rows (),
                              j + 1, rw));
 
   chol_mat.resize (n-1, n-1);
@@ -1269,8 +1269,8 @@
   OCTAVE_LOCAL_BUFFER (FloatComplex, w, n);
   OCTAVE_LOCAL_BUFFER (float, rw, n);
 
-  F77_XFCN (cchshx, CCHSHX, (n, chol_mat.fortran_vec (), chol_mat.rows (),
-                             i + 1, j + 1, w, rw));
+  F77_XFCN (cchshx, CCHSHX, (n, F77_CMPLX_ARG (chol_mat.fortran_vec ()), chol_mat.rows (),
+                             i + 1, j + 1, F77_CMPLX_ARG (w), rw));
 }
 
 #endif
--- a/liboctave/numeric/eigs-base.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/eigs-base.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -126,7 +126,7 @@
   F77_FUNC (zneupd, ZNEUPD) (const F77_INT&,
                              F77_CONST_CHAR_ARG_DECL,
                              F77_INT*, F77_DBLE_CMPLX*, F77_DBLE_CMPLX*,
-                             const F77_INT&, const F77_DBLE_CMPLX&, F77_DBLE_CMPLX*,
+                             const F77_INT&, const F77_DBLE_CMPLX*, F77_DBLE_CMPLX*,
                              F77_CONST_CHAR_ARG_DECL,
                              const F77_INT&,
                              F77_CONST_CHAR_ARG_DECL,
@@ -288,8 +288,8 @@
   octave_idx_type nc = m.cols ();
 
   F77_XFCN (zgemv, ZGEMV, (F77_CONST_CHAR_ARG2 ("N", 1),
-                           nr, nc, 1.0,  m.data (), nr,
-                           x, 1, 0.0, y, 1
+                           nr, nc, 1.0,  F77_CONST_DBLE_CMPLX_ARG (m.data ()), nr,
+                           F77_CONST_DBLE_CMPLX_ARG (x), 1, 0.0, F77_DBLE_CMPLX_ARG (y), 1
                            F77_CHAR_ARG_LEN (1)));
 
   if (f77_exception_encountered)
@@ -2581,8 +2581,8 @@
       F77_FUNC (znaupd, ZNAUPD)
         (ido, F77_CONST_CHAR_ARG2 (&bmat, 1), n,
          F77_CONST_CHAR_ARG2 ((typ.c_str ()), 2),
-         k, tol, presid, p, v, n, iparam,
-         ipntr, workd, workl, lwork, rwork, info
+         k, tol, F77_DBLE_CMPLX_ARG (presid), p, F77_DBLE_CMPLX_ARG (v), n, iparam,
+         ipntr, F77_DBLE_CMPLX_ARG (workd), F77_DBLE_CMPLX_ARG (workl), lwork, rwork, info
          F77_CHAR_ARG_LEN(1) F77_CHAR_ARG_LEN(2));
 
       if (f77_exception_encountered)
@@ -2657,10 +2657,10 @@
   OCTAVE_LOCAL_BUFFER (Complex, workev, 2 * p);
 
   F77_FUNC (zneupd, ZNEUPD)
-    (rvec, F77_CONST_CHAR_ARG2 ("A", 1), sel, d, z, n, sigma, workev,
+    (rvec, F77_CONST_CHAR_ARG2 ("A", 1), sel, F77_DBLE_CMPLX_ARG (d), F77_DBLE_CMPLX_ARG (z), n, F77_CONST_DBLE_CMPLX_ARG (&sigma), F77_DBLE_CMPLX_ARG (workev),
      F77_CONST_CHAR_ARG2 (&bmat, 1), n,
      F77_CONST_CHAR_ARG2 ((typ.c_str ()), 2),
-     k, tol, presid, p, v, n, iparam, ipntr, workd, workl, lwork, rwork, info2
+     k, tol, F77_DBLE_CMPLX_ARG (presid), p, F77_DBLE_CMPLX_ARG (v), n, iparam, ipntr, F77_DBLE_CMPLX_ARG (workd), F77_DBLE_CMPLX_ARG (workl), lwork, rwork, info2
      F77_CHAR_ARG_LEN(1) F77_CHAR_ARG_LEN(1) F77_CHAR_ARG_LEN(2));
 
   if (f77_exception_encountered)
@@ -2837,8 +2837,8 @@
       F77_FUNC (znaupd, ZNAUPD)
         (ido, F77_CONST_CHAR_ARG2 (&bmat, 1), n,
          F77_CONST_CHAR_ARG2 ((typ.c_str ()), 2),
-         k, tol, presid, p, v, n, iparam,
-         ipntr, workd, workl, lwork, rwork, info
+         k, tol, F77_DBLE_CMPLX_ARG (presid), p, F77_DBLE_CMPLX_ARG (v), n, iparam,
+         ipntr, F77_DBLE_CMPLX_ARG (workd), F77_DBLE_CMPLX_ARG (workl), lwork, rwork, info
          F77_CHAR_ARG_LEN(1) F77_CHAR_ARG_LEN(2));
 
       if (f77_exception_encountered)
@@ -2959,10 +2959,10 @@
   OCTAVE_LOCAL_BUFFER (Complex, workev, 2 * p);
 
   F77_FUNC (zneupd, ZNEUPD)
-    (rvec, F77_CONST_CHAR_ARG2 ("A", 1), sel, d, z, n, sigma, workev,
+    (rvec, F77_CONST_CHAR_ARG2 ("A", 1), sel, F77_DBLE_CMPLX_ARG (d), F77_DBLE_CMPLX_ARG (z), n, F77_CONST_DBLE_CMPLX_ARG (&sigma), F77_DBLE_CMPLX_ARG (workev),
      F77_CONST_CHAR_ARG2 (&bmat, 1), n,
      F77_CONST_CHAR_ARG2 ((typ.c_str ()), 2),
-     k, tol, presid, p, v, n, iparam, ipntr, workd, workl, lwork, rwork, info2
+     k, tol, F77_DBLE_CMPLX_ARG (presid), p, F77_DBLE_CMPLX_ARG (v), n, iparam, ipntr, F77_DBLE_CMPLX_ARG (workd), F77_DBLE_CMPLX_ARG (workl), lwork, rwork, info2
      F77_CHAR_ARG_LEN(1) F77_CHAR_ARG_LEN(1) F77_CHAR_ARG_LEN(2));
 
   if (f77_exception_encountered)
@@ -3122,8 +3122,8 @@
       F77_FUNC (znaupd, ZNAUPD)
         (ido, F77_CONST_CHAR_ARG2 (&bmat, 1), n,
          F77_CONST_CHAR_ARG2 ((typ.c_str ()), 2),
-         k, tol, presid, p, v, n, iparam,
-         ipntr, workd, workl, lwork, rwork, info
+         k, tol, F77_DBLE_CMPLX_ARG (presid), p, F77_DBLE_CMPLX_ARG (v), n, iparam,
+         ipntr, F77_DBLE_CMPLX_ARG (workd), F77_DBLE_CMPLX_ARG (workl), lwork, rwork, info
          F77_CHAR_ARG_LEN(1) F77_CHAR_ARG_LEN(2));
 
       if (f77_exception_encountered)
@@ -3199,10 +3199,10 @@
   OCTAVE_LOCAL_BUFFER (Complex, workev, 2 * p);
 
   F77_FUNC (zneupd, ZNEUPD)
-    (rvec, F77_CONST_CHAR_ARG2 ("A", 1), sel, d, z, n, sigma, workev,
+    (rvec, F77_CONST_CHAR_ARG2 ("A", 1), sel, F77_DBLE_CMPLX_ARG (d), F77_DBLE_CMPLX_ARG (z), n, F77_DBLE_CMPLX_ARG (&sigma), F77_DBLE_CMPLX_ARG (workev),
      F77_CONST_CHAR_ARG2 (&bmat, 1), n,
      F77_CONST_CHAR_ARG2 ((typ.c_str ()), 2),
-     k, tol, presid, p, v, n, iparam, ipntr, workd, workl, lwork, rwork, info2
+     k, tol, F77_DBLE_CMPLX_ARG (presid), p, F77_DBLE_CMPLX_ARG (v), n, iparam, ipntr, F77_DBLE_CMPLX_ARG (workd), F77_DBLE_CMPLX_ARG (workl), lwork, rwork, info2
      F77_CHAR_ARG_LEN(1) F77_CHAR_ARG_LEN(1) F77_CHAR_ARG_LEN(2));
 
   if (f77_exception_encountered)
--- a/liboctave/numeric/fEIG.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/fEIG.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -316,8 +316,8 @@
 
   F77_XFCN (cgeev, CGEEV, (F77_CONST_CHAR_ARG2 ("N", 1),
                            F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
-                           n, tmp_data, n, pw, dummy, idummy,
-                           pv, n, &dummy_work, lwork, prwork, info
+                           n, F77_CMPLX_ARG (tmp_data), n, F77_CMPLX_ARG (pw), F77_CMPLX_ARG (dummy), idummy,
+                           F77_CMPLX_ARG (pv), n, F77_CMPLX_ARG (&dummy_work), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
@@ -330,8 +330,8 @@
 
   F77_XFCN (cgeev, CGEEV, (F77_CONST_CHAR_ARG2 ("N", 1),
                            F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
-                           n, tmp_data, n, pw, dummy, idummy,
-                           pv, n, pwork, lwork, prwork, info
+                           n, F77_CMPLX_ARG (tmp_data), n, F77_CMPLX_ARG (pw), F77_CMPLX_ARG (dummy), idummy,
+                           F77_CMPLX_ARG (pv), n, F77_CMPLX_ARG (pwork), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
@@ -372,7 +372,7 @@
 
   F77_XFCN (cheev, CHEEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
                            F77_CONST_CHAR_ARG2 ("U", 1),
-                           n, tmp_data, n, pwr, &dummy_work, lwork,
+                           n, F77_CMPLX_ARG (tmp_data), n, pwr, F77_CMPLX_ARG (&dummy_work), lwork,
                            prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
@@ -386,7 +386,7 @@
 
   F77_XFCN (cheev, CHEEV, (F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
                            F77_CONST_CHAR_ARG2 ("U", 1),
-                           n, tmp_data, n, pwr, pwork, lwork, prwork, info
+                           n, F77_CMPLX_ARG (tmp_data), n, pwr, F77_CMPLX_ARG (pwork), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
@@ -607,7 +607,7 @@
   FloatComplex *tmp_data = tmp.fortran_vec ();
 
   F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 ("L", 1),
-                             n, tmp_data, n,
+                             n, F77_CMPLX_ARG (tmp_data), n,
                              info
                              F77_CHAR_ARG_LEN (1)));
 
@@ -642,9 +642,9 @@
 
   F77_XFCN (cggev, CGGEV, (F77_CONST_CHAR_ARG2 ("N", 1),
                            F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
-                           n, atmp_data, n, btmp_data, n,
-                           palpha, pbeta, dummy, idummy,
-                           pv, n, &dummy_work, lwork, prwork, info
+                           n, F77_CMPLX_ARG (atmp_data), n, F77_CMPLX_ARG (btmp_data), n,
+                           F77_CMPLX_ARG (palpha), F77_CMPLX_ARG (pbeta), F77_CMPLX_ARG (dummy), idummy,
+                           F77_CMPLX_ARG (pv), n, F77_CMPLX_ARG (&dummy_work), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
@@ -657,9 +657,9 @@
 
   F77_XFCN (cggev, CGGEV, (F77_CONST_CHAR_ARG2 ("N", 1),
                            F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
-                           n, atmp_data, n, btmp_data, n,
-                           palpha, pbeta, dummy, idummy,
-                           pv, n, pwork, lwork, prwork, info
+                           n, F77_CMPLX_ARG (atmp_data), n, F77_CMPLX_ARG (btmp_data), n,
+                           F77_CMPLX_ARG (palpha), F77_CMPLX_ARG (pbeta), F77_CMPLX_ARG (dummy), idummy,
+                           F77_CMPLX_ARG (pv), n, F77_CMPLX_ARG (pwork), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
@@ -712,9 +712,9 @@
 
   F77_XFCN (chegv, CHEGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
                            F77_CONST_CHAR_ARG2 ("U", 1),
-                           n, atmp_data, n,
-                           btmp_data, n,
-                           pwr, &dummy_work, lwork,
+                           n, F77_CMPLX_ARG (atmp_data), n,
+                           F77_CMPLX_ARG (btmp_data), n,
+                           pwr, F77_CMPLX_ARG (&dummy_work), lwork,
                            prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
@@ -728,9 +728,9 @@
 
   F77_XFCN (chegv, CHEGV, (1, F77_CONST_CHAR_ARG2 (calc_ev ? "V" : "N", 1),
                            F77_CONST_CHAR_ARG2 ("U", 1),
-                           n, atmp_data, n,
-                           btmp_data, n,
-                           pwr, pwork, lwork, prwork, info
+                           n, F77_CMPLX_ARG (atmp_data), n,
+                           F77_CMPLX_ARG (btmp_data), n,
+                           pwr, F77_CMPLX_ARG (pwork), lwork, prwork, info
                            F77_CHAR_ARG_LEN (1)
                            F77_CHAR_ARG_LEN (1)));
 
--- a/liboctave/numeric/gepbalance.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/gepbalance.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -263,7 +263,7 @@
   char job = balance_job[0];
 
   F77_XFCN (zggbal, ZGGBAL, (F77_CONST_CHAR_ARG2 (&job, 1),
-                             n, p_balanced_mat, n, p_balanced_mat2,
+                             n, F77_DBLE_CMPLX_ARG (p_balanced_mat), n, F77_DBLE_CMPLX_ARG (p_balanced_mat2),
                              n, ilo, ihi, plscale, prscale, pwork, info
                              F77_CHAR_ARG_LEN (1)));
 
@@ -332,8 +332,8 @@
   char job = balance_job[0];
 
   F77_XFCN (cggbal, CGGBAL, (F77_CONST_CHAR_ARG2 (&job, 1),
-                             n, p_balanced_mat, n, p_balanced_mat2,
-                             n, ilo, ihi, plscale,prscale, pwork, info
+                             n, F77_CMPLX_ARG (p_balanced_mat), n, F77_CMPLX_ARG (p_balanced_mat2),
+                             n, ilo, ihi, plscale, prscale, pwork, info
                              F77_CHAR_ARG_LEN (1)));
 
   balancing_mat = FloatMatrix (n, n, 0.0);
--- a/liboctave/numeric/hess.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/hess.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -305,7 +305,7 @@
   double *pscale = scale.fortran_vec ();
 
   F77_XFCN (zgebal, ZGEBAL, (F77_CONST_CHAR_ARG2 (&job, 1),
-                             n, h, n, ilo, ihi, pscale, info
+                             n, F77_DBLE_CMPLX_ARG (h), n, ilo, ihi, pscale, info
                              F77_CHAR_ARG_LEN (1)));
 
   Array<Complex> tau (dim_vector (n-1, 1));
@@ -314,17 +314,17 @@
   Array<Complex> work (dim_vector (lwork, 1));
   Complex *pwork = work.fortran_vec ();
 
-  F77_XFCN (zgehrd, ZGEHRD, (n, ilo, ihi, h, n, ptau, pwork, lwork, info));
+  F77_XFCN (zgehrd, ZGEHRD, (n, ilo, ihi, F77_DBLE_CMPLX_ARG (h), n, F77_DBLE_CMPLX_ARG (ptau), F77_DBLE_CMPLX_ARG (pwork), lwork, info));
 
   unitary_hess_mat = hess_mat;
   Complex *z = unitary_hess_mat.fortran_vec ();
 
-  F77_XFCN (zunghr, ZUNGHR, (n, ilo, ihi, z, n, ptau, pwork,
+  F77_XFCN (zunghr, ZUNGHR, (n, ilo, ihi, F77_DBLE_CMPLX_ARG (z), n, F77_DBLE_CMPLX_ARG (ptau), F77_DBLE_CMPLX_ARG (pwork),
                              lwork, info));
 
   F77_XFCN (zgebak, ZGEBAK, (F77_CONST_CHAR_ARG2 (&job, 1),
                              F77_CONST_CHAR_ARG2 (&side, 1),
-                             n, ilo, ihi, pscale, n, z, n, info
+                             n, ilo, ihi, pscale, n, F77_DBLE_CMPLX_ARG (z), n, info
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)));
 
@@ -369,7 +369,7 @@
   float *pscale = scale.fortran_vec ();
 
   F77_XFCN (cgebal, CGEBAL, (F77_CONST_CHAR_ARG2 (&job, 1),
-                             n, h, n, ilo, ihi, pscale, info
+                             n, F77_CMPLX_ARG (h), n, ilo, ihi, pscale, info
                              F77_CHAR_ARG_LEN (1)));
 
   Array<FloatComplex> tau (dim_vector (n-1, 1));
@@ -378,17 +378,17 @@
   Array<FloatComplex> work (dim_vector (lwork, 1));
   FloatComplex *pwork = work.fortran_vec ();
 
-  F77_XFCN (cgehrd, CGEHRD, (n, ilo, ihi, h, n, ptau, pwork, lwork, info));
+  F77_XFCN (cgehrd, CGEHRD, (n, ilo, ihi, F77_CMPLX_ARG (h), n, F77_CMPLX_ARG (ptau), F77_CMPLX_ARG (pwork), lwork, info));
 
   unitary_hess_mat = hess_mat;
   FloatComplex *z = unitary_hess_mat.fortran_vec ();
 
-  F77_XFCN (cunghr, CUNGHR, (n, ilo, ihi, z, n, ptau, pwork,
+  F77_XFCN (cunghr, CUNGHR, (n, ilo, ihi, F77_CMPLX_ARG (z), n, F77_CMPLX_ARG (ptau), F77_CMPLX_ARG (pwork),
                              lwork, info));
 
   F77_XFCN (cgebak, CGEBAK, (F77_CONST_CHAR_ARG2 (&job, 1),
                              F77_CONST_CHAR_ARG2 (&side, 1),
-                             n, ilo, ihi, pscale, n, z, n, info
+                             n, ilo, ihi, pscale, n, F77_CMPLX_ARG (z), n, info
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)));
 
--- a/liboctave/numeric/lo-specfun.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/lo-specfun.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -84,28 +84,28 @@
                            F77_INT&, F77_INT&);
 
   F77_RET_T
-  F77_FUNC (cbesj, cBESJ) (const F77_CMPLX&, const F77_REAL&,
+  F77_FUNC (cbesj, cBESJ) (const F77_CMPLX*, const F77_REAL&,
                            const F77_INT&, const F77_INT&,
                            F77_CMPLX*, F77_INT&, F77_INT&);
 
   F77_RET_T
-  F77_FUNC (cbesy, CBESY) (const F77_CMPLX&, const F77_REAL&,
+  F77_FUNC (cbesy, CBESY) (const F77_CMPLX*, const F77_REAL&,
                            const F77_INT&, const F77_INT&,
                            F77_CMPLX*, F77_INT&,
                            F77_CMPLX*, F77_INT&);
 
   F77_RET_T
-  F77_FUNC (cbesi, CBESI) (const F77_CMPLX&, const F77_REAL&,
+  F77_FUNC (cbesi, CBESI) (const F77_CMPLX*, const F77_REAL&,
                            const F77_INT&, const F77_INT&,
                            F77_CMPLX*, F77_INT&, F77_INT&);
 
   F77_RET_T
-  F77_FUNC (cbesk, CBESK) (const F77_CMPLX&, const F77_REAL&,
+  F77_FUNC (cbesk, CBESK) (const F77_CMPLX*, const F77_REAL&,
                            const F77_INT&, const F77_INT&,
                            F77_CMPLX*, F77_INT&, F77_INT&);
 
   F77_RET_T
-  F77_FUNC (cbesh, CBESH) (const F77_CMPLX&, const F77_REAL&,
+  F77_FUNC (cbesh, CBESH) (const F77_CMPLX*, const F77_REAL&,
                            const F77_INT&, const F77_INT&,
                            const F77_INT&, F77_CMPLX*,
                            F77_INT&, F77_INT&);
@@ -117,8 +117,8 @@
                            F77_INT&);
 
   F77_RET_T
-  F77_FUNC (cairy, CAIRY) (const F77_REAL&, const F77_REAL&, const F77_INT&,
-                           const F77_INT&, F77_REAL&, F77_REAL&,
+  F77_FUNC (cairy, CAIRY) (const F77_CMPLX*, const F77_INT&,
+                           const F77_INT&, F77_CMPLX*,
                            F77_INT&, F77_INT&);
 
   F77_RET_T
@@ -127,9 +127,8 @@
                            F77_DBLE&, F77_DBLE&, F77_INT&);
 
   F77_RET_T
-  F77_FUNC (cbiry, CBIRY) (const F77_REAL&, const F77_REAL&, const F77_INT&,
-                           const F77_INT&, F77_REAL&, F77_REAL&,
-                           F77_INT&);
+  F77_FUNC (cbiry, CBIRY) (const F77_CMPLX*, const F77_INT&, const F77_INT&,
+                           const F77_CMPLX*, F77_INT&);
 
   F77_RET_T
   F77_FUNC (xdacosh, XDACOSH) (const F77_DBLE&, F77_DBLE&);
@@ -1560,7 +1559,7 @@
 
           octave_idx_type nz;
 
-          F77_FUNC (cbesj, CBESJ) (z, alpha, 2, 1, &y, nz, ierr);
+          F77_FUNC (cbesj, CBESJ) (F77_CONST_CMPLX_ARG (&z), alpha, 2, 1, F77_CMPLX_ARG (&y), nz, ierr);
 
           if (kode != 2)
             {
@@ -1625,7 +1624,7 @@
             }
           else
             {
-              F77_FUNC (cbesy, CBESY) (z, alpha, 2, 1, &y, nz, &w, ierr);
+              F77_FUNC (cbesy, CBESY) (F77_CONST_CMPLX_ARG (&z), alpha, 2, 1, F77_CMPLX_ARG (&y), nz, F77_CMPLX_ARG (&w), ierr);
 
               if (kode != 2)
                 {
@@ -1681,7 +1680,7 @@
 
           octave_idx_type nz;
 
-          F77_FUNC (cbesi, CBESI) (z, alpha, 2, 1, &y, nz, ierr);
+          F77_FUNC (cbesi, CBESI) (F77_CONST_CMPLX_ARG (&z), alpha, 2, 1, F77_CMPLX_ARG (&y), nz, ierr);
 
           if (kode != 2)
             {
@@ -1743,7 +1742,7 @@
             }
           else
             {
-              F77_FUNC (cbesk, CBESK) (z, alpha, 2, 1, &y, nz, ierr);
+              F77_FUNC (cbesk, CBESK) (F77_CONST_CMPLX_ARG (&z), alpha, 2, 1, F77_CMPLX_ARG (&y), nz, ierr);
 
               if (kode != 2)
                 {
@@ -1785,7 +1784,7 @@
 
           octave_idx_type nz;
 
-          F77_FUNC (cbesh, CBESH) (z, alpha, 2, 1, 1, &y, nz, ierr);
+          F77_FUNC (cbesh, CBESH) (F77_CONST_CMPLX_ARG (&z), alpha, 2, 1, 1, F77_CMPLX_ARG (&y), nz, ierr);
 
           if (kode != 2)
             {
@@ -1828,7 +1827,7 @@
 
           octave_idx_type nz;
 
-          F77_FUNC (cbesh, CBESH) (z, alpha, 2, 2, 1, &y, nz, ierr);
+          F77_FUNC (cbesh, CBESH) (F77_CONST_CMPLX_ARG (&z), alpha, 2, 2, 1, F77_CMPLX_ARG (&y), nz, ierr);
 
           if (kode != 2)
             {
@@ -2243,17 +2242,16 @@
     FloatComplex
     airy (const FloatComplex& z, bool deriv, bool scaled, octave_idx_type& ierr)
     {
-      float ar = 0.0;
-      float ai = 0.0;
+      FloatComplex a;
 
       octave_idx_type nz;
 
-      float zr = z.real ();
-      float zi = z.imag ();
-
       octave_idx_type id = deriv ? 1 : 0;
 
-      F77_FUNC (cairy, CAIRY) (zr, zi, id, 2, ar, ai, nz, ierr);
+      F77_FUNC (cairy, CAIRY) (F77_CONST_CMPLX_ARG (&z), id, 2, F77_CMPLX_ARG (&a), nz, ierr);
+
+      float ar = a.real ();
+      float ai = a.imag ();
 
       if (! scaled)
         {
@@ -2268,7 +2266,7 @@
           ar = tmp;
         }
 
-      if (zi == 0.0 && (! scaled || zr >= 0.0))
+      if (z.imag () == 0.0 && (! scaled || z.real () >= 0.0))
         ai = 0.0;
 
       return bessel_return_value (FloatComplex (ar, ai), ierr);
@@ -2277,15 +2275,14 @@
     FloatComplex
     biry (const FloatComplex& z, bool deriv, bool scaled, octave_idx_type& ierr)
     {
-      float ar = 0.0;
-      float ai = 0.0;
-
-      float zr = z.real ();
-      float zi = z.imag ();
+      FloatComplex a;
 
       octave_idx_type id = deriv ? 1 : 0;
 
-      F77_FUNC (cbiry, CBIRY) (zr, zi, id, 2, ar, ai, ierr);
+      F77_FUNC (cbiry, CBIRY) (F77_CONST_CMPLX_ARG (&z), id, 2, F77_CMPLX_ARG (&a), ierr);
+
+      float ar = a.real ();
+      float ai = a.imag ();
 
       if (! scaled)
         {
@@ -2300,7 +2297,7 @@
           ar = tmp;
         }
 
-      if (zi == 0.0 && (! scaled || zr >= 0.0))
+      if (z.imag () == 0.0 && (! scaled || z.real () >= 0.0))
         ai = 0.0;
 
       return bessel_return_value (FloatComplex (ar, ai), ierr);
--- a/liboctave/numeric/lu.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/lu.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -612,7 +612,7 @@
 
   octave_idx_type info = 0;
 
-  F77_XFCN (zgetrf, ZGETRF, (a_nr, a_nc, tmp_data, a_nr, pipvt, info));
+  F77_XFCN (zgetrf, ZGETRF, (a_nr, a_nc, F77_DBLE_CMPLX_ARG (tmp_data), a_nr, pipvt, info));
 
   for (octave_idx_type i = 0; i < mn; i++)
     pipvt[i] -= 1;
@@ -640,8 +640,8 @@
 
   ComplexColumnVector utmp = u;
   ComplexColumnVector vtmp = v;
-  F77_XFCN (zlu1up, ZLU1UP, (m, n, l.fortran_vec (), m, r.fortran_vec (), k,
-                             utmp.fortran_vec (), vtmp.fortran_vec ()));
+  F77_XFCN (zlu1up, ZLU1UP, (m, n, F77_DBLE_CMPLX_ARG (l.fortran_vec ()), m, F77_DBLE_CMPLX_ARG (r.fortran_vec ()), k,
+                             F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), F77_DBLE_CMPLX_ARG (vtmp.fortran_vec ())));
 }
 
 template <>
@@ -665,9 +665,9 @@
     {
       ComplexColumnVector utmp = u.column (i);
       ComplexColumnVector vtmp = v.column (i);
-      F77_XFCN (zlu1up, ZLU1UP, (m, n, l.fortran_vec (),
-                                 m, r.fortran_vec (), k,
-                                 utmp.fortran_vec (), vtmp.fortran_vec ()));
+      F77_XFCN (zlu1up, ZLU1UP, (m, n, F77_DBLE_CMPLX_ARG (l.fortran_vec ()),
+                                 m, F77_DBLE_CMPLX_ARG (r.fortran_vec ()), k,
+                                 F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), F77_DBLE_CMPLX_ARG (vtmp.fortran_vec ())));
     }
 }
 
@@ -693,10 +693,10 @@
   ComplexColumnVector vtmp = v;
   OCTAVE_LOCAL_BUFFER (Complex, w, m);
   for (octave_idx_type i = 0; i < m; i++) ipvt(i) += 1; // increment
-  F77_XFCN (zlup1up, ZLUP1UP, (m, n, l.fortran_vec (),
-                               m, r.fortran_vec (), k,
+  F77_XFCN (zlup1up, ZLUP1UP, (m, n, F77_DBLE_CMPLX_ARG (l.fortran_vec ()),
+                               m, F77_DBLE_CMPLX_ARG (r.fortran_vec ()), k,
                                ipvt.fortran_vec (),
-                               utmp.data (), vtmp.data (), w));
+                               F77_CONST_DBLE_CMPLX_ARG (utmp.data ()), F77_CONST_DBLE_CMPLX_ARG (vtmp.data ()), F77_DBLE_CMPLX_ARG (w)));
   for (octave_idx_type i = 0; i < m; i++) ipvt(i) -= 1; // decrement
 }
 
@@ -723,10 +723,10 @@
     {
       ComplexColumnVector utmp = u.column (i);
       ComplexColumnVector vtmp = v.column (i);
-      F77_XFCN (zlup1up, ZLUP1UP, (m, n, l.fortran_vec (),
-                                   m, r.fortran_vec (), k,
+      F77_XFCN (zlup1up, ZLUP1UP, (m, n, F77_DBLE_CMPLX_ARG (l.fortran_vec ()),
+                                   m, F77_DBLE_CMPLX_ARG (r.fortran_vec ()), k,
                                    ipvt.fortran_vec (),
-                                   utmp.data (), vtmp.data (), w));
+                                   F77_CONST_DBLE_CMPLX_ARG (utmp.data ()), F77_CONST_DBLE_CMPLX_ARG (vtmp.data ()), F77_DBLE_CMPLX_ARG (w)));
     }
   for (octave_idx_type i = 0; i < m; i++) ipvt(i) -= 1; // decrement
 }
@@ -748,7 +748,7 @@
 
   octave_idx_type info = 0;
 
-  F77_XFCN (cgetrf, CGETRF, (a_nr, a_nc, tmp_data, a_nr, pipvt, info));
+  F77_XFCN (cgetrf, CGETRF, (a_nr, a_nc, F77_CMPLX_ARG (tmp_data), a_nr, pipvt, info));
 
   for (octave_idx_type i = 0; i < mn; i++)
     pipvt[i] -= 1;
@@ -775,8 +775,8 @@
     {
       FloatComplexColumnVector utmp = u;
       FloatComplexColumnVector vtmp = v;
-      F77_XFCN (clu1up, CLU1UP, (m, n, l.fortran_vec (), m, r.fortran_vec (), k,
-                                 utmp.fortran_vec (), vtmp.fortran_vec ()));
+      F77_XFCN (clu1up, CLU1UP, (m, n, F77_CMPLX_ARG (l.fortran_vec ()), m, F77_CMPLX_ARG (r.fortran_vec ()), k,
+                                 F77_CMPLX_ARG (utmp.fortran_vec ()), F77_CMPLX_ARG (vtmp.fortran_vec ())));
     }
   else
     (*current_liboctave_error_handler) ("luupdate: dimensions mismatch");
@@ -804,9 +804,9 @@
     {
       FloatComplexColumnVector utmp = u.column (i);
       FloatComplexColumnVector vtmp = v.column (i);
-      F77_XFCN (clu1up, CLU1UP, (m, n, l.fortran_vec (),
-                                 m, r.fortran_vec (), k,
-                                 utmp.fortran_vec (), vtmp.fortran_vec ()));
+      F77_XFCN (clu1up, CLU1UP, (m, n, F77_CMPLX_ARG (l.fortran_vec ()),
+                                 m, F77_CMPLX_ARG (r.fortran_vec ()), k,
+                                 F77_CMPLX_ARG (utmp.fortran_vec ()), F77_CMPLX_ARG (vtmp.fortran_vec ())));
     }
 }
 
@@ -832,10 +832,10 @@
   FloatComplexColumnVector vtmp = v;
   OCTAVE_LOCAL_BUFFER (FloatComplex, w, m);
   for (octave_idx_type i = 0; i < m; i++) ipvt(i) += 1; // increment
-  F77_XFCN (clup1up, CLUP1UP, (m, n, l.fortran_vec (),
-                               m, r.fortran_vec (), k,
+  F77_XFCN (clup1up, CLUP1UP, (m, n, F77_CMPLX_ARG (l.fortran_vec ()),
+                               m, F77_CMPLX_ARG (r.fortran_vec ()), k,
                                ipvt.fortran_vec (),
-                               utmp.data (), vtmp.data (), w));
+                               F77_CONST_CMPLX_ARG (utmp.data ()), F77_CONST_CMPLX_ARG (vtmp.data ()), F77_CMPLX_ARG (w)));
   for (octave_idx_type i = 0; i < m; i++) ipvt(i) -= 1; // decrement
 }
 
@@ -863,10 +863,10 @@
     {
       FloatComplexColumnVector utmp = u.column (i);
       FloatComplexColumnVector vtmp = v.column (i);
-      F77_XFCN (clup1up, CLUP1UP, (m, n, l.fortran_vec (),
-                                   m, r.fortran_vec (), k,
+      F77_XFCN (clup1up, CLUP1UP, (m, n, F77_CMPLX_ARG (l.fortran_vec ()),
+                                   m, F77_CMPLX_ARG (r.fortran_vec ()), k,
                                    ipvt.fortran_vec (),
-                                   utmp.data (), vtmp.data (), w));
+                                   F77_CONST_CMPLX_ARG (utmp.data ()), F77_CONST_CMPLX_ARG (vtmp.data ()), F77_CMPLX_ARG (w)));
     }
   for (octave_idx_type i = 0; i < m; i++) ipvt(i) -= 1; // decrement
 }
--- a/liboctave/numeric/oct-convn.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/oct-convn.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -40,7 +40,8 @@
              T *c, bool inner);
 
 // Forward instances to our Fortran implementations.
-#define FORWARD_IMPL(T, R, f, F) \
+#define FORWARD_IMPL(T_CXX, R_CXX, T, R, T_CAST, T_CONST_CAST, \
+                     R_CONST_CAST, f, F) \
 extern "C" \
 F77_RET_T \
 F77_FUNC (f##conv2o, F##CONV2O) (const F77_INT&, \
@@ -56,22 +57,33 @@
                                  const F77_INT&, const R*, T *); \
 \
 template <> void \
-convolve_2d<T, R> (const T *a, F77_INT ma, F77_INT na, \
-                   const R *b, F77_INT mb, F77_INT nb, \
-                   T *c, bool inner) \
+convolve_2d<T_CXX, R_CXX> (const T_CXX *a, F77_INT ma, F77_INT na, \
+                           const R_CXX *b, F77_INT mb, F77_INT nb, \
+                           T_CXX *c, bool inner) \
 { \
   if (inner) \
-    F77_XFCN (f##conv2i, F##CONV2I, (ma, na, a, mb, nb, b, c)); \
+    F77_XFCN (f##conv2i, F##CONV2I, (ma, na, T_CONST_CAST (a), \
+                                     mb, nb, R_CONST_CAST (b), T_CAST (c))); \
   else \
-    F77_XFCN (f##conv2o, F##CONV2O, (ma, na, a, mb, nb, b, c)); \
+    F77_XFCN (f##conv2o, F##CONV2O, (ma, na, T_CONST_CAST (a), \
+                                     mb, nb, R_CONST_CAST (b), T_CAST (c))); \
 }
 
-FORWARD_IMPL (F77_DBLE, F77_DBLE, d, D)
-FORWARD_IMPL (F77_REAL, F77_REAL, s, S)
-FORWARD_IMPL (F77_DBLE_CMPLX, F77_DBLE_CMPLX, z, Z)
-FORWARD_IMPL (F77_CMPLX, F77_CMPLX, c, C)
-FORWARD_IMPL (F77_DBLE_CMPLX, F77_DBLE, zd, ZD)
-FORWARD_IMPL (F77_CMPLX, F77_REAL, cs, CS)
+FORWARD_IMPL (double, double, F77_DBLE, F77_DBLE, , , , d, D)
+FORWARD_IMPL (float, float, F77_REAL, F77_REAL, , , , s, S)
+
+FORWARD_IMPL (std::complex<double>, std::complex<double>,
+              F77_DBLE_CMPLX, F77_DBLE_CMPLX, F77_DBLE_CMPLX_ARG,
+              F77_CONST_DBLE_CMPLX_ARG, F77_CONST_DBLE_CMPLX_ARG, z, Z)
+FORWARD_IMPL (std::complex<float>, std::complex<float>,
+              F77_CMPLX, F77_CMPLX, F77_CMPLX_ARG,
+              F77_CONST_CMPLX_ARG, F77_CONST_CMPLX_ARG, c, C)
+
+FORWARD_IMPL (std::complex<double>, double,
+              F77_DBLE_CMPLX, F77_DBLE, F77_DBLE_CMPLX_ARG,
+              F77_CONST_DBLE_CMPLX_ARG, , zd, ZD)
+FORWARD_IMPL (std::complex<float>, float, F77_CMPLX, F77_REAL, F77_CMPLX_ARG,
+              F77_CONST_CMPLX_ARG, , cs, CS)
 
 template <typename T, typename R>
 void convolve_nd (const T *a, const dim_vector& ad, const dim_vector& acd,
--- a/liboctave/numeric/qr.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/qr.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -1362,15 +1362,15 @@
           octave_idx_type k = q.columns ();
           // workspace query.
           Complex clwork;
-          F77_XFCN (zungqr, ZUNGQR, (m, k, min_mn, q.fortran_vec (), m, tau,
-                                     &clwork, -1, info));
+          F77_XFCN (zungqr, ZUNGQR, (m, k, min_mn, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), m, F77_DBLE_CMPLX_ARG (tau),
+                                     F77_DBLE_CMPLX_ARG (&clwork), -1, info));
 
           // allocate buffer and do the job.
           octave_idx_type lwork = clwork.real ();
           lwork = std::max (lwork, static_cast<octave_idx_type> (1));
           OCTAVE_LOCAL_BUFFER (Complex, work, lwork);
-          F77_XFCN (zungqr, ZUNGQR, (m, k, min_mn, q.fortran_vec (), m, tau,
-                                     work, lwork, info));
+          F77_XFCN (zungqr, ZUNGQR, (m, k, min_mn, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), m, F77_DBLE_CMPLX_ARG (tau),
+                                     F77_DBLE_CMPLX_ARG (work), lwork, info));
         }
     }
 }
@@ -1395,15 +1395,15 @@
     {
       // workspace query.
       Complex clwork;
-      F77_XFCN (zgeqrf, ZGEQRF, (m, n, afact.fortran_vec (), m, tau,
-                                 &clwork, -1, info));
+      F77_XFCN (zgeqrf, ZGEQRF, (m, n, F77_DBLE_CMPLX_ARG (afact.fortran_vec ()), m, F77_DBLE_CMPLX_ARG (tau),
+                                 F77_DBLE_CMPLX_ARG (&clwork), -1, info));
 
       // allocate buffer and do the job.
       octave_idx_type lwork = clwork.real ();
       lwork = std::max (lwork, static_cast<octave_idx_type> (1));
       OCTAVE_LOCAL_BUFFER (Complex, work, lwork);
-      F77_XFCN (zgeqrf, ZGEQRF, (m, n, afact.fortran_vec (), m, tau,
-                                 work, lwork, info));
+      F77_XFCN (zgeqrf, ZGEQRF, (m, n, F77_DBLE_CMPLX_ARG (afact.fortran_vec ()), m, F77_DBLE_CMPLX_ARG (tau),
+                                 F77_DBLE_CMPLX_ARG (work), lwork, info));
     }
 
   form (n, afact, tau, qr_type);
@@ -1426,10 +1426,10 @@
   ComplexColumnVector vtmp = v;
   OCTAVE_LOCAL_BUFFER (Complex, w, k);
   OCTAVE_LOCAL_BUFFER (double, rw, k);
-  F77_XFCN (zqr1up, ZQR1UP, (m, n, k, q.fortran_vec (),
-                             m, r.fortran_vec (), k,
-                             utmp.fortran_vec (), vtmp.fortran_vec (),
-                             w, rw));
+  F77_XFCN (zqr1up, ZQR1UP, (m, n, k, F77_DBLE_CMPLX_ARG (q.fortran_vec ()),
+                             m, F77_DBLE_CMPLX_ARG (r.fortran_vec ()), k,
+                             F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), F77_DBLE_CMPLX_ARG (vtmp.fortran_vec ()),
+                             F77_DBLE_CMPLX_ARG (w), rw));
 }
 
 template <>
@@ -1449,10 +1449,10 @@
     {
       ComplexColumnVector utmp = u.column (i);
       ComplexColumnVector vtmp = v.column (i);
-      F77_XFCN (zqr1up, ZQR1UP, (m, n, k, q.fortran_vec (),
-                                 m, r.fortran_vec (), k,
-                                 utmp.fortran_vec (), vtmp.fortran_vec (),
-                                 w, rw));
+      F77_XFCN (zqr1up, ZQR1UP, (m, n, k, F77_DBLE_CMPLX_ARG (q.fortran_vec ()),
+                                 m, F77_DBLE_CMPLX_ARG (r.fortran_vec ()), k,
+                                 F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), F77_DBLE_CMPLX_ARG (vtmp.fortran_vec ()),
+                                 F77_DBLE_CMPLX_ARG (w), rw));
     }
 }
 
@@ -1481,9 +1481,9 @@
 
   ComplexColumnVector utmp = u;
   OCTAVE_LOCAL_BUFFER (double, rw, k);
-  F77_XFCN (zqrinc, ZQRINC, (m, n, k, q.fortran_vec (), q.rows (),
-                             r.fortran_vec (), r.rows (), j + 1,
-                             utmp.data (), rw));
+  F77_XFCN (zqrinc, ZQRINC, (m, n, k, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                             F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1,
+                             F77_CONST_DBLE_CMPLX_ARG (utmp.data ()), rw));
 }
 
 template <>
@@ -1527,9 +1527,9 @@
           octave_idx_type ii = i;
           ComplexColumnVector utmp = u.column (jsi(i));
           F77_XFCN (zqrinc, ZQRINC, (m, n + ii, std::min (kmax, k + ii),
-                                     q.fortran_vec (), q.rows (),
-                                     r.fortran_vec (), r.rows (), js(ii) + 1,
-                                     utmp.data (), rw));
+                                     F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                                     F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (), js(ii) + 1,
+                                     F77_CONST_DBLE_CMPLX_ARG (utmp.data ()), rw));
         }
     }
 }
@@ -1546,8 +1546,8 @@
     (*current_liboctave_error_handler) ("qrdelete: index out of range");
 
   OCTAVE_LOCAL_BUFFER (double, rw, k);
-  F77_XFCN (zqrdec, ZQRDEC, (m, n, k, q.fortran_vec (), q.rows (),
-                             r.fortran_vec (), r.rows (), j + 1, rw));
+  F77_XFCN (zqrdec, ZQRDEC, (m, n, k, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                             F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1, rw));
 
   if (k < m)
     {
@@ -1587,8 +1587,8 @@
         {
           octave_idx_type ii = i;
           F77_XFCN (zqrdec, ZQRDEC, (m, n - ii, k == m ? k : k - ii,
-                                     q.fortran_vec (), q.rows (),
-                                     r.fortran_vec (), r.rows (),
+                                     F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                                     F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (),
                                      js(ii) + 1, rw));
         }
       if (k < m)
@@ -1621,9 +1621,9 @@
   r.resize (m + 1, n);
   ComplexRowVector utmp = u;
   OCTAVE_LOCAL_BUFFER (double, rw, k);
-  F77_XFCN (zqrinr, ZQRINR, (m, n, q.fortran_vec (), q.rows (),
-                             r.fortran_vec (), r.rows (),
-                             j + 1, utmp.fortran_vec (), rw));
+  F77_XFCN (zqrinr, ZQRINR, (m, n, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                             F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (),
+                             j + 1, F77_DBLE_CMPLX_ARG (utmp.fortran_vec ()), rw));
 
 }
 
@@ -1641,9 +1641,9 @@
 
   OCTAVE_LOCAL_BUFFER (Complex, w, m);
   OCTAVE_LOCAL_BUFFER (double, rw, m);
-  F77_XFCN (zqrder, ZQRDER, (m, n, q.fortran_vec (), q.rows (),
-                             r.fortran_vec (), r.rows (), j + 1,
-                             w, rw));
+  F77_XFCN (zqrder, ZQRDER, (m, n, F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                             F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1,
+                             F77_DBLE_CMPLX_ARG (w), rw));
 
   q.resize (m - 1, m - 1);
   r.resize (m - 1, n);
@@ -1663,9 +1663,9 @@
   OCTAVE_LOCAL_BUFFER (Complex, w, k);
   OCTAVE_LOCAL_BUFFER (double, rw, k);
   F77_XFCN (zqrshc, ZQRSHC, (m, n, k,
-                             q.fortran_vec (), q.rows (),
-                             r.fortran_vec (), r.rows (),
-                             i + 1, j + 1, w, rw));
+                             F77_DBLE_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                             F77_DBLE_CMPLX_ARG (r.fortran_vec ()), r.rows (),
+                             i + 1, j + 1, F77_DBLE_CMPLX_ARG (w), rw));
 }
 
 #endif
@@ -1726,15 +1726,15 @@
           octave_idx_type k = q.columns ();
           // workspace query.
           FloatComplex clwork;
-          F77_XFCN (cungqr, CUNGQR, (m, k, min_mn, q.fortran_vec (), m, tau,
-                                     &clwork, -1, info));
+          F77_XFCN (cungqr, CUNGQR, (m, k, min_mn, F77_CMPLX_ARG (q.fortran_vec ()), m, F77_CMPLX_ARG (tau),
+                                     F77_CMPLX_ARG (&clwork), -1, info));
 
           // allocate buffer and do the job.
           octave_idx_type lwork = clwork.real ();
           lwork = std::max (lwork, static_cast<octave_idx_type> (1));
           OCTAVE_LOCAL_BUFFER (FloatComplex, work, lwork);
-          F77_XFCN (cungqr, CUNGQR, (m, k, min_mn, q.fortran_vec (), m, tau,
-                                     work, lwork, info));
+          F77_XFCN (cungqr, CUNGQR, (m, k, min_mn, F77_CMPLX_ARG (q.fortran_vec ()), m, F77_CMPLX_ARG (tau),
+                                     F77_CMPLX_ARG (work), lwork, info));
         }
     }
 }
@@ -1759,15 +1759,15 @@
     {
       // workspace query.
       FloatComplex clwork;
-      F77_XFCN (cgeqrf, CGEQRF, (m, n, afact.fortran_vec (), m, tau,
-                                 &clwork, -1, info));
+      F77_XFCN (cgeqrf, CGEQRF, (m, n, F77_CMPLX_ARG (afact.fortran_vec ()), m, F77_CMPLX_ARG (tau),
+                                 F77_CMPLX_ARG (&clwork), -1, info));
 
       // allocate buffer and do the job.
       octave_idx_type lwork = clwork.real ();
       lwork = std::max (lwork, static_cast<octave_idx_type> (1));
       OCTAVE_LOCAL_BUFFER (FloatComplex, work, lwork);
-      F77_XFCN (cgeqrf, CGEQRF, (m, n, afact.fortran_vec (), m, tau,
-                                 work, lwork, info));
+      F77_XFCN (cgeqrf, CGEQRF, (m, n, F77_CMPLX_ARG (afact.fortran_vec ()), m, F77_CMPLX_ARG (tau),
+                                 F77_CMPLX_ARG (work), lwork, info));
     }
 
   form (n, afact, tau, qr_type);
@@ -1790,10 +1790,10 @@
   FloatComplexColumnVector vtmp = v;
   OCTAVE_LOCAL_BUFFER (FloatComplex, w, k);
   OCTAVE_LOCAL_BUFFER (float, rw, k);
-  F77_XFCN (cqr1up, CQR1UP, (m, n, k, q.fortran_vec (),
-                             m, r.fortran_vec (), k,
-                             utmp.fortran_vec (), vtmp.fortran_vec (),
-                             w, rw));
+  F77_XFCN (cqr1up, CQR1UP, (m, n, k, F77_CMPLX_ARG (q.fortran_vec ()),
+                             m, F77_CMPLX_ARG (r.fortran_vec ()), k,
+                             F77_CMPLX_ARG (utmp.fortran_vec ()), F77_CMPLX_ARG (vtmp.fortran_vec ()),
+                             F77_CMPLX_ARG (w), rw));
 }
 
 template <>
@@ -1813,10 +1813,10 @@
     {
       FloatComplexColumnVector utmp = u.column (i);
       FloatComplexColumnVector vtmp = v.column (i);
-      F77_XFCN (cqr1up, CQR1UP, (m, n, k, q.fortran_vec (),
-                                 m, r.fortran_vec (), k,
-                                 utmp.fortran_vec (), vtmp.fortran_vec (),
-                                 w, rw));
+      F77_XFCN (cqr1up, CQR1UP, (m, n, k, F77_CMPLX_ARG (q.fortran_vec ()),
+                                 m, F77_CMPLX_ARG (r.fortran_vec ()), k,
+                                 F77_CMPLX_ARG (utmp.fortran_vec ()), F77_CMPLX_ARG (vtmp.fortran_vec ()),
+                                 F77_CMPLX_ARG (w), rw));
     }
 }
 
@@ -1845,9 +1845,9 @@
 
   FloatComplexColumnVector utmp = u;
   OCTAVE_LOCAL_BUFFER (float, rw, k);
-  F77_XFCN (cqrinc, CQRINC, (m, n, k, q.fortran_vec (), q.rows (),
-                             r.fortran_vec (), r.rows (), j + 1,
-                             utmp.data (), rw));
+  F77_XFCN (cqrinc, CQRINC, (m, n, k, F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                             F77_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1,
+                             F77_CONST_CMPLX_ARG (utmp.data ()), rw));
 }
 
 template <>
@@ -1890,9 +1890,9 @@
         {
           octave_idx_type ii = i;
           F77_XFCN (cqrinc, CQRINC, (m, n + ii, std::min (kmax, k + ii),
-                                     q.fortran_vec (), q.rows (),
-                                     r.fortran_vec (), r.rows (), js(ii) + 1,
-                                     u.column (jsi(i)).data (), rw));
+                                     F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                                     F77_CMPLX_ARG (r.fortran_vec ()), r.rows (), js(ii) + 1,
+                                     F77_CONST_CMPLX_ARG (u.column (jsi(i)).data ()), rw));
         }
     }
 }
@@ -1909,8 +1909,8 @@
     (*current_liboctave_error_handler) ("qrdelete: index out of range");
 
   OCTAVE_LOCAL_BUFFER (float, rw, k);
-  F77_XFCN (cqrdec, CQRDEC, (m, n, k, q.fortran_vec (), q.rows (),
-                             r.fortran_vec (), r.rows (), j + 1, rw));
+  F77_XFCN (cqrdec, CQRDEC, (m, n, k, F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                             F77_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1, rw));
 
   if (k < m)
     {
@@ -1950,8 +1950,8 @@
         {
           octave_idx_type ii = i;
           F77_XFCN (cqrdec, CQRDEC, (m, n - ii, k == m ? k : k - ii,
-                                     q.fortran_vec (), q.rows (),
-                                     r.fortran_vec (), r.rows (),
+                                     F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                                     F77_CMPLX_ARG (r.fortran_vec ()), r.rows (),
                                      js(ii) + 1, rw));
         }
       if (k < m)
@@ -1984,9 +1984,9 @@
   r.resize (m + 1, n);
   FloatComplexRowVector utmp = u;
   OCTAVE_LOCAL_BUFFER (float, rw, k);
-  F77_XFCN (cqrinr, CQRINR, (m, n, q.fortran_vec (), q.rows (),
-                             r.fortran_vec (), r.rows (),
-                             j + 1, utmp.fortran_vec (), rw));
+  F77_XFCN (cqrinr, CQRINR, (m, n, F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                             F77_CMPLX_ARG (r.fortran_vec ()), r.rows (),
+                             j + 1, F77_CMPLX_ARG (utmp.fortran_vec ()), rw));
 
 }
 
@@ -2004,9 +2004,9 @@
 
   OCTAVE_LOCAL_BUFFER (FloatComplex, w, m);
   OCTAVE_LOCAL_BUFFER (float, rw, m);
-  F77_XFCN (cqrder, CQRDER, (m, n, q.fortran_vec (), q.rows (),
-                             r.fortran_vec (), r.rows (), j + 1,
-                             w, rw));
+  F77_XFCN (cqrder, CQRDER, (m, n, F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                             F77_CMPLX_ARG (r.fortran_vec ()), r.rows (), j + 1,
+                             F77_CMPLX_ARG (w), rw));
 
   q.resize (m - 1, m - 1);
   r.resize (m - 1, n);
@@ -2026,9 +2026,9 @@
   OCTAVE_LOCAL_BUFFER (FloatComplex, w, k);
   OCTAVE_LOCAL_BUFFER (float, rw, k);
   F77_XFCN (cqrshc, CQRSHC, (m, n, k,
-                             q.fortran_vec (), q.rows (),
-                             r.fortran_vec (), r.rows (),
-                             i + 1, j + 1, w, rw));
+                             F77_CMPLX_ARG (q.fortran_vec ()), q.rows (),
+                             F77_CMPLX_ARG (r.fortran_vec ()), r.rows (),
+                             i + 1, j + 1, F77_CMPLX_ARG (w), rw));
 }
 
 #endif
--- a/liboctave/numeric/qrp.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/qrp.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -220,17 +220,17 @@
 
       // workspace query.
       Complex clwork;
-      F77_XFCN (zgeqp3, ZGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 &clwork, -1, rwork, info));
+      F77_XFCN (zgeqp3, ZGEQP3, (m, n, F77_DBLE_CMPLX_ARG (afact.fortran_vec ()),
+                                 m, jpvt.fortran_vec (), F77_DBLE_CMPLX_ARG (tau),
+                                 F77_DBLE_CMPLX_ARG (&clwork), -1, rwork, info));
 
       // allocate buffer and do the job.
       octave_idx_type lwork = clwork.real ();
       lwork = std::max (lwork, static_cast<octave_idx_type> (1));
       OCTAVE_LOCAL_BUFFER (Complex, work, lwork);
-      F77_XFCN (zgeqp3, ZGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 work, lwork, rwork, info));
+      F77_XFCN (zgeqp3, ZGEQP3, (m, n, F77_DBLE_CMPLX_ARG (afact.fortran_vec ()),
+                                 m, jpvt.fortran_vec (), F77_DBLE_CMPLX_ARG (tau),
+                                 F77_DBLE_CMPLX_ARG (work), lwork, rwork, info));
     }
   else
     for (octave_idx_type i = 0; i < n; i++) jpvt(i) = i+1;
@@ -286,17 +286,17 @@
 
       // workspace query.
       FloatComplex clwork;
-      F77_XFCN (cgeqp3, CGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 &clwork, -1, rwork, info));
+      F77_XFCN (cgeqp3, CGEQP3, (m, n, F77_CMPLX_ARG (afact.fortran_vec ()),
+                                 m, jpvt.fortran_vec (), F77_CMPLX_ARG (tau),
+                                 F77_CMPLX_ARG (&clwork), -1, rwork, info));
 
       // allocate buffer and do the job.
       octave_idx_type lwork = clwork.real ();
       lwork = std::max (lwork, static_cast<octave_idx_type> (1));
       OCTAVE_LOCAL_BUFFER (FloatComplex, work, lwork);
-      F77_XFCN (cgeqp3, CGEQP3, (m, n, afact.fortran_vec (),
-                                 m, jpvt.fortran_vec (), tau,
-                                 work, lwork, rwork, info));
+      F77_XFCN (cgeqp3, CGEQP3, (m, n, F77_CMPLX_ARG (afact.fortran_vec ()),
+                                 m, jpvt.fortran_vec (), F77_CMPLX_ARG (tau),
+                                 F77_CMPLX_ARG (work), lwork, rwork, info));
     }
   else
     for (octave_idx_type i = 0; i < n; i++) jpvt(i) = i+1;
--- a/liboctave/numeric/schur.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/schur.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -385,8 +385,8 @@
                              F77_CONST_CHAR_ARG2 (&sort, 1),
                              selector,
                              F77_CONST_CHAR_ARG2 (&sense, 1),
-                             n, s, n, sdim, pw, q, n, rconde, rcondv,
-                             pwork, lwork, prwork, pbwork, info
+                             n, F77_DBLE_CMPLX_ARG (s), n, sdim, F77_DBLE_CMPLX_ARG (pw), F77_DBLE_CMPLX_ARG (q), n, rconde, rcondv,
+                             F77_DBLE_CMPLX_ARG (pwork), lwork, prwork, pbwork, info
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)));
@@ -412,8 +412,8 @@
       OCTAVE_LOCAL_BUFFER (double, c, n-1);
       OCTAVE_LOCAL_BUFFER (double, sx, n-1);
 
-      F77_XFCN (zrsf2csf, ZRSF2CSF, (n, s.fortran_vec (),
-                                     u.fortran_vec (), c, sx));
+      F77_XFCN (zrsf2csf, ZRSF2CSF, (n, F77_DBLE_CMPLX_ARG (s.fortran_vec ()),
+                                     F77_DBLE_CMPLX_ARG (u.fortran_vec ()), c, sx));
     }
 
   return schur<ComplexMatrix> (s, u);
@@ -492,8 +492,8 @@
                              F77_CONST_CHAR_ARG2 (&sort, 1),
                              selector,
                              F77_CONST_CHAR_ARG2 (&sense, 1),
-                             n, s, n, sdim, pw, q, n, rconde, rcondv,
-                             pwork, lwork, prwork, pbwork, info
+                             n, F77_CMPLX_ARG (s), n, sdim, F77_CMPLX_ARG (pw), F77_CMPLX_ARG (q), n, rconde, rcondv,
+                             F77_CMPLX_ARG (pwork), lwork, prwork, pbwork, info
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)
                              F77_CHAR_ARG_LEN (1)));
@@ -519,8 +519,8 @@
       OCTAVE_LOCAL_BUFFER (float, c, n-1);
       OCTAVE_LOCAL_BUFFER (float, sx, n-1);
 
-      F77_XFCN (crsf2csf, CRSF2CSF, (n, s.fortran_vec (),
-                                     u.fortran_vec (), c, sx));
+      F77_XFCN (crsf2csf, CRSF2CSF, (n, F77_CMPLX_ARG (s.fortran_vec ()),
+                                     F77_CMPLX_ARG (u.fortran_vec ()), c, sx));
     }
 
   return schur<FloatComplexMatrix> (s, u);
--- a/liboctave/numeric/svd.cc	Mon Jul 18 09:56:41 2016 -0400
+++ b/liboctave/numeric/svd.cc	Mon Jul 18 09:38:57 2016 -0400
@@ -517,8 +517,8 @@
 
       F77_XFCN (zgesvd, ZGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
                                  F77_CONST_CHAR_ARG2 (&jobv, 1),
-                                 m, n, tmp_data, m1, s_vec, u, m1, vt,
-                                 nrow_vt1, work.fortran_vec (), lwork,
+                                 m, n, F77_DBLE_CMPLX_ARG (tmp_data), m1, s_vec, F77_DBLE_CMPLX_ARG (u), m1, F77_DBLE_CMPLX_ARG (vt),
+                                 nrow_vt1, F77_DBLE_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  rwork.fortran_vec (), info
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)));
@@ -528,8 +528,8 @@
 
       F77_XFCN (zgesvd, ZGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
                                  F77_CONST_CHAR_ARG2 (&jobv, 1),
-                                 m, n, tmp_data, m1, s_vec, u, m1, vt,
-                                 nrow_vt1, work.fortran_vec (), lwork,
+                                 m, n, F77_DBLE_CMPLX_ARG (tmp_data), m1, s_vec, F77_DBLE_CMPLX_ARG (u), m1, F77_DBLE_CMPLX_ARG (vt),
+                                 nrow_vt1, F77_DBLE_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  rwork.fortran_vec (), info
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)));
@@ -549,8 +549,8 @@
       OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, 8*min_mn);
 
       F77_XFCN (zgesdd, ZGESDD, (F77_CONST_CHAR_ARG2 (&jobz, 1),
-                                 m, n, tmp_data, m1, s_vec, u, m1, vt,
-                                 nrow_vt1, work.fortran_vec (), lwork,
+                                 m, n, F77_DBLE_CMPLX_ARG (tmp_data), m1, s_vec, F77_DBLE_CMPLX_ARG (u), m1, F77_DBLE_CMPLX_ARG (vt),
+                                 nrow_vt1, F77_DBLE_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  rwork.fortran_vec (), iwork, info
                                  F77_CHAR_ARG_LEN (1)));
 
@@ -558,8 +558,8 @@
       work.resize (dim_vector (lwork, 1));
 
       F77_XFCN (zgesdd, ZGESDD, (F77_CONST_CHAR_ARG2 (&jobz, 1),
-                                 m, n, tmp_data, m1, s_vec, u, m1, vt,
-                                 nrow_vt1, work.fortran_vec (), lwork,
+                                 m, n, F77_DBLE_CMPLX_ARG (tmp_data), m1, s_vec, F77_DBLE_CMPLX_ARG (u), m1, F77_DBLE_CMPLX_ARG (vt),
+                                 nrow_vt1, F77_DBLE_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  rwork.fortran_vec (), iwork, info
                                  F77_CHAR_ARG_LEN (1)));
     }
@@ -656,8 +656,8 @@
 
       F77_XFCN (cgesvd, CGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
                                  F77_CONST_CHAR_ARG2 (&jobv, 1),
-                                 m, n, tmp_data, m1, s_vec, u, m1, vt,
-                                 nrow_vt1, work.fortran_vec (), lwork,
+                                 m, n, F77_CMPLX_ARG (tmp_data), m1, s_vec, F77_CMPLX_ARG (u), m1, F77_CMPLX_ARG (vt),
+                                 nrow_vt1, F77_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  rwork.fortran_vec (), info
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)));
@@ -667,8 +667,8 @@
 
       F77_XFCN (cgesvd, CGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
                                  F77_CONST_CHAR_ARG2 (&jobv, 1),
-                                 m, n, tmp_data, m1, s_vec, u, m1, vt,
-                                 nrow_vt1, work.fortran_vec (), lwork,
+                                 m, n, F77_CMPLX_ARG (tmp_data), m1, s_vec, F77_CMPLX_ARG (u), m1, F77_CMPLX_ARG (vt),
+                                 nrow_vt1, F77_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  rwork.fortran_vec (), info
                                  F77_CHAR_ARG_LEN (1)
                                  F77_CHAR_ARG_LEN (1)));
@@ -688,8 +688,8 @@
       OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, 8*min_mn);
 
       F77_XFCN (cgesdd, CGESDD, (F77_CONST_CHAR_ARG2 (&jobz, 1),
-                                 m, n, tmp_data, m1, s_vec, u, m1, vt,
-                                 nrow_vt1, work.fortran_vec (), lwork,
+                                 m, n, F77_CMPLX_ARG (tmp_data), m1, s_vec, F77_CMPLX_ARG (u), m1, F77_CMPLX_ARG (vt),
+                                 nrow_vt1, F77_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  rwork.fortran_vec (), iwork, info
                                  F77_CHAR_ARG_LEN (1)));
 
@@ -697,8 +697,8 @@
       work.resize (dim_vector (lwork, 1));
 
       F77_XFCN (cgesdd, CGESDD, (F77_CONST_CHAR_ARG2 (&jobz, 1),
-                                 m, n, tmp_data, m1, s_vec, u, m1, vt,
-                                 nrow_vt1, work.fortran_vec (), lwork,
+                                 m, n, F77_CMPLX_ARG (tmp_data), m1, s_vec, F77_CMPLX_ARG (u), m1, F77_CMPLX_ARG (vt),
+                                 nrow_vt1, F77_CMPLX_ARG (work.fortran_vec ()), lwork,
                                  rwork.fortran_vec (), iwork, info
                                  F77_CHAR_ARG_LEN (1)));
     }