@@ -274,13 +274,41 @@ test_that("matrix multiplication", {
274274 expect_identical(matrix (x , 1L )%*% matrix (x , ncol = 1L ), matrix (NA_integer64_ , 1L , 1L )),
275275 " NAs produced by integer64 overflow"
276276 )
277+ expect_warning(
278+ expect_identical(matrix (4e9 , 1L , 1L )%*% matrix (x , ncol = 1L ), matrix (NA_integer64_ , 1L , 1L )),
279+ " NAs produced by integer64 overflow"
280+ )
281+ expect_warning(
282+ expect_identical(matrix (x , 1L )%*% matrix (4e9 , ncol = 1L ), matrix (NA_integer64_ , 1L , 1L )),
283+ " NAs produced by integer64 overflow"
284+ )
277285
278286 # warning in summation part
279287 x = rep_len(as.integer64(" 3000000000" ), 2L ) # x**2 < 2^63, but 2 * x**2 > 2^63
280288 expect_warning(
281289 expect_identical(matrix (x , 1L )%*% matrix (x , ncol = 1L ), matrix (NA_integer64_ , 1L , 1L )),
282290 " NAs produced by integer64 overflow"
283291 )
292+ expect_warning(
293+ expect_identical(matrix (c(3e9 , 3e9 ), 1L , 2L )%*% matrix (x , ncol = 1L ), matrix (NA_integer64_ , 1L , 1L )),
294+ " NAs produced by integer64 overflow"
295+ )
296+ expect_warning(
297+ expect_identical(matrix (x , 1L )%*% matrix (c(3e9 , 3e9 ), ncol = 1L ), matrix (NA_integer64_ , 1L , 1L )),
298+ " NAs produced by integer64 overflow"
299+ )
300+
301+ # NA propagation in matrix multiplication
302+ m_na64 = matrix (c(as.integer64(1L ), NA_integer64_ ), 1L , 2L )
303+ m_val64 = matrix (as.integer64(c(1L , 1L )), 2L , 1L )
304+ m_na_dbl = matrix (c(1.0 , NA_real_ ), 1L , 2L )
305+ m_val_dbl = matrix (c(1.0 , 1.0 ), 2L , 1L )
306+
307+ expect_no_warning(expect_identical(m_na64 %*% m_val64 , matrix (NA_integer64_ , 1L , 1L )))
308+ expect_no_warning(expect_identical(m_na_dbl %*% m_val64 , matrix (NA_integer64_ , 1L , 1L )))
309+ expect_no_warning(expect_identical(m_na64 %*% m_val_dbl , matrix (NA_integer64_ , 1L , 1L )))
310+ expect_no_warning(expect_identical(t(m_val_dbl ) %*% matrix (c(as.integer64(1L ), NA_integer64_ ), 2L , 1L ), matrix (NA_integer64_ , 1L , 1L )))
311+ expect_no_warning(expect_identical(t(m_val64 ) %*% matrix (c(1.0 , NA_real_ ), 2L , 1L ), matrix (NA_integer64_ , 1L , 1L )))
284312
285313})
286314
0 commit comments