[Rd] Fix printing of length in a sequence() warning

Mikael Jagan j@g@nmn2 @end|ng |rom gm@||@com
Sun Jul 19 06:26:05 CEST 2026


Thanks, Ivan - I've just committed a fix, r90278.

Mikael


> From: Ivan Krylov <ikrylov using disroot.org>
> To: r-devel using r-project.org
> 
> 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;
>   	}
>



More information about the R-devel mailing list