From 01464c72a64afc74196f7737bd054b0f8445096b Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 13:43:06 +0200 Subject: [PATCH 01/16] test_determinant: gcc-15 fix --- test/linalg/test_linalg_determinant.fypp | 27 +++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/test/linalg/test_linalg_determinant.fypp b/test/linalg/test_linalg_determinant.fypp index 6b5c954bc..c9ee608ac 100644 --- a/test/linalg/test_linalg_determinant.fypp +++ b/test/linalg/test_linalg_determinant.fypp @@ -23,13 +23,13 @@ module test_linalg_determinant #:for rk,rt in RC_KINDS_TYPES #:if rk!="xdp" - tests = [tests,new_unittest("$eye_det_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_determinant)] - tests = [tests,new_unittest("$eye_det_multiple_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_multiple)] + call add_test(tests,new_unittest("$eye_det_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_determinant)) + call add_test(tests,new_unittest("$eye_det_multiple_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_multiple)) #:endif #:endfor #:for ck,ct in CMPLX_KINDS_TYPES #:if ck!="xdp" - tests = [tests,new_unittest("$complex_det_${rt[0]}$${rk}$",test_${ct[0]}$${ck}$_complex_determinant)] + call add_test(tests,new_unittest("$complex_det_${rt[0]}$${rk}$",test_${ct[0]}$${ck}$_complex_determinant)) #:endif #: endfor @@ -143,6 +143,27 @@ module test_linalg_determinant #:endif #:endfor + + ! gcc-15 bugfix utility + pure subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test end module test_linalg_determinant From 9d657a51b23663e48f803675de72fca6dad2dd02 Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 13:44:23 +0200 Subject: [PATCH 02/16] linalg-inverse: gcc-15 test fix --- test/linalg/test_linalg_inverse.fypp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/test/linalg/test_linalg_inverse.fypp b/test/linalg/test_linalg_inverse.fypp index e59b03b7f..b52e5250f 100644 --- a/test/linalg/test_linalg_inverse.fypp +++ b/test/linalg/test_linalg_inverse.fypp @@ -22,9 +22,9 @@ module test_linalg_inverse allocate(tests(0)) #:for rk,rt,ri in RC_KINDS_TYPES - tests = [tests,new_unittest("${ri}$_eye_inverse",test_${ri}$_eye_inverse), & - new_unittest("${ri}$_singular_inverse",test_${ri}$_singular_inverse), & - new_unittest("${ri}$_random_spd_inverse",test_${ri}$_random_spd_inverse)] + call add_test(tests,new_unittest("${ri}$_eye_inverse",test_${ri}$_eye_inverse)) + call add_test(tests,new_unittest("${ri}$_singular_inverse",test_${ri}$_singular_inverse)) + call add_test(tests,new_unittest("${ri}$_random_spd_inverse",test_${ri}$_random_spd_inverse)) #:endfor end subroutine test_inverse_matrix @@ -291,6 +291,27 @@ module test_linalg_inverse #:endfor + ! gcc-15 bugfix utility + pure subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test + end module test_linalg_inverse program test_inv From fc9cb6e49b7e7668fc69931cf674111c58c44009 Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 13:45:13 +0200 Subject: [PATCH 03/16] linalg-lstsq: gcc-15 test fix --- test/linalg/test_linalg_lstsq.fypp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/test/linalg/test_linalg_lstsq.fypp b/test/linalg/test_linalg_lstsq.fypp index c8766da04..15a7a2f28 100644 --- a/test/linalg/test_linalg_lstsq.fypp +++ b/test/linalg/test_linalg_lstsq.fypp @@ -21,11 +21,11 @@ module test_linalg_least_squares allocate(tests(0)) - tests = [tests,new_unittest("issue_823",test_issue_823)] + call add_test(tests,new_unittest("issue_823",test_issue_823)) #:for rk,rt,ri in REAL_KINDS_TYPES - tests = [tests,new_unittest("least_squares_${ri}$",test_lstsq_one_${ri}$), & - new_unittest("least_squares_randm_${ri}$",test_lstsq_random_${ri}$)] + call add_test(tests,new_unittest("least_squares_${ri}$",test_lstsq_one_${ri}$)) + call add_test(tests,new_unittest("least_squares_randm_${ri}$",test_lstsq_random_${ri}$)) #:endfor end subroutine test_least_squares @@ -139,6 +139,27 @@ module test_linalg_least_squares end subroutine test_issue_823 + ! gcc-15 bugfix utility + pure subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test + end module test_linalg_least_squares program test_lstsq From 1ab94a77a45da867348728ca9b78a9c012a2a71a Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 13:45:55 +0200 Subject: [PATCH 04/16] linalg-mnorm: gcc-15 test fix --- test/linalg/test_linalg_mnorm.fypp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/test/linalg/test_linalg_mnorm.fypp b/test/linalg/test_linalg_mnorm.fypp index ecfe2810a..4236c0719 100644 --- a/test/linalg/test_linalg_mnorm.fypp +++ b/test/linalg/test_linalg_mnorm.fypp @@ -18,9 +18,9 @@ module test_linalg_mnorm allocate(tests(0)) #:for rk,rt,ri in RC_KINDS_TYPES - tests = [tests,new_unittest("test_matrix_norms_${ri}$",test_matrix_norms_${ri}$)] + call add_test(tests,new_unittest("test_matrix_norms_${ri}$",test_matrix_norms_${ri}$)) #:for rank in range(3, MAXRANK) - tests = [tests,new_unittest("test_mnorm_${ri}$_${rank}$d",test_mnorm_${ri}$_${rank}$d)] + call add_test(tests,new_unittest("test_mnorm_${ri}$_${rank}$d",test_mnorm_${ri}$_${rank}$d)) #:endfor #:endfor @@ -135,6 +135,27 @@ module test_linalg_mnorm #:endfor + ! gcc-15 bugfix utility + pure subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test + end module test_linalg_mnorm program test_mnorm From 1f09e9e554e043cd92944bb04bf34e096bb2177b Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 13:48:39 +0200 Subject: [PATCH 05/16] linalg-norm: gcc-15 test fix --- test/linalg/test_linalg_norm.fypp | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/test/linalg/test_linalg_norm.fypp b/test/linalg/test_linalg_norm.fypp index 0ec88c2ec..dcacaf91a 100644 --- a/test/linalg/test_linalg_norm.fypp +++ b/test/linalg/test_linalg_norm.fypp @@ -32,16 +32,16 @@ module test_linalg_norm allocate(tests(0)) #:for rk,rt,ri in RC_KINDS_TYPES - tests = [tests,new_unittest("strided_1d_norm_${ri}$",test_strided_1d_${ri}$)] + call add_test(tests,new_unittest("strided_1d_norm_${ri}$",test_strided_1d_${ri}$)) #:for rank in range(1, MAXRANK) - tests = [tests,new_unittest("norm_${ri}$_${rank}$d",test_norm_${ri}$_${rank}$d)] + call add_test(tests,new_unittest("norm_${ri}$_${rank}$d",test_norm_${ri}$_${rank}$d)) #:endfor #:for rank in range(2, MAXRANK) #:if rt.startswith('real') - tests = [tests,new_unittest("norm2_${ri}$_${rank}$d",test_norm2_${ri}$_${rank}$d)] + call add_test(tests,new_unittest("norm2_${ri}$_${rank}$d",test_norm2_${ri}$_${rank}$d)) #:endif - tests = [tests,new_unittest("maxabs_${ri}$_${rank}$d",test_maxabs_${ri}$_${rank}$d)] - tests = [tests,new_unittest("norm_dimmed_${ri}$_${rank}$d",test_norm_dimmed_${ri}$_${rank}$d)] + call add_test(tests,new_unittest("maxabs_${ri}$_${rank}$d",test_maxabs_${ri}$_${rank}$d)) + call add_test(tests,new_unittest("norm_dimmed_${ri}$_${rank}$d",test_norm_dimmed_${ri}$_${rank}$d)) #:endfor #:endfor @@ -268,6 +268,26 @@ module test_linalg_norm #:endfor #:endfor + ! gcc-15 bugfix utility + pure subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test end module test_linalg_norm From f83a79391d7fa2e101f34ead748bde3241c65a4b Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 13:49:38 +0200 Subject: [PATCH 06/16] linalg-pinv: gcc-15 test fix --- test/linalg/test_linalg_pseudoinverse.fypp | 31 ++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/test/linalg/test_linalg_pseudoinverse.fypp b/test/linalg/test_linalg_pseudoinverse.fypp index d5cafeca6..39af2a070 100644 --- a/test/linalg/test_linalg_pseudoinverse.fypp +++ b/test/linalg/test_linalg_pseudoinverse.fypp @@ -21,13 +21,13 @@ module test_linalg_pseudoinverse allocate(tests(0)) #:for rk,rt,ri in REAL_KINDS_TYPES - tests = [tests,new_unittest("${ri}$_eye_pseudoinverse",test_${ri}$_eye_pseudoinverse)] + call add_test(tests,new_unittest("${ri}$_eye_pseudoinverse",test_${ri}$_eye_pseudoinverse)) #:endfor #:for rk,rt,ri in RC_KINDS_TYPES - tests = [tests,new_unittest("${ri}$_square_pseudoinverse",test_${ri}$_square_pseudoinverse), & - new_unittest("${ri}$_tall_pseudoinverse",test_${ri}$_tall_pseudoinverse), & - new_unittest("${ri}$_wide_pseudoinverse",test_${ri}$_wide_pseudoinverse), & - new_unittest("${ri}$_singular_pseudoinverse",test_${ri}$_singular_pseudoinverse)] + call add_test(tests,new_unittest("${ri}$_square_pseudoinverse",test_${ri}$_square_pseudoinverse)) + call add_test(tests,new_unittest("${ri}$_tall_pseudoinverse",test_${ri}$_tall_pseudoinverse)) + call add_test(tests,new_unittest("${ri}$_wide_pseudoinverse",test_${ri}$_wide_pseudoinverse)) + call add_test(tests,new_unittest("${ri}$_singular_pseudoinverse",test_${ri}$_singular_pseudoinverse)) #:endfor end subroutine test_pseudoinverse_matrix @@ -218,6 +218,27 @@ module test_linalg_pseudoinverse #:endfor + ! gcc-15 bugfix utility + pure subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test + end module test_linalg_pseudoinverse program test_inv From 47aed22898ff6d116b1e249bbb67c48acd071dda Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 13:50:19 +0200 Subject: [PATCH 07/16] linalg-qr: gcc-15 test fix --- test/linalg/test_linalg_qr.fypp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/test/linalg/test_linalg_qr.fypp b/test/linalg/test_linalg_qr.fypp index 8db1d32ad..4cdefa500 100644 --- a/test/linalg/test_linalg_qr.fypp +++ b/test/linalg/test_linalg_qr.fypp @@ -22,7 +22,7 @@ module test_linalg_qr allocate(tests(0)) #:for rk,rt,ri in RC_KINDS_TYPES - tests = [tests,new_unittest("qr_random_${ri}$",test_qr_random_${ri}$)] + call add_test(tests,new_unittest("qr_random_${ri}$",test_qr_random_${ri}$)) #:endfor end subroutine test_qr_factorization @@ -110,6 +110,26 @@ module test_linalg_qr #:endfor + ! gcc-15 bugfix utility + pure subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test end module test_linalg_qr From 7a9b191e4731e54e71b5353f2748308979059473 Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 13:50:59 +0200 Subject: [PATCH 08/16] linalg-schur: gcc-15 test fix --- test/linalg/test_linalg_schur.fypp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/test/linalg/test_linalg_schur.fypp b/test/linalg/test_linalg_schur.fypp index 066077beb..b1f1acd06 100644 --- a/test/linalg/test_linalg_schur.fypp +++ b/test/linalg/test_linalg_schur.fypp @@ -22,9 +22,9 @@ module test_linalg_schur allocate(tests(0)) #:for rk,rt,ri in RC_KINDS_TYPES - tests = [tests,new_unittest("schur_api_${ri}$",test_schur_api_${ri}$), & - new_unittest("schur_random_${ri}$",test_schur_random_${ri}$), & - new_unittest("schur_symmetric_${ri}$",test_schur_symmetric_${ri}$)] + call add_test(tests,new_unittest("schur_api_${ri}$",test_schur_api_${ri}$)) + call add_test(tests,new_unittest("schur_random_${ri}$",test_schur_random_${ri}$)) + call add_test(tests,new_unittest("schur_symmetric_${ri}$",test_schur_symmetric_${ri}$)) #:endfor end subroutine test_schur_decomposition @@ -205,9 +205,29 @@ module test_linalg_schur end subroutine test_schur_symmetric_${ri}$ - #:endfor + ! gcc-15 bugfix utility + pure subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test + end module test_linalg_schur program test_schur From 3a53c6ba9cf51354ba9dc2675ceee3d45549f8f6 Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 13:51:49 +0200 Subject: [PATCH 09/16] linalg-solve: gcc-15 test fix --- test/linalg/test_linalg_solve.fypp | 31 +++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/test/linalg/test_linalg_solve.fypp b/test/linalg/test_linalg_solve.fypp index 49d10abb4..dd75c24c1 100644 --- a/test/linalg/test_linalg_solve.fypp +++ b/test/linalg/test_linalg_solve.fypp @@ -22,13 +22,13 @@ module test_linalg_solve allocate(tests(0)) #:for rk,rt,ri in REAL_KINDS_TYPES - tests = [tests,new_unittest("solve_${ri}$",test_${ri}$_solve), & - new_unittest("solve_${ri}$_multiple",test_${ri}$_solve_multiple)] + call add_test(tests,new_unittest("solve_${ri}$",test_${ri}$_solve)) + call add_test(tests,new_unittest("solve_${ri}$_multiple",test_${ri}$_solve_multiple)) #:endfor #:for ck,ct,ci in CMPLX_KINDS_TYPES - tests = [tests,new_unittest("solve_complex_${ci}$",test_${ci}$_solve), & - new_unittest("solve_2x2_complex_${ci}$",test_2x2_${ci}$_solve)] + call add_test(tests,new_unittest("solve_complex_${ci}$",test_${ci}$_solve)) + call add_test(tests,new_unittest("solve_2x2_complex_${ci}$",test_2x2_${ci}$_solve)) #:endfor end subroutine test_linear_systems @@ -150,7 +150,28 @@ module test_linalg_solve end subroutine test_2x2_${ri}$_solve #:endfor - + + ! gcc-15 bugfix utility + pure subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test + end module test_linalg_solve program test_solve From fd565cc58b039c6d2f026c3002997438205d81af Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 13:52:33 +0200 Subject: [PATCH 10/16] linalg-svd: gcc-15 test fix --- test/linalg/test_linalg_svd.fypp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/test/linalg/test_linalg_svd.fypp b/test/linalg/test_linalg_svd.fypp index f91a87322..dfb372887 100644 --- a/test/linalg/test_linalg_svd.fypp +++ b/test/linalg/test_linalg_svd.fypp @@ -20,15 +20,15 @@ module test_linalg_svd allocate(tests(0)) #:for rk,rt,ri in REAL_KINDS_TYPES - tests = [tests,new_unittest("test_svd_${ri}$",test_svd_${ri}$)] + call add_test(tests,new_unittest("test_svd_${ri}$",test_svd_${ri}$)) #:endfor #:for ck,ct,ci in CMPLX_KINDS_TYPES - tests = [tests,new_unittest("test_complex_svd_${ci}$",test_complex_svd_${ci}$)] + call add_test(tests,new_unittest("test_complex_svd_${ci}$",test_complex_svd_${ci}$)) #:endfor #:for rk,rt,ri in RC_KINDS_TYPES - tests = [tests,new_unittest("test_svd_row_${ri}$",test_svd_row_${ri}$)] + call add_test(tests,new_unittest("test_svd_row_${ri}$",test_svd_row_${ri}$)) #:endfor end subroutine test_svd @@ -264,6 +264,26 @@ module test_linalg_svd #:endfor + ! gcc-15 bugfix utility + pure subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test end module test_linalg_svd From aa5beee6f1a8d27180adc322736481a16f7457c7 Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 15:06:07 +0200 Subject: [PATCH 11/16] silence gcc-15 warnings --- CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index f14326533..a0039d0b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,13 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU AND CMAKE_Fortran_COMPILER_VERSION VER message(FATAL_ERROR "GCC Version 9 or newer required") endif() +# --- silence gfortran-15 argument-mismatch warnings +if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU + AND CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 15.0 + AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 16.0) + add_compile_options("$<$:-Wno-external-argument-mismatch>") +endif() + # --- compiler feature checks include(CheckFortranSourceCompiles) include(CheckFortranSourceRuns) From 3bb74d626ac37ec3d961c99170b9c753b6a6b361 Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 15:13:01 +0200 Subject: [PATCH 12/16] ifort fix Revert "ifort fix" This reverts commit 8f16217a23f17920a2ad2e2afbb66e456b604f27. remove pure --- test/linalg/test_linalg_determinant.fypp | 2 +- test/linalg/test_linalg_inverse.fypp | 2 +- test/linalg/test_linalg_lstsq.fypp | 2 +- test/linalg/test_linalg_mnorm.fypp | 2 +- test/linalg/test_linalg_norm.fypp | 2 +- test/linalg/test_linalg_pseudoinverse.fypp | 2 +- test/linalg/test_linalg_qr.fypp | 2 +- test/linalg/test_linalg_schur.fypp | 2 +- test/linalg/test_linalg_solve.fypp | 2 +- test/linalg/test_linalg_svd.fypp | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/test/linalg/test_linalg_determinant.fypp b/test/linalg/test_linalg_determinant.fypp index c9ee608ac..15c0ed281 100644 --- a/test/linalg/test_linalg_determinant.fypp +++ b/test/linalg/test_linalg_determinant.fypp @@ -145,7 +145,7 @@ module test_linalg_determinant #:endfor ! gcc-15 bugfix utility - pure subroutine add_test(tests,new_test) + subroutine add_test(tests,new_test) type(unittest_type), allocatable, intent(inout) :: tests(:) type(unittest_type), intent(in) :: new_test diff --git a/test/linalg/test_linalg_inverse.fypp b/test/linalg/test_linalg_inverse.fypp index b52e5250f..f46da3c83 100644 --- a/test/linalg/test_linalg_inverse.fypp +++ b/test/linalg/test_linalg_inverse.fypp @@ -292,7 +292,7 @@ module test_linalg_inverse #:endfor ! gcc-15 bugfix utility - pure subroutine add_test(tests,new_test) + subroutine add_test(tests,new_test) type(unittest_type), allocatable, intent(inout) :: tests(:) type(unittest_type), intent(in) :: new_test diff --git a/test/linalg/test_linalg_lstsq.fypp b/test/linalg/test_linalg_lstsq.fypp index 15a7a2f28..7ec41a2e8 100644 --- a/test/linalg/test_linalg_lstsq.fypp +++ b/test/linalg/test_linalg_lstsq.fypp @@ -140,7 +140,7 @@ module test_linalg_least_squares end subroutine test_issue_823 ! gcc-15 bugfix utility - pure subroutine add_test(tests,new_test) + subroutine add_test(tests,new_test) type(unittest_type), allocatable, intent(inout) :: tests(:) type(unittest_type), intent(in) :: new_test diff --git a/test/linalg/test_linalg_mnorm.fypp b/test/linalg/test_linalg_mnorm.fypp index 4236c0719..4df3c95c5 100644 --- a/test/linalg/test_linalg_mnorm.fypp +++ b/test/linalg/test_linalg_mnorm.fypp @@ -136,7 +136,7 @@ module test_linalg_mnorm #:endfor ! gcc-15 bugfix utility - pure subroutine add_test(tests,new_test) + subroutine add_test(tests,new_test) type(unittest_type), allocatable, intent(inout) :: tests(:) type(unittest_type), intent(in) :: new_test diff --git a/test/linalg/test_linalg_norm.fypp b/test/linalg/test_linalg_norm.fypp index dcacaf91a..feb9564ef 100644 --- a/test/linalg/test_linalg_norm.fypp +++ b/test/linalg/test_linalg_norm.fypp @@ -269,7 +269,7 @@ module test_linalg_norm #:endfor ! gcc-15 bugfix utility - pure subroutine add_test(tests,new_test) + subroutine add_test(tests,new_test) type(unittest_type), allocatable, intent(inout) :: tests(:) type(unittest_type), intent(in) :: new_test diff --git a/test/linalg/test_linalg_pseudoinverse.fypp b/test/linalg/test_linalg_pseudoinverse.fypp index 39af2a070..55908c5f1 100644 --- a/test/linalg/test_linalg_pseudoinverse.fypp +++ b/test/linalg/test_linalg_pseudoinverse.fypp @@ -219,7 +219,7 @@ module test_linalg_pseudoinverse #:endfor ! gcc-15 bugfix utility - pure subroutine add_test(tests,new_test) + subroutine add_test(tests,new_test) type(unittest_type), allocatable, intent(inout) :: tests(:) type(unittest_type), intent(in) :: new_test diff --git a/test/linalg/test_linalg_qr.fypp b/test/linalg/test_linalg_qr.fypp index 4cdefa500..fb9c97656 100644 --- a/test/linalg/test_linalg_qr.fypp +++ b/test/linalg/test_linalg_qr.fypp @@ -111,7 +111,7 @@ module test_linalg_qr #:endfor ! gcc-15 bugfix utility - pure subroutine add_test(tests,new_test) + subroutine add_test(tests,new_test) type(unittest_type), allocatable, intent(inout) :: tests(:) type(unittest_type), intent(in) :: new_test diff --git a/test/linalg/test_linalg_schur.fypp b/test/linalg/test_linalg_schur.fypp index b1f1acd06..3876a8a38 100644 --- a/test/linalg/test_linalg_schur.fypp +++ b/test/linalg/test_linalg_schur.fypp @@ -208,7 +208,7 @@ module test_linalg_schur #:endfor ! gcc-15 bugfix utility - pure subroutine add_test(tests,new_test) + subroutine add_test(tests,new_test) type(unittest_type), allocatable, intent(inout) :: tests(:) type(unittest_type), intent(in) :: new_test diff --git a/test/linalg/test_linalg_solve.fypp b/test/linalg/test_linalg_solve.fypp index dd75c24c1..728968e99 100644 --- a/test/linalg/test_linalg_solve.fypp +++ b/test/linalg/test_linalg_solve.fypp @@ -152,7 +152,7 @@ module test_linalg_solve #:endfor ! gcc-15 bugfix utility - pure subroutine add_test(tests,new_test) + subroutine add_test(tests,new_test) type(unittest_type), allocatable, intent(inout) :: tests(:) type(unittest_type), intent(in) :: new_test diff --git a/test/linalg/test_linalg_svd.fypp b/test/linalg/test_linalg_svd.fypp index dfb372887..ea69e6bef 100644 --- a/test/linalg/test_linalg_svd.fypp +++ b/test/linalg/test_linalg_svd.fypp @@ -265,7 +265,7 @@ module test_linalg_svd #:endfor ! gcc-15 bugfix utility - pure subroutine add_test(tests,new_test) + subroutine add_test(tests,new_test) type(unittest_type), allocatable, intent(inout) :: tests(:) type(unittest_type), intent(in) :: new_test From a12c9618cfac075c6af1958adee446f544dcedec Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 15:32:11 +0200 Subject: [PATCH 13/16] eigenvalues, cholesky: gcc-15 fix --- test/linalg/test_linalg_cholesky.fypp | 22 +++++++++++++- test/linalg/test_linalg_eigenvalues.fypp | 38 +++++++++++++++++------- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/test/linalg/test_linalg_cholesky.fypp b/test/linalg/test_linalg_cholesky.fypp index 638d73618..cdcb33d8f 100644 --- a/test/linalg/test_linalg_cholesky.fypp +++ b/test/linalg/test_linalg_cholesky.fypp @@ -22,7 +22,7 @@ module test_linalg_cholesky allocate(tests(0)) #:for rk,rt,ri in RC_KINDS_TYPES - tests = [tests,new_unittest("least_cholesky_${ri}$",test_cholesky_${ri}$)] + call add_test(tests,new_unittest("least_cholesky_${ri}$",test_cholesky_${ri}$)) #:endfor end subroutine test_cholesky_factorization @@ -66,6 +66,26 @@ module test_linalg_cholesky #:endfor + ! gcc-15 bugfix utility + subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test end module test_linalg_cholesky diff --git a/test/linalg/test_linalg_eigenvalues.fypp b/test/linalg/test_linalg_eigenvalues.fypp index 33e02df06..ef728d6a0 100644 --- a/test/linalg/test_linalg_eigenvalues.fypp +++ b/test/linalg/test_linalg_eigenvalues.fypp @@ -21,17 +21,17 @@ module test_linalg_eigenvalues allocate(tests(0)) #:for rk,rt,ri in REAL_KINDS_TYPES - tests = [tests,new_unittest("test_eig_real_${ri}$",test_eig_real_${ri}$), & - new_unittest("test_eigvals_identity_${ri}$",test_eigvals_identity_${ri}$), & - new_unittest("test_eigvals_diagonal_B_${ri}$",test_eigvals_diagonal_B_${ri}$), & - new_unittest("test_eigvals_nondiagonal_B_${ri}$",test_eigvals_nondiagonal_B_${ri}$), & - new_unittest("test_eigh_real_${ri}$",test_eigh_real_${ri}$)] + call add_test(tests,new_unittest("test_eig_real_${ri}$",test_eig_real_${ri}$)) + call add_test(tests,new_unittest("test_eigvals_identity_${ri}$",test_eigvals_identity_${ri}$)) + call add_test(tests,new_unittest("test_eigvals_diagonal_B_${ri}$",test_eigvals_diagonal_B_${ri}$)) + call add_test(tests,new_unittest("test_eigvals_nondiagonal_B_${ri}$",test_eigvals_nondiagonal_B_${ri}$)) + call add_test(tests,new_unittest("test_eigh_real_${ri}$",test_eigh_real_${ri}$)) #: endfor #:for ck,ct,ci in CMPLX_KINDS_TYPES - tests = [tests,new_unittest("test_eig_complex_${ci}$",test_eig_complex_${ci}$), & - new_unittest("test_eig_generalized_complex_${ci}$",test_eigvals_generalized_complex_${ci}$), & - new_unittest("test_eig_issue_927_${ci}$",test_issue_927_${ci}$)] + call add_test(tests,new_unittest("test_eig_complex_${ci}$",test_eig_complex_${ci}$)) + call add_test(tests,new_unittest("test_eig_generalized_complex_${ci}$",test_eigvals_generalized_complex_${ci}$)) + call add_test(tests,new_unittest("test_eig_issue_927_${ci}$",test_issue_927_${ci}$)) #: endfor end subroutine test_eig_eigh @@ -347,8 +347,26 @@ module test_linalg_eigenvalues #:endfor - - + ! gcc-15 bugfix utility + subroutine add_test(tests,new_test) + type(unittest_type), allocatable, intent(inout) :: tests(:) + type(unittest_type), intent(in) :: new_test + + integer :: n + type(unittest_type), allocatable :: new_tests(:) + + if (allocated(tests)) then + n = size(tests) + else + n = 0 + end if + + allocate(new_tests(n+1)) + if (n>0) new_tests(1:n) = tests(1:n) + new_tests(1+n) = new_test + call move_alloc(from=new_tests,to=tests) + + end subroutine add_test end module test_linalg_eigenvalues From 0228a3e11cbeeab07a7da453195dc3ff65d94a56 Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 15:46:11 +0200 Subject: [PATCH 14/16] insert_at: gcc-15 fix --- test/stringlist/test_insert_at.f90 | 38 +++++++++++++++++------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/test/stringlist/test_insert_at.f90 b/test/stringlist/test_insert_at.f90 index 231ac0e9c..49a254de0 100644 --- a/test/stringlist/test_insert_at.f90 +++ b/test/stringlist/test_insert_at.f90 @@ -204,42 +204,41 @@ subroutine test_insert_at_array integer, parameter :: first = -100 integer, parameter :: last = 100 integer, parameter :: stride = 4 + type(string_type) :: all_strings(first:last) write (*,*) "test_insert_at_array: Starting work_list!" + + do concurrent (j=first:last) + all_strings(j) = string_type( to_string(j) ) + end do - call work_list%insert_at( list_head, & - & [ ( string_type( to_string(j) ), j = first, first + stride - 1 ) ] ) + call work_list%insert_at( list_head, all_strings(first:first+stride-1) ) call compare_list( work_list, first, first + stride, 5 ) - call work_list%insert_at( list_tail, & - & [ ( string_type( to_string(j) ), j = last - stride, last - 1 ) ] ) + call work_list%insert_at( list_tail, all_strings(last-stride:last-1) ) do i = first + stride, last - stride - 1, stride - call work_list%insert_at( fidx( i - first + 1 ), & - & [ ( string_type( to_string(j) ), j = i, i + stride - 1 ) ] ) + call work_list%insert_at( fidx( i - first + 1 ), all_strings(i:i+stride-1) ) end do - call work_list%insert_at( list_tail, [ to_string(last) ] ) + call work_list%insert_at( list_tail, all_strings(last:last) ) call compare_list( work_list, first, last + 1, 6 ) write (*,*) "test_insert_at_array: Starting reference_list!" - call reference_list%insert_at( list_tail, & - & [ ( string_type( to_string(j) ), j = last - stride + 1, last ) ] ) + call reference_list%insert_at( list_tail, all_strings (last-stride+1:last) ) call compare_list( reference_list, last - stride + 1, last + 1, 7 ) - call reference_list%insert_at( list_head, & - & [ ( string_type( to_string(j) ), j = first + 1, first + stride ) ] ) + call reference_list%insert_at( list_head, all_strings(first+1:first+stride) ) do i = last - stride, first + stride + 1, -1 * stride - call reference_list%insert_at( bidx( last - i + 1 ), & - & [ ( string_type( to_string(j) ), j = i - stride + 1, i ) ] ) + call reference_list%insert_at( bidx( last - i + 1 ), all_strings(i-stride+1:i) ) end do - call reference_list%insert_at( list_head, [ to_string(first) ] ) + call reference_list%insert_at( list_head, all_strings(first:first) ) call compare_list( reference_list, first, last + 1, 8 ) @@ -252,12 +251,17 @@ subroutine test_insert_at_list integer, parameter :: first = -100 integer, parameter :: last = 100 integer, parameter :: stride = 4 + type(string_type) :: all_strings(first:last) write (*,*) "test_insert_at_list: Starting work_list!" + + do concurrent (j=first:last) + all_strings(j) = string_type( to_string(j) ) + end do call temp_list%clear() do j = first, first + stride - 1 - call temp_list%insert_at( list_tail, string_type( to_string(j) ) ) + call temp_list%insert_at( list_tail, all_strings(j) ) end do call work_list%insert_at(list_head, temp_list) @@ -265,7 +269,7 @@ subroutine test_insert_at_list call temp_list%clear() do j = last - 1, last - stride, -1 - call temp_list%insert_at( list_head, string_type( to_string(j) ) ) + call temp_list%insert_at( list_head, all_strings(j) ) end do call work_list%insert_at(list_tail, temp_list) @@ -280,7 +284,7 @@ subroutine test_insert_at_list end do call temp_list%clear() - call temp_list%insert_at( list_head, to_string(last) ) + call temp_list%insert_at( list_head, all_strings(last) ) call work_list%insert_at( list_tail, temp_list ) call compare_list( work_list, first, last + 1, 10 ) From 8c5cb8d3b4e0d02707509e7296a10b1039d973f3 Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 15:50:34 +0200 Subject: [PATCH 15/16] append_prepend: gcc-15 array constructor fix --- test/stringlist/test_append_prepend.f90 | 50 ++++++++++++++++--------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/test/stringlist/test_append_prepend.f90 b/test/stringlist/test_append_prepend.f90 index 9b12bec08..3a00fbac6 100644 --- a/test/stringlist/test_append_prepend.f90 +++ b/test/stringlist/test_append_prepend.f90 @@ -16,6 +16,11 @@ subroutine test_append_prepend_string integer, parameter :: first = -100 integer, parameter :: last = 100 character(len=:), allocatable :: string + type(string_type) :: all_strings(first:last) + + do concurrent (i=first:last) + all_strings(i) = string_type( to_string(i) ) + end do do i = first, last string = to_string(i) @@ -26,10 +31,10 @@ subroutine test_append_prepend_string end do call compare_list( work_list, first, last + 1, 1 ) - call check( work_list == [ ( string_type( to_string(i) ), i = first, last ) ], & + call check( work_list == all_strings, & & "test_append_prepend_string: work_list ==& & [ ( string_type( to_string(i) ), i = first, last ) ]" ) - call check( [ ( string_type( to_string(i) ), i = first, last ) ] == work_list, & + call check( all_strings == work_list, & & "test_append_prepend_string: [ ( string_type( to_string(i) ),& & i = first, last ) ] == work_list" ) @@ -47,9 +52,9 @@ subroutine test_append_prepend_string end do call compare_list( reference_list, first, last + 1, 2 ) - call check( reference_list == [ ( string_type( to_string(i) ), i = first, last ) ], "test_append_prepend_string:& + call check( reference_list == all_strings, "test_append_prepend_string:& & reference_list == [ ( string_type( to_string(i) ), i = first, last ) ]" ) - call check( [ ( string_type( to_string(i) ), i = first, last ) ] == reference_list, & + call check( all_strings == reference_list, & & "test_append_prepend_string: [ ( string_type( to_string(i) ), i = first, last ) ] == reference_list" ) call check( work_list == reference_list, "test_append_prepend_string:& @@ -66,10 +71,15 @@ subroutine test_append_prepend_array integer, parameter :: first = -100 integer, parameter :: last = 100 integer, parameter :: stride = 10 + type(string_type) :: all_strings(first:last) + + do concurrent (j=first:last) + all_strings(j) = string_type( to_string(j) ) + end do do i = first, last - 1, stride - work_list = work_list // [ ( string_type( to_string(j) ), j = i, i + stride - 1) ] - call check( work_list == [ ( string_type( to_string(j) ), j = first, i + stride - 1) ], & + work_list = work_list // all_strings(i:i+stride-1) + call check( work_list == all_strings(first:i+stride-1), & & "test_append_prepend_array: work_list ==& & [ ( string_type( to_string(j) ), j = first, i + stride - 1) ]" ) @@ -78,10 +88,10 @@ subroutine test_append_prepend_array work_list = work_list // to_string(last) call compare_list( work_list, first, last + 1, 3 ) - call check( work_list == [ ( string_type( to_string(i) ), i = first, last) ], & + call check( work_list == all_strings, & & "test_append_prepend_array: work_list ==& & [ ( string_type( to_string(i) ), i = first, last) ]" ) - call check( [ ( string_type( to_string(i) ), i = first, last) ] == work_list, & + call check( all_strings == work_list, & & "test_append_prepend_array: [ ( string_type( to_string(i) ), i = first, last) ]& & == work_list" ) @@ -91,8 +101,7 @@ subroutine test_append_prepend_array call check( reference_list /= work_list, "test_append_prepend_array:& & reference_list /= work_list" ) - reference_list = [ ( string_type( to_string(j) ), j = i - stride + 1, i ) ] & - & // reference_list + reference_list = all_strings(i-stride+1:i) // reference_list call check( reference_list == & & [ ( string_type( to_string(j) ), j = i - stride + 1, last ) ], & & "test_append_prepend_array: reference_list ==& @@ -103,10 +112,10 @@ subroutine test_append_prepend_array reference_list = to_string(first) // reference_list call compare_list( reference_list, first, last + 1, 4 ) - call check( [ ( string_type( to_string(i) ), i = first, last) ] == reference_list, & + call check( all_strings == reference_list, & & "test_append_prepend_array:& & [ ( string_type( to_string(i) ), i = first, last) ] == reference_list" ) - call check( [ ( string_type( to_string(i) ), i = first, last) ] == reference_list, & + call check( all_strings == reference_list, & & "test_append_prepend_array: [ ( string_type( to_string(i) ), i = first, last) ]& & == reference_list" ) @@ -124,6 +133,11 @@ subroutine test_append_prepend_list integer, parameter :: first = -100 integer, parameter :: last = 100 integer, parameter :: stride = 10 + type(string_type) :: all_strings(first:last) + + do concurrent (j=first:last) + all_strings(j) = string_type( to_string(j) ) + end do do i = first, last - 1, stride call temp_list%clear() @@ -132,7 +146,7 @@ subroutine test_append_prepend_list end do work_list = work_list // temp_list - call check( work_list == [ ( string_type( to_string(j) ), j = first, i + stride - 1 ) ], & + call check( work_list == all_strings(first:i+stride-1), & & "test_append_prepend_list: work_list ==& & [ ( to_string(j), j = first, i + stride - 1) ]" ) @@ -141,9 +155,9 @@ subroutine test_append_prepend_list work_list = work_list // to_string(last) call compare_list( work_list, first, last + 1, 5 ) - call check( work_list == [ ( string_type( to_string(i) ), i = first, last) ], "test_append_prepend_list:& + call check( work_list == all_strings, "test_append_prepend_list:& & work_list == [ ( string_type( to_string(i) ), i = first, last) ]" ) - call check( [ ( string_type( to_string(i) ), i = first, last) ] == work_list, & + call check( all_strings == work_list, & & "test_append_prepend_list: [ ( string_type( to_string(i) ), i = first, last) ]& & == work_list" ) @@ -160,7 +174,7 @@ subroutine test_append_prepend_list reference_list = temp_list // reference_list call check( reference_list == & - & [ ( string_type( to_string(j) ), j = i - stride + 1, last ) ], & + & all_strings(i-stride+1:last), & & "test_append_prepend_list: reference_list ==& & [ ( string_type( to_string(j) ), j = i - stride + 1, last ) ]" ) @@ -169,10 +183,10 @@ subroutine test_append_prepend_list reference_list = to_string(first) // reference_list call compare_list( reference_list, first, last + 1, 6 ) - call check( [ ( string_type( to_string(i) ), i = first, last) ] == reference_list, & + call check( all_strings == reference_list, & & "test_append_prepend_list:& & [ ( string_type( to_string(i) ), i = first, last) ] == reference_list" ) - call check( [ ( string_type( to_string(i) ), i = first, last) ] == reference_list, & + call check( all_strings == reference_list, & & "test_append_prepend_list: [ ( string_type( to_string(i) ), i = first, last) ]& & == reference_list" ) From 6c56750bf29e1692e3bd435dde2dec7732e94966 Mon Sep 17 00:00:00 2001 From: Federico Perini Date: Sat, 28 Jun 2025 16:01:02 +0200 Subject: [PATCH 16/16] Update test_append_prepend.f90 --- test/stringlist/test_append_prepend.f90 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/stringlist/test_append_prepend.f90 b/test/stringlist/test_append_prepend.f90 index 3a00fbac6..4e3f3c6ac 100644 --- a/test/stringlist/test_append_prepend.f90 +++ b/test/stringlist/test_append_prepend.f90 @@ -102,8 +102,7 @@ subroutine test_append_prepend_array & reference_list /= work_list" ) reference_list = all_strings(i-stride+1:i) // reference_list - call check( reference_list == & - & [ ( string_type( to_string(j) ), j = i - stride + 1, last ) ], & + call check( reference_list == all_strings(i-stride+1:last), & & "test_append_prepend_array: reference_list ==& & [ ( string_type( to_string(j) ), j = i - stride + 1, last ) ]" )