Skip to content

GCC 15.1 fixes #1008

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Jul 1, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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("$<$<COMPILE_LANGUAGE:Fortran>:-Wno-external-argument-mismatch>")
endif()

# --- compiler feature checks
include(CheckFortranSourceCompiles)
include(CheckFortranSourceRuns)
Expand Down
22 changes: 21 additions & 1 deletion test/linalg/test_linalg_cholesky.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
27 changes: 24 additions & 3 deletions test/linalg/test_linalg_determinant.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -143,6 +143,27 @@ module test_linalg_determinant

#:endif
#: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_determinant

Expand Down
38 changes: 28 additions & 10 deletions test/linalg/test_linalg_eigenvalues.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
27 changes: 24 additions & 3 deletions test/linalg/test_linalg_inverse.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -291,6 +291,27 @@ module test_linalg_inverse

#: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_inverse

program test_inv
Expand Down
27 changes: 24 additions & 3 deletions test/linalg/test_linalg_lstsq.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -139,6 +139,27 @@ module test_linalg_least_squares

end subroutine test_issue_823

! 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_least_squares

program test_lstsq
Expand Down
25 changes: 23 additions & 2 deletions test/linalg/test_linalg_mnorm.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -135,6 +135,27 @@ module test_linalg_mnorm

#: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_mnorm

program test_mnorm
Expand Down
30 changes: 25 additions & 5 deletions test/linalg/test_linalg_norm.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -268,6 +268,26 @@ module test_linalg_norm
#:endfor
#: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_norm

Expand Down
31 changes: 26 additions & 5 deletions test/linalg/test_linalg_pseudoinverse.fypp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -218,6 +218,27 @@ module test_linalg_pseudoinverse

#: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_pseudoinverse

program test_inv
Expand Down
Loading
Loading