Skip to content

Commit e1fa87d

Browse files
committed
Preserve integer exponents in size powers
1 parent 9aca06d commit e1fa87d

2 files changed

Lines changed: 24 additions & 3 deletions

File tree

R/manifest.R

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -518,9 +518,7 @@ dims2f_eval_base_env[["%%"]] <- function(e1, e2) {
518518
)
519519
}
520520
dims2f_eval_base_env[["^"]] <- function(e1, e2) {
521-
glue(
522-
"(real({e1}, kind=c_double))**(real({e2}, kind=c_double))"
523-
)
521+
glue("(real({e1}, kind=c_double))**({e2})")
524522
}
525523
dims2f_eval_base_env[["abs"]] <- function(x) glue("abs({x})")
526524
# Fortran INT() truncates toward zero, like as.integer() in R.

tests/testthat/test-sizes-arithmetic.R

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,29 @@ test_that("size powers use the double domain before casting", {
178178
expect_quick_identical(constant, list())
179179
})
180180

181+
test_that("size powers retain integer exponent type", {
182+
fn <- function(x, exponent, scale) {
183+
declare(
184+
type(x = integer(1)),
185+
type(exponent = integer(1)),
186+
type(scale = integer(1))
187+
)
188+
out <- double(as.integer((x^exponent) * scale) + 10L)
189+
for (i in seq_len(length(out))) {
190+
out[i] <- as.double(i)
191+
}
192+
out
193+
}
194+
195+
code <- r2f(fn)
196+
expect_match(as.character(code), "**(exponent)", fixed = TRUE)
197+
expect_false(
198+
grepl("real(exponent, kind=c_double)", as.character(code), fixed = TRUE)
199+
)
200+
201+
expect_quick_identical(fn, list(-2L, -1L, 4L))
202+
})
203+
181204
test_that("dim/length/nrow/ncol are supported in allocation sizes", {
182205
vec <- function(x) {
183206
declare(type(x = double(NA)))

0 commit comments

Comments
 (0)