Skip to content

Commit ae8398c

Browse files
authored
GCC 15.1 fixes (#1008)
2 parents 25f94a9 + 6c56750 commit ae8398c

15 files changed

+350
-82
lines changed

CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU AND CMAKE_Fortran_COMPILER_VERSION VER
3131
message(FATAL_ERROR "GCC Version 9 or newer required")
3232
endif()
3333

34+
# --- silence gfortran-15 argument-mismatch warnings
35+
if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU
36+
AND CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 15.0
37+
AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 16.0)
38+
add_compile_options("$<$<COMPILE_LANGUAGE:Fortran>:-Wno-external-argument-mismatch>")
39+
endif()
40+
3441
# --- compiler feature checks
3542
include(CheckFortranSourceCompiles)
3643
include(CheckFortranSourceRuns)

test/linalg/test_linalg_cholesky.fypp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ module test_linalg_cholesky
2222
allocate(tests(0))
2323

2424
#:for rk,rt,ri in RC_KINDS_TYPES
25-
tests = [tests,new_unittest("least_cholesky_${ri}$",test_cholesky_${ri}$)]
25+
call add_test(tests,new_unittest("least_cholesky_${ri}$",test_cholesky_${ri}$))
2626
#:endfor
2727

2828
end subroutine test_cholesky_factorization
@@ -66,6 +66,26 @@ module test_linalg_cholesky
6666

6767
#:endfor
6868

69+
! gcc-15 bugfix utility
70+
subroutine add_test(tests,new_test)
71+
type(unittest_type), allocatable, intent(inout) :: tests(:)
72+
type(unittest_type), intent(in) :: new_test
73+
74+
integer :: n
75+
type(unittest_type), allocatable :: new_tests(:)
76+
77+
if (allocated(tests)) then
78+
n = size(tests)
79+
else
80+
n = 0
81+
end if
82+
83+
allocate(new_tests(n+1))
84+
if (n>0) new_tests(1:n) = tests(1:n)
85+
new_tests(1+n) = new_test
86+
call move_alloc(from=new_tests,to=tests)
87+
88+
end subroutine add_test
6989

7090
end module test_linalg_cholesky
7191

test/linalg/test_linalg_determinant.fypp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ module test_linalg_determinant
2323

2424
#:for rk,rt in RC_KINDS_TYPES
2525
#:if rk!="xdp"
26-
tests = [tests,new_unittest("$eye_det_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_determinant)]
27-
tests = [tests,new_unittest("$eye_det_multiple_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_multiple)]
26+
call add_test(tests,new_unittest("$eye_det_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_determinant))
27+
call add_test(tests,new_unittest("$eye_det_multiple_${rt[0]}$${rk}$",test_${rt[0]}$${rk}$_eye_multiple))
2828
#:endif
2929
#:endfor
3030
#:for ck,ct in CMPLX_KINDS_TYPES
3131
#:if ck!="xdp"
32-
tests = [tests,new_unittest("$complex_det_${rt[0]}$${rk}$",test_${ct[0]}$${ck}$_complex_determinant)]
32+
call add_test(tests,new_unittest("$complex_det_${rt[0]}$${rk}$",test_${ct[0]}$${ck}$_complex_determinant))
3333
#:endif
3434
#: endfor
3535

@@ -143,6 +143,27 @@ module test_linalg_determinant
143143

144144
#:endif
145145
#:endfor
146+
147+
! gcc-15 bugfix utility
148+
subroutine add_test(tests,new_test)
149+
type(unittest_type), allocatable, intent(inout) :: tests(:)
150+
type(unittest_type), intent(in) :: new_test
151+
152+
integer :: n
153+
type(unittest_type), allocatable :: new_tests(:)
154+
155+
if (allocated(tests)) then
156+
n = size(tests)
157+
else
158+
n = 0
159+
end if
160+
161+
allocate(new_tests(n+1))
162+
if (n>0) new_tests(1:n) = tests(1:n)
163+
new_tests(1+n) = new_test
164+
call move_alloc(from=new_tests,to=tests)
165+
166+
end subroutine add_test
146167

147168
end module test_linalg_determinant
148169

test/linalg/test_linalg_eigenvalues.fypp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ module test_linalg_eigenvalues
2121
allocate(tests(0))
2222

2323
#:for rk,rt,ri in REAL_KINDS_TYPES
24-
tests = [tests,new_unittest("test_eig_real_${ri}$",test_eig_real_${ri}$), &
25-
new_unittest("test_eigvals_identity_${ri}$",test_eigvals_identity_${ri}$), &
26-
new_unittest("test_eigvals_diagonal_B_${ri}$",test_eigvals_diagonal_B_${ri}$), &
27-
new_unittest("test_eigvals_nondiagonal_B_${ri}$",test_eigvals_nondiagonal_B_${ri}$), &
28-
new_unittest("test_eigh_real_${ri}$",test_eigh_real_${ri}$)]
24+
call add_test(tests,new_unittest("test_eig_real_${ri}$",test_eig_real_${ri}$))
25+
call add_test(tests,new_unittest("test_eigvals_identity_${ri}$",test_eigvals_identity_${ri}$))
26+
call add_test(tests,new_unittest("test_eigvals_diagonal_B_${ri}$",test_eigvals_diagonal_B_${ri}$))
27+
call add_test(tests,new_unittest("test_eigvals_nondiagonal_B_${ri}$",test_eigvals_nondiagonal_B_${ri}$))
28+
call add_test(tests,new_unittest("test_eigh_real_${ri}$",test_eigh_real_${ri}$))
2929
#: endfor
3030

3131
#:for ck,ct,ci in CMPLX_KINDS_TYPES
32-
tests = [tests,new_unittest("test_eig_complex_${ci}$",test_eig_complex_${ci}$), &
33-
new_unittest("test_eig_generalized_complex_${ci}$",test_eigvals_generalized_complex_${ci}$), &
34-
new_unittest("test_eig_issue_927_${ci}$",test_issue_927_${ci}$)]
32+
call add_test(tests,new_unittest("test_eig_complex_${ci}$",test_eig_complex_${ci}$))
33+
call add_test(tests,new_unittest("test_eig_generalized_complex_${ci}$",test_eigvals_generalized_complex_${ci}$))
34+
call add_test(tests,new_unittest("test_eig_issue_927_${ci}$",test_issue_927_${ci}$))
3535
#: endfor
3636

3737
end subroutine test_eig_eigh
@@ -347,8 +347,26 @@ module test_linalg_eigenvalues
347347

348348
#:endfor
349349

350-
351-
350+
! gcc-15 bugfix utility
351+
subroutine add_test(tests,new_test)
352+
type(unittest_type), allocatable, intent(inout) :: tests(:)
353+
type(unittest_type), intent(in) :: new_test
354+
355+
integer :: n
356+
type(unittest_type), allocatable :: new_tests(:)
357+
358+
if (allocated(tests)) then
359+
n = size(tests)
360+
else
361+
n = 0
362+
end if
363+
364+
allocate(new_tests(n+1))
365+
if (n>0) new_tests(1:n) = tests(1:n)
366+
new_tests(1+n) = new_test
367+
call move_alloc(from=new_tests,to=tests)
368+
369+
end subroutine add_test
352370

353371
end module test_linalg_eigenvalues
354372

test/linalg/test_linalg_inverse.fypp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ module test_linalg_inverse
2222
allocate(tests(0))
2323

2424
#:for rk,rt,ri in RC_KINDS_TYPES
25-
tests = [tests,new_unittest("${ri}$_eye_inverse",test_${ri}$_eye_inverse), &
26-
new_unittest("${ri}$_singular_inverse",test_${ri}$_singular_inverse), &
27-
new_unittest("${ri}$_random_spd_inverse",test_${ri}$_random_spd_inverse)]
25+
call add_test(tests,new_unittest("${ri}$_eye_inverse",test_${ri}$_eye_inverse))
26+
call add_test(tests,new_unittest("${ri}$_singular_inverse",test_${ri}$_singular_inverse))
27+
call add_test(tests,new_unittest("${ri}$_random_spd_inverse",test_${ri}$_random_spd_inverse))
2828
#:endfor
2929

3030
end subroutine test_inverse_matrix
@@ -291,6 +291,27 @@ module test_linalg_inverse
291291

292292
#:endfor
293293

294+
! gcc-15 bugfix utility
295+
subroutine add_test(tests,new_test)
296+
type(unittest_type), allocatable, intent(inout) :: tests(:)
297+
type(unittest_type), intent(in) :: new_test
298+
299+
integer :: n
300+
type(unittest_type), allocatable :: new_tests(:)
301+
302+
if (allocated(tests)) then
303+
n = size(tests)
304+
else
305+
n = 0
306+
end if
307+
308+
allocate(new_tests(n+1))
309+
if (n>0) new_tests(1:n) = tests(1:n)
310+
new_tests(1+n) = new_test
311+
call move_alloc(from=new_tests,to=tests)
312+
313+
end subroutine add_test
314+
294315
end module test_linalg_inverse
295316

296317
program test_inv

test/linalg/test_linalg_lstsq.fypp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ module test_linalg_least_squares
2121

2222
allocate(tests(0))
2323

24-
tests = [tests,new_unittest("issue_823",test_issue_823)]
24+
call add_test(tests,new_unittest("issue_823",test_issue_823))
2525

2626
#:for rk,rt,ri in REAL_KINDS_TYPES
27-
tests = [tests,new_unittest("least_squares_${ri}$",test_lstsq_one_${ri}$), &
28-
new_unittest("least_squares_randm_${ri}$",test_lstsq_random_${ri}$)]
27+
call add_test(tests,new_unittest("least_squares_${ri}$",test_lstsq_one_${ri}$))
28+
call add_test(tests,new_unittest("least_squares_randm_${ri}$",test_lstsq_random_${ri}$))
2929
#:endfor
3030

3131
end subroutine test_least_squares
@@ -139,6 +139,27 @@ module test_linalg_least_squares
139139

140140
end subroutine test_issue_823
141141

142+
! gcc-15 bugfix utility
143+
subroutine add_test(tests,new_test)
144+
type(unittest_type), allocatable, intent(inout) :: tests(:)
145+
type(unittest_type), intent(in) :: new_test
146+
147+
integer :: n
148+
type(unittest_type), allocatable :: new_tests(:)
149+
150+
if (allocated(tests)) then
151+
n = size(tests)
152+
else
153+
n = 0
154+
end if
155+
156+
allocate(new_tests(n+1))
157+
if (n>0) new_tests(1:n) = tests(1:n)
158+
new_tests(1+n) = new_test
159+
call move_alloc(from=new_tests,to=tests)
160+
161+
end subroutine add_test
162+
142163
end module test_linalg_least_squares
143164

144165
program test_lstsq

test/linalg/test_linalg_mnorm.fypp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ module test_linalg_mnorm
1818
allocate(tests(0))
1919

2020
#:for rk,rt,ri in RC_KINDS_TYPES
21-
tests = [tests,new_unittest("test_matrix_norms_${ri}$",test_matrix_norms_${ri}$)]
21+
call add_test(tests,new_unittest("test_matrix_norms_${ri}$",test_matrix_norms_${ri}$))
2222
#:for rank in range(3, MAXRANK)
23-
tests = [tests,new_unittest("test_mnorm_${ri}$_${rank}$d",test_mnorm_${ri}$_${rank}$d)]
23+
call add_test(tests,new_unittest("test_mnorm_${ri}$_${rank}$d",test_mnorm_${ri}$_${rank}$d))
2424
#:endfor
2525
#:endfor
2626

@@ -135,6 +135,27 @@ module test_linalg_mnorm
135135

136136
#:endfor
137137

138+
! gcc-15 bugfix utility
139+
subroutine add_test(tests,new_test)
140+
type(unittest_type), allocatable, intent(inout) :: tests(:)
141+
type(unittest_type), intent(in) :: new_test
142+
143+
integer :: n
144+
type(unittest_type), allocatable :: new_tests(:)
145+
146+
if (allocated(tests)) then
147+
n = size(tests)
148+
else
149+
n = 0
150+
end if
151+
152+
allocate(new_tests(n+1))
153+
if (n>0) new_tests(1:n) = tests(1:n)
154+
new_tests(1+n) = new_test
155+
call move_alloc(from=new_tests,to=tests)
156+
157+
end subroutine add_test
158+
138159
end module test_linalg_mnorm
139160

140161
program test_mnorm

test/linalg/test_linalg_norm.fypp

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ module test_linalg_norm
3232
allocate(tests(0))
3333

3434
#:for rk,rt,ri in RC_KINDS_TYPES
35-
tests = [tests,new_unittest("strided_1d_norm_${ri}$",test_strided_1d_${ri}$)]
35+
call add_test(tests,new_unittest("strided_1d_norm_${ri}$",test_strided_1d_${ri}$))
3636
#:for rank in range(1, MAXRANK)
37-
tests = [tests,new_unittest("norm_${ri}$_${rank}$d",test_norm_${ri}$_${rank}$d)]
37+
call add_test(tests,new_unittest("norm_${ri}$_${rank}$d",test_norm_${ri}$_${rank}$d))
3838
#:endfor
3939
#:for rank in range(2, MAXRANK)
4040
#:if rt.startswith('real')
41-
tests = [tests,new_unittest("norm2_${ri}$_${rank}$d",test_norm2_${ri}$_${rank}$d)]
41+
call add_test(tests,new_unittest("norm2_${ri}$_${rank}$d",test_norm2_${ri}$_${rank}$d))
4242
#:endif
43-
tests = [tests,new_unittest("maxabs_${ri}$_${rank}$d",test_maxabs_${ri}$_${rank}$d)]
44-
tests = [tests,new_unittest("norm_dimmed_${ri}$_${rank}$d",test_norm_dimmed_${ri}$_${rank}$d)]
43+
call add_test(tests,new_unittest("maxabs_${ri}$_${rank}$d",test_maxabs_${ri}$_${rank}$d))
44+
call add_test(tests,new_unittest("norm_dimmed_${ri}$_${rank}$d",test_norm_dimmed_${ri}$_${rank}$d))
4545
#:endfor
4646
#:endfor
4747

@@ -268,6 +268,26 @@ module test_linalg_norm
268268
#:endfor
269269
#:endfor
270270

271+
! gcc-15 bugfix utility
272+
subroutine add_test(tests,new_test)
273+
type(unittest_type), allocatable, intent(inout) :: tests(:)
274+
type(unittest_type), intent(in) :: new_test
275+
276+
integer :: n
277+
type(unittest_type), allocatable :: new_tests(:)
278+
279+
if (allocated(tests)) then
280+
n = size(tests)
281+
else
282+
n = 0
283+
end if
284+
285+
allocate(new_tests(n+1))
286+
if (n>0) new_tests(1:n) = tests(1:n)
287+
new_tests(1+n) = new_test
288+
call move_alloc(from=new_tests,to=tests)
289+
290+
end subroutine add_test
271291

272292
end module test_linalg_norm
273293

test/linalg/test_linalg_pseudoinverse.fypp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ module test_linalg_pseudoinverse
2121
allocate(tests(0))
2222

2323
#:for rk,rt,ri in REAL_KINDS_TYPES
24-
tests = [tests,new_unittest("${ri}$_eye_pseudoinverse",test_${ri}$_eye_pseudoinverse)]
24+
call add_test(tests,new_unittest("${ri}$_eye_pseudoinverse",test_${ri}$_eye_pseudoinverse))
2525
#:endfor
2626
#:for rk,rt,ri in RC_KINDS_TYPES
27-
tests = [tests,new_unittest("${ri}$_square_pseudoinverse",test_${ri}$_square_pseudoinverse), &
28-
new_unittest("${ri}$_tall_pseudoinverse",test_${ri}$_tall_pseudoinverse), &
29-
new_unittest("${ri}$_wide_pseudoinverse",test_${ri}$_wide_pseudoinverse), &
30-
new_unittest("${ri}$_singular_pseudoinverse",test_${ri}$_singular_pseudoinverse)]
27+
call add_test(tests,new_unittest("${ri}$_square_pseudoinverse",test_${ri}$_square_pseudoinverse))
28+
call add_test(tests,new_unittest("${ri}$_tall_pseudoinverse",test_${ri}$_tall_pseudoinverse))
29+
call add_test(tests,new_unittest("${ri}$_wide_pseudoinverse",test_${ri}$_wide_pseudoinverse))
30+
call add_test(tests,new_unittest("${ri}$_singular_pseudoinverse",test_${ri}$_singular_pseudoinverse))
3131
#:endfor
3232

3333
end subroutine test_pseudoinverse_matrix
@@ -218,6 +218,27 @@ module test_linalg_pseudoinverse
218218

219219
#:endfor
220220

221+
! gcc-15 bugfix utility
222+
subroutine add_test(tests,new_test)
223+
type(unittest_type), allocatable, intent(inout) :: tests(:)
224+
type(unittest_type), intent(in) :: new_test
225+
226+
integer :: n
227+
type(unittest_type), allocatable :: new_tests(:)
228+
229+
if (allocated(tests)) then
230+
n = size(tests)
231+
else
232+
n = 0
233+
end if
234+
235+
allocate(new_tests(n+1))
236+
if (n>0) new_tests(1:n) = tests(1:n)
237+
new_tests(1+n) = new_test
238+
call move_alloc(from=new_tests,to=tests)
239+
240+
end subroutine add_test
241+
221242
end module test_linalg_pseudoinverse
222243

223244
program test_inv

0 commit comments

Comments
 (0)