Change 34780 by [EMAIL PROTECTED] on 2008/11/09 04:22:15
Subject: "Perl_newSVpvf("%lld")" is broken
From: [EMAIL PROTECTED]
Date: Sat, 08 Nov 2008 13:29:57 +0000
Message-Id: <[EMAIL PROTECTED]>
Plus some test cases.
Affected files ...
... //depot/perl/sv.c#1575 edit
... //depot/perl/t/op/sprintf2.t#12 edit
Differences ...
==== //depot/perl/sv.c#1575 (text) ====
Index: perl/sv.c
--- perl/sv.c#1574~34770~ 2008-11-07 14:33:39.000000000 -0800
+++ perl/sv.c 2008-11-08 20:22:15.000000000 -0800
@@ -9557,8 +9557,11 @@
case 'l': iv = va_arg(*args, long); break;
case 'V': iv = va_arg(*args, IV); break;
default: iv = va_arg(*args, int); break;
+ case 'q':
#ifdef HAS_QUAD
- case 'q': iv = va_arg(*args, Quad_t); break;
+ iv = va_arg(*args, Quad_t); break;
+#else
+ goto unknown;
#endif
}
}
@@ -9569,8 +9572,11 @@
case 'l': iv = (long)tiv; break;
case 'V':
default: iv = tiv; break;
+ case 'q':
#ifdef HAS_QUAD
- case 'q': iv = (Quad_t)tiv; break;
+ iv = (Quad_t)tiv; break;
+#else
+ goto unknown;
#endif
}
}
@@ -9642,8 +9648,11 @@
case 'l': uv = va_arg(*args, unsigned long); break;
case 'V': uv = va_arg(*args, UV); break;
default: uv = va_arg(*args, unsigned); break;
+ case 'q':
#ifdef HAS_QUAD
- case 'q': uv = va_arg(*args, Uquad_t); break;
+ uv = va_arg(*args, Uquad_t); break;
+#else
+ goto unknown;
#endif
}
}
@@ -9654,8 +9663,11 @@
case 'l': uv = (unsigned long)tuv; break;
case 'V':
default: uv = tuv; break;
+ case 'q':
#ifdef HAS_QUAD
- case 'q': uv = (Uquad_t)tuv; break;
+ uv = (Uquad_t)tuv; break;
+#else
+ goto unknown;
#endif
}
}
@@ -9941,8 +9953,11 @@
default: *(va_arg(*args, int*)) = i; break;
case 'l': *(va_arg(*args, long*)) = i; break;
case 'V': *(va_arg(*args, IV*)) = i; break;
+ case 'q':
#ifdef HAS_QUAD
- case 'q': *(va_arg(*args, Quad_t*)) = i; break;
+ *(va_arg(*args, Quad_t*)) = i; break;
+#else
+ goto unknown;
#endif
}
}
==== //depot/perl/t/op/sprintf2.t#12 (text) ====
Index: perl/t/op/sprintf2.t
--- perl/t/op/sprintf2.t#11~33765~ 2008-04-30 00:47:07.000000000 -0700
+++ perl/t/op/sprintf2.t 2008-11-08 20:22:15.000000000 -0800
@@ -6,7 +6,10 @@
require './test.pl';
}
-plan tests => 1295;
+plan tests => 1319;
+
+use strict;
+use Config;
is(
sprintf("%.40g ",0.01),
@@ -139,3 +142,26 @@
eval { my $f = sprintf("%f", $n); };
is $@, "", "sprintf(\"%f\", $n)";
}
+
+# test %ll formats with and without HAS_QUAD
+eval { my $q = pack "q", 0 };
+my $Q = $@ eq '';
+
+my @tests = (
+ [ '%lld' => '%d', [qw( 4294967296 -100000000000000 )] ],
+ [ '%lli' => '%i', [qw( 4294967296 -100000000000000 )] ],
+ [ '%llu' => '%u', [qw( 4294967296 100000000000000 )] ],
+ [ '%Ld' => '%d', [qw( 4294967296 -100000000000000 )] ],
+ [ '%Li' => '%i', [qw( 4294967296 -100000000000000 )] ],
+ [ '%Lu' => '%u', [qw( 4294967296 100000000000000 )] ],
+);
+
+for my $t (@tests) {
+ my($fmt, $conv) = @$t;
+ for my $num (@{$t->[2]}) {
+ my $w; local $SIG{__WARN__} = sub { $w = shift };
+ is(sprintf($fmt, $num), $Q ? $num : $fmt, "quad: $fmt -> $num");
+ like($w, $Q ? '' : qr/Invalid conversion in sprintf: "$conv"/, "warning:
$fmt");
+ }
+}
+
End of Patch.