In this case:
sort { $a <=> $b } ...
the sort block is optimised away and implemented in C.
That C implementation did not take into account that $a or $b might be
nan, and therefore, without optimisation, would return undef, result-
ing in a warning.
The optimisation is supposed to be just that, and not change
behaviour.
PERL_ARGS_ASSERT_SV_NCMP;
+#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
+ if (Perl_isnan(right) || Perl_isnan(left)) {
+#else
+ if (nv1 != nv1 || nv2 != nv2) {
+#endif
+ if (ckWARN(WARN_UNINITIALIZED)) report_uninit(NULL);
+ return 0;
+ }
return nv1 < nv2 ? -1 : nv1 > nv2 ? 1 : 0;
}
Use of uninitialized value in sort at - line 10.
Use of uninitialized value in sort at - line 11.
########
+my $nan = sin 9**9**9;
+if ($nan == $nan) {
+ print <<EOM ;
+SKIPPED
+# No nan support
+EOM
+ exit ;
+}
+use warnings 'uninitialized';
+# The optimised {$a<=>$b} case should behave the same way as unoptimised.
+@sort = sort { ($a)[0] <=> $b } 1, $nan;
+@sort = sort { $a <=> $b } 1, $nan;
+EXPECT
+Use of uninitialized value in sort at - line 11.
+Use of uninitialized value in sort at - line 12.
+########
use warnings 'uninitialized';
my ($m1, $m2, $v);
our ($g1);