Hello R-devel,

Here's a compilation warning and a snprintf() long / long long type
mismatch on Windows:

seq.c: In function 'do_sequence':
seq.c:1167:47: warning: format '%ld' expects argument of type 'long
int', but argument 4 has type 'R_xlen_t' {aka 'long long int'}
[-Wformat=]

## This will require 16 GiB of memory!
x <- integer(2^31)
y <- integer(2^31+1)
sequence(x, y, y)
# Error in sequence.default(x, y, y) :
#   (converted from warning) length(nvec) -2147483648 < -2147483647 =
#   max(length(from), length(by)) -- future R`s default 'recycle =
#   TRUE' will recycle 'nvec'

The fix is to print the lengths as 'long long' like in the rest of base
R code.

Index: src/main/seq.c
===================================================================
--- src/main/seq.c      (revision 90253)
+++ src/main/seq.c      (working copy)
@@ -1164,8 +1164,8 @@
        static bool warn_1st = true;
        if(warn_1st && maybe_warn) {
            char msg[99];
-           snprintf(msg, 99, "length(nvec) %ld < %ld = max(length(from), 
length(by))",
-                    lengths_len, max_len);
+           snprintf(msg, 99, "length(nvec) %lld < %lld = max(length(from), 
length(by))",
+                    (long long)lengths_len, (long long)max_len);
            warning(_("%s -- future R`s default 'recycle = TRUE' will recycle 
'nvec'"), msg);
            warn_1st = false;
        }

-- 
Best regards,
Ivan

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to