From 85942c977c2b20803681180eb9f4b6db89811724 Mon Sep 17 00:00:00 2001 From: Rich FitzJohn Date: Wed, 13 Nov 2024 18:52:39 +0000 Subject: [PATCH] Error if arrays accessed without index --- R/parse.R | 18 ++++++++++++++++++ R/sysdata.rda | Bin 17983 -> 18022 bytes tests/testthat/test-parse.R | 27 +++++++++++++++++++++++++++ vignettes/errors.Rmd | 11 +++++++++++ 4 files changed, 56 insertions(+) diff --git a/R/parse.R b/R/parse.R index f93bbf79..9f8e8052 100644 --- a/R/parse.R +++ b/R/parse.R @@ -184,6 +184,19 @@ parse_check_consistent_dimensions_rhs <- function(eq, dat, call, src = eq$src) { "E2019", src, call) } + throw_array_as_scalar <- function(var, rank) { + what <- rank_description(rank) + if (rank == 1) { + dummy_index <- "..." + } else { + dummy_index <- paste(rep(".", rank), collapse = ", ") + } + odin_parse_error( + c("Trying to use {what} '{var}' without index", + i = sprintf("Did you mean '{var}[%s]'", dummy_index)), + "E2022", src, call) + } + fn_use_whole_array <- c("length", "nrow", "ncol", "OdinReduce", "OdinInterpolate") @@ -233,6 +246,11 @@ parse_check_consistent_dimensions_rhs <- function(eq, dat, call, src = eq$src) { } else { lapply(expr[-1], check) } + } else if (is.symbol(expr)) { + nm <- as.character(expr) + if (nm %in% dat$storage$arrays$name) { + throw_array_as_scalar(nm, dim_ranks[[nm]]) + } } } check(eq$rhs$expr) diff --git a/R/sysdata.rda b/R/sysdata.rda index a4ac7eb3c0fc732533d84d761917eb151499d407..fbb5e6b9cad1a655e264e1329ee4c149c432117a 100644 GIT binary patch literal 18022 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 literal 17983 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 QE>F0N$yHBxZr&&MFQRBBH~;_u diff --git a/tests/testthat/test-parse.R b/tests/testthat/test-parse.R index 82d63bd6..cb5d46b7 100644 --- a/tests/testthat/test-parse.R +++ b/tests/testthat/test-parse.R @@ -1060,3 +1060,30 @@ test_that("don't duplicate offsets when boundary condition used in initial", { expect_equal(dat$variables, "x") expect_equal(nrow(dat$storage$packing$state), 1) }) + + +test_that("prevent use of arrays without braces", { + err <- expect_error( + odin_parse({ + initial(x[]) <- 0 + update(x[]) <- b + b[] <- x[i] + dim(x) <- 5 + dim(b) <- 5 + }), + "Trying to use vector 'b' without index") + expect_match(conditionMessage(err), + "Did you mean 'b[...]'", fixed = TRUE) + + err <- expect_error( + odin_parse({ + initial(x[]) <- 0 + update(x[]) <- b + b[, ] <- 1 + dim(x) <- 5 + dim(b) <- c(5, 5) + }), + "Trying to use matrix 'b' without index") + expect_match(conditionMessage(err), + "Did you mean 'b[., .]'", fixed = TRUE) +}) diff --git a/vignettes/errors.Rmd b/vignettes/errors.Rmd index bfa8415a..7b4361cb 100644 --- a/vignettes/errors.Rmd +++ b/vignettes/errors.Rmd @@ -1097,6 +1097,17 @@ You have tried to set the dimensions of the same variable more than once. For ex dim(a, b) <- 2 dim(b, c) <- 3 +# `E2022` + +Trying to access an array without using square bracket indexes. For example if you write: + +```r +dim(b) <- 10 +a[] <- b +``` + +you would see this error, as you should have used `b[i]` on the right hand side (*probably!*; you might have meant `a[] <- b[1]`, too). + # `E3001` An array access would be out of bounds. This error is thrown where your code would result in you reading or writing out of bounds on an array (or a dimension of an array). Currently, we throw this error if we are certain that your access is invalid. For example, we would error if your code contains: