@@ -173,7 +173,7 @@ test_that("Overflow edge cases for arithmetic and summary functions", {
173173
174174 overflow_warning = " NAs produced by integer64 overflow"
175175
176- # 1. C-level overflow (exceeds LLONG_MAX or below LLONG_MIN)
176+ # True C-level overflow (above LLONG_MAX or below LLONG_MIN)
177177 expect_warning(expect_identical(max_val + 1L , NA_integer64_ ), overflow_warning )
178178 expect_warning(expect_identical(min_val + (- 2L ), NA_integer64_ ), overflow_warning )
179179 expect_warning(expect_identical(max_val - (- 1L ), NA_integer64_ ), overflow_warning )
@@ -183,23 +183,27 @@ test_that("Overflow edge cases for arithmetic and summary functions", {
183183 expect_warning(expect_identical(min_val * (- 2L ), NA_integer64_ ), overflow_warning )
184184 expect_warning(expect_identical(diff(c(max_val , min_val - 1L )), NA_integer64_ ), overflow_warning )
185185
186- # 2. NA_INTEGER64 sentinel collision: mathematical result is exactly LLONG_MIN (-2^63).
187- # C-level __builtin_*_overflow does NOT overflow, but bit64 treats LLONG_MIN as NA.
188- # These must produce NA_integer64_ with an overflow warning.
186+ # R-specific overflow (result is exactly LLONG_MIN == NA_INTEGER64, so C arithmetic
187+ # works, but overflow is nevertheless reported as R's integer64 class has narrower range
189188 expect_warning(expect_identical(min_val + (- 1L ), NA_integer64_ ), overflow_warning )
190189 expect_warning(expect_identical(half_min + half_min , NA_integer64_ ), overflow_warning )
191190 expect_warning(expect_identical(min_val - 1L , NA_integer64_ ), overflow_warning )
192191 expect_warning(expect_identical(as.integer64(- 2L ) * half_max , NA_integer64_ ), overflow_warning )
193- expect_warning(expect_identical(as.integer64(" -2147483648" ) * as.integer64(" 4294967296" ), NA_integer64_ ), overflow_warning )
192+ expect_warning(
193+ expect_identical(as.integer64(" -2147483648" ) * as.integer64(" 4294967296" ), NA_integer64_ ),
194+ overflow_warning
195+ )
194196 expect_warning(expect_identical(diff(c(as.integer64(1L ), min_val )), NA_integer64_ ), overflow_warning )
195197 expect_warning(expect_identical(sum(min_val , - 1L ), NA_integer64_ ), overflow_warning )
196198 expect_warning(expect_identical(sum(c(half_min , half_min )), NA_integer64_ ), overflow_warning )
197199 expect_warning(expect_identical(prod(as.integer64(- 2L ), half_max ), NA_integer64_ ), overflow_warning )
198200 expect_warning(expect_identical(cumsum(c(min_val , - 1L )), c(min_val , NA_integer64_ )), overflow_warning )
199- expect_warning(expect_identical(cumprod(c(as.integer64(- 2L ), half_max )), c(as.integer64(- 2L ), NA_integer64_ )), overflow_warning )
201+ expect_warning(
202+ expect_identical(cumprod(c(as.integer64(- 2L ), half_max )), c(as.integer64(- 2L ), NA_integer64_ )),
203+ overflow_warning
204+ )
200205
201- # 3. Boundary cases that are exactly on the representable range [-2^63 + 1, 2^63 - 1]
202- # These must NOT overflow or warn.
206+ # Boundary cases that _don't_ overflow
203207 expect_identical(min_val + 0L , min_val )
204208 expect_identical(min_val + 1L , as.integer64(" -9223372036854775806" ))
205209 expect_identical(half_min + (half_min + 1L ), min_val )
@@ -211,7 +215,7 @@ test_that("Overflow edge cases for arithmetic and summary functions", {
211215 expect_identical(sum(min_val , 0L ), min_val )
212216 expect_identical(prod(min_val , 1L ), min_val )
213217
214- # 4. NA propagation: when NA_INTEGER64 is an input, it should return NA without warning
218+ # If NA is present, NA is returned without overflow
215219 expect_no_warning(expect_identical(NA_integer64_ + 1L , NA_integer64_ ))
216220 expect_no_warning(expect_identical(1L + NA_integer64_ , NA_integer64_ ))
217221 expect_no_warning(expect_identical(NA_integer64_ - 1L , NA_integer64_ ))
0 commit comments