From 34fffb77e70a9e4636393e4bc69c9e6081afc817 Mon Sep 17 00:00:00 2001 From: Kyungmin Lee Date: Sat, 9 May 2026 03:54:14 -0700 Subject: [PATCH] Fix INFO=-N in argument-validation INFO=-N value reported to XERBLA on a too-small workspace (or LRWORK) does not match the actual signature position of the argument being tested. Sites: - ?ORBDB4 / ?UNBDB4: LWORK test reported -14 (WORK), should be -15. - ?GGSVD3: LWORK.LT.1 test reported -24 (the INFO arg in S/D; IWORK in C/Z), should be -22 (LWORK). - ?ORCSD / ?UNCSD: LWORK test reported -22 (LDU2), should be -28 (LWORK). Z/C also report LRWORK as -24 (LDV1T), should be -30. - C/ZLAQZ0: LWORK test reported -19 (RWORK), should be -18. (S/DLAQZ0 use ALPHAR+ALPHAI instead of ALPHA, so LWORK is at position 19 there and -19 is already correct.) - C/ZLAQZ2: LWORK test reported -26 (RWORK), should be -25. Co-Authored-By: Claude Opus 4.7 (1M context) --- SRC/cggsvd3.f | 2 +- SRC/claqz0.f | 2 +- SRC/claqz2.f | 2 +- SRC/cunbdb4.f | 2 +- SRC/cuncsd.f | 4 ++-- SRC/dggsvd3.f | 2 +- SRC/dorbdb4.f | 2 +- SRC/dorcsd.f | 2 +- SRC/sggsvd3.f | 2 +- SRC/sorbdb4.f | 2 +- SRC/sorcsd.f | 2 +- SRC/zggsvd3.f | 2 +- SRC/zlaqz0.f | 2 +- SRC/zlaqz2.f | 2 +- SRC/zunbdb4.f | 2 +- SRC/zuncsd.f | 4 ++-- 16 files changed, 18 insertions(+), 18 deletions(-) diff --git a/SRC/cggsvd3.f b/SRC/cggsvd3.f index 3d64be11ad..cae00df676 100644 --- a/SRC/cggsvd3.f +++ b/SRC/cggsvd3.f @@ -421,7 +421,7 @@ SUBROUTINE CGGSVD3( JOBU, JOBV, JOBQ, M, N, P, K, L, A, LDA, B, ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.N ) ) THEN INFO = -20 ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN - INFO = -24 + INFO = -22 END IF * * Compute workspace diff --git a/SRC/claqz0.f b/SRC/claqz0.f index 1f6e09c622..9e60ed7a89 100644 --- a/SRC/claqz0.f +++ b/SRC/claqz0.f @@ -447,7 +447,7 @@ RECURSIVE SUBROUTINE CLAQZ0( WANTS, WANTQ, WANTZ, N, ILO, IHI, WORK( 1 ) = REAL( LWORKREQ ) RETURN ELSE IF ( LWORK .LT. LWORKREQ ) THEN - INFO = -19 + INFO = -18 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'CLAQZ0', INFO ) diff --git a/SRC/claqz2.f b/SRC/claqz2.f index f133d16263..498aa74e42 100644 --- a/SRC/claqz2.f +++ b/SRC/claqz2.f @@ -285,7 +285,7 @@ RECURSIVE SUBROUTINE CLAQZ2( ILSCHUR, ILQ, ILZ, N, ILO, IHI, WORK( 1 ) = CMPLX( LWORKREQ ) RETURN ELSE IF ( LWORK .LT. LWORKREQ ) THEN - INFO = -26 + INFO = -25 END IF IF( INFO.NE.0 ) THEN diff --git a/SRC/cunbdb4.f b/SRC/cunbdb4.f index 16e71860c1..0247c7c37c 100644 --- a/SRC/cunbdb4.f +++ b/SRC/cunbdb4.f @@ -280,7 +280,7 @@ SUBROUTINE CUNBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA, LWORKMIN = LWORKOPT WORK(1) = SROUNDUP_LWORK(LWORKOPT) IF( LWORK .LT. LWORKMIN .AND. .NOT.LQUERY ) THEN - INFO = -14 + INFO = -15 END IF END IF IF( INFO .NE. 0 ) THEN diff --git a/SRC/cuncsd.f b/SRC/cuncsd.f index 27d1212275..1fd12a120e 100644 --- a/SRC/cuncsd.f +++ b/SRC/cuncsd.f @@ -512,10 +512,10 @@ RECURSIVE SUBROUTINE CUNCSD( JOBU1, JOBU2, JOBV1T, JOBV2T, * IF( LWORK .LT. LWORKMIN $ .AND. .NOT. ( LQUERY .OR. LRQUERY ) ) THEN - INFO = -22 + INFO = -28 ELSE IF( LRWORK .LT. LRWORKMIN $ .AND. .NOT. ( LQUERY .OR. LRQUERY ) ) THEN - INFO = -24 + INFO = -30 ELSE LORGQRWORK = LWORK - IORGQR + 1 LORGLQWORK = LWORK - IORGLQ + 1 diff --git a/SRC/dggsvd3.f b/SRC/dggsvd3.f index 21ac309fcb..ffd157f737 100644 --- a/SRC/dggsvd3.f +++ b/SRC/dggsvd3.f @@ -416,7 +416,7 @@ SUBROUTINE DGGSVD3( JOBU, JOBV, JOBQ, M, N, P, K, L, A, LDA, B, ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.N ) ) THEN INFO = -20 ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN - INFO = -24 + INFO = -22 END IF * * Compute workspace diff --git a/SRC/dorbdb4.f b/SRC/dorbdb4.f index 6a218fa8ad..36ad19a09e 100644 --- a/SRC/dorbdb4.f +++ b/SRC/dorbdb4.f @@ -278,7 +278,7 @@ SUBROUTINE DORBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA, LWORKMIN = LWORKOPT WORK(1) = LWORKOPT IF( LWORK .LT. LWORKMIN .AND. .NOT.LQUERY ) THEN - INFO = -14 + INFO = -15 END IF END IF IF( INFO .NE. 0 ) THEN diff --git a/SRC/dorcsd.f b/SRC/dorcsd.f index 3a3fab2861..f0f77d7302 100644 --- a/SRC/dorcsd.f +++ b/SRC/dorcsd.f @@ -475,7 +475,7 @@ RECURSIVE SUBROUTINE DORCSD( JOBU1, JOBU2, JOBV1T, JOBV2T, WORK(1) = MAX(LWORKOPT,LWORKMIN) * IF( LWORK .LT. LWORKMIN .AND. .NOT. LQUERY ) THEN - INFO = -22 + INFO = -28 ELSE LORGQRWORK = LWORK - IORGQR + 1 LORGLQWORK = LWORK - IORGLQ + 1 diff --git a/SRC/sggsvd3.f b/SRC/sggsvd3.f index c3cf649384..041a356f61 100644 --- a/SRC/sggsvd3.f +++ b/SRC/sggsvd3.f @@ -417,7 +417,7 @@ SUBROUTINE SGGSVD3( JOBU, JOBV, JOBQ, M, N, P, K, L, A, LDA, B, ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.N ) ) THEN INFO = -20 ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN - INFO = -24 + INFO = -22 END IF * * Compute workspace diff --git a/SRC/sorbdb4.f b/SRC/sorbdb4.f index 4bd1affa45..42c79e9343 100644 --- a/SRC/sorbdb4.f +++ b/SRC/sorbdb4.f @@ -279,7 +279,7 @@ SUBROUTINE SORBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA, LWORKMIN = LWORKOPT WORK(1) = REAL( LWORKOPT ) IF( LWORK .LT. LWORKMIN .AND. .NOT.LQUERY ) THEN - INFO = -14 + INFO = -15 END IF END IF IF( INFO .NE. 0 ) THEN diff --git a/SRC/sorcsd.f b/SRC/sorcsd.f index eb91d1757f..2e386c2228 100644 --- a/SRC/sorcsd.f +++ b/SRC/sorcsd.f @@ -480,7 +480,7 @@ RECURSIVE SUBROUTINE SORCSD( JOBU1, JOBU2, JOBV1T, JOBV2T, WORK(1) = REAL( MAX(LWORKOPT,LWORKMIN) ) * IF( LWORK .LT. LWORKMIN .AND. .NOT. LQUERY ) THEN - INFO = -22 + INFO = -28 ELSE LORGQRWORK = LWORK - IORGQR + 1 LORGLQWORK = LWORK - IORGLQ + 1 diff --git a/SRC/zggsvd3.f b/SRC/zggsvd3.f index 48d33e4040..4715471171 100644 --- a/SRC/zggsvd3.f +++ b/SRC/zggsvd3.f @@ -420,7 +420,7 @@ SUBROUTINE ZGGSVD3( JOBU, JOBV, JOBQ, M, N, P, K, L, A, LDA, B, ELSE IF( LDQ.LT.1 .OR. ( WANTQ .AND. LDQ.LT.N ) ) THEN INFO = -20 ELSE IF( LWORK.LT.1 .AND. .NOT.LQUERY ) THEN - INFO = -24 + INFO = -22 END IF * * Compute workspace diff --git a/SRC/zlaqz0.f b/SRC/zlaqz0.f index c5a888bc37..098df828ab 100644 --- a/SRC/zlaqz0.f +++ b/SRC/zlaqz0.f @@ -448,7 +448,7 @@ RECURSIVE SUBROUTINE ZLAQZ0( WANTS, WANTQ, WANTZ, N, ILO, IHI, WORK( 1 ) = DBLE( LWORKREQ ) RETURN ELSE IF ( LWORK .LT. LWORKREQ ) THEN - INFO = -19 + INFO = -18 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'ZLAQZ0', INFO ) diff --git a/SRC/zlaqz2.f b/SRC/zlaqz2.f index 0faec2770f..640ab2f927 100644 --- a/SRC/zlaqz2.f +++ b/SRC/zlaqz2.f @@ -285,7 +285,7 @@ RECURSIVE SUBROUTINE ZLAQZ2( ILSCHUR, ILQ, ILZ, N, ILO, IHI, WORK( 1 ) = LWORKREQ RETURN ELSE IF ( LWORK .LT. LWORKREQ ) THEN - INFO = -26 + INFO = -25 END IF IF( INFO.NE.0 ) THEN diff --git a/SRC/zunbdb4.f b/SRC/zunbdb4.f index 31d8ec40b7..0a99949aaf 100644 --- a/SRC/zunbdb4.f +++ b/SRC/zunbdb4.f @@ -280,7 +280,7 @@ SUBROUTINE ZUNBDB4( M, P, Q, X11, LDX11, X21, LDX21, THETA, LWORKMIN = LWORKOPT WORK(1) = LWORKOPT IF( LWORK .LT. LWORKMIN .AND. .NOT.LQUERY ) THEN - INFO = -14 + INFO = -15 END IF END IF IF( INFO .NE. 0 ) THEN diff --git a/SRC/zuncsd.f b/SRC/zuncsd.f index 4055a4bbb0..81c09e7d72 100644 --- a/SRC/zuncsd.f +++ b/SRC/zuncsd.f @@ -510,10 +510,10 @@ RECURSIVE SUBROUTINE ZUNCSD( JOBU1, JOBU2, JOBV1T, JOBV2T, * IF( LWORK .LT. LWORKMIN $ .AND. .NOT. ( LQUERY .OR. LRQUERY ) ) THEN - INFO = -22 + INFO = -28 ELSE IF( LRWORK .LT. LRWORKMIN $ .AND. .NOT. ( LQUERY .OR. LRQUERY ) ) THEN - INFO = -24 + INFO = -30 ELSE LORGQRWORK = LWORK - IORGQR + 1 LORGLQWORK = LWORK - IORGLQ + 1