+
+###############################################
+# Tests for $foo binop $foo #
+###############################################
+
+# These test that binary ops call FETCH twice if the same scalar is used
+# for both operands. They also test that both return values from
+# FETCH are used.
+
+sub bin_test {
+ my $op = shift;
+ tie my $var, "main", @_[0..$#_-1];
+ is(eval "\$var $op \$var", pop, "retval of \$var $op \$var");
+ check_count $op, 2;
+}
+sub bin_int_test {
+ my $op = shift;
+ tie my $var, "main", @_[0..$#_-1];
+ is(eval "use integer; \$var $op \$var", pop,
+ "retval of \$var $op \$var under use integer");
+ check_count "$op under use integer", 2;
+}
+
+our $TODO;
+my $todo = 'bug #87726';
+{
+ local $TODO = $todo;
+ bin_test '**', 2, 3, 8;
+ bin_test '*' , 2, 3, 6;
+ bin_test '/' , 10, 2, 5;
+ bin_test '%' , 11, 2, 1;
+ bin_test 'x' , 11, 2, 1111;
+ bin_test '-' , 11, 2, 9;
+ bin_test '<<', 11, 2, 44;
+ bin_test '>>', 44, 2, 11;
+ bin_test '<' , 1, 2, 1;
+ bin_test '>' , 44, 2, 1;
+ bin_test '<=', 44, 2, "";
+ bin_test '>=', 1, 2, "";
+ bin_test '!=', 1, 2, 1;
+ bin_test '<=>', 1, 2, -1;
+ bin_test 'le', 4, 2, "";
+ bin_test 'lt', 1, 2, 1;
+ bin_test 'gt', 4, 2, 1;
+ bin_test 'ge', 1, 2, "";
+ bin_test 'eq', 1, 2, "";
+ bin_test 'ne', 1, 2, 1;
+ bin_test 'cmp', 1, 2, -1;
+ bin_test '&' , 1, 2, 0;
+ bin_test '|' , 1, 2, 3;
+}
+bin_test '.' , 1, 2, 12;
+{
+ local $TODO = $todo ;
+ bin_test '==', 1, 2, "";
+ bin_test '+' , 1, 2, 3;
+ bin_int_test '*' , 2, 3, 6;
+ bin_int_test '/' , 10, 2, 5;
+ bin_int_test '%' , 11, 2, 1;
+ # For these two, one of the tests in bin_int_test passes and the other
+ # fails, so we spell them out for now.
+ #bin_int_test '+' , 1, 2, 3;
+ #bin_int_test '-' , 11, 2, 9;
+ {
+ use integer;
+ tie my $var, "main", 1, 2;
+ is($var + $var, 3, 'retval of $var + $var under use integer');
+ { local $TODO; check_count '+ under use integer', 2; }
+ tie $var, "main", 11, 2;
+ is($var - $var, 9, 'retval of $var - $var under use integer');
+ { local $TODO; check_count '- under use integer', 2; }
+ }
+ bin_int_test '<' , 1, 2, 1;
+ bin_int_test '>' , 44, 2, 1;
+ bin_int_test '<=', 44, 2, "";
+ bin_int_test '>=', 1, 2, "";
+ bin_int_test '==', 1, 2, "";
+ bin_int_test '!=', 1, 2, 1;
+ bin_int_test '<=>', 1, 2, -1;
+ tie $var, "main", 1, 4;
+ cmp_ok(atan2($var, $var), '<', .3, 'retval of atan2 $var, $var');
+ check_count 'atan2', 2;
+}
+