+
+ my ($exp, $is) = (1, "is");
+ if (
+ !$fcntl_not_available and (
+ $op eq "u" and not eval { Fcntl::S_ISUID() } or
+ $op eq "g" and not eval { Fcntl::S_ISGID() } or
+ $op eq "k" and not eval { Fcntl::S_ISVTX() }
+ )
+ ) {
+ ($exp, $is) = (0, "not");
+ }
+
+ $over = 0;
+ $rv = eval "-$op \$str";
+ ok( !$@, "-$op succeeds with string overloading" )
+ or diag( $@ );
+ is( $rv, eval "-$op 'TEST'", "correct -$op on string overload" );
+ is( $over, $exp, "string overload $is called for -$op" );
+
+ ($exp, $is) = $op eq "l" ? (1, "is") : (0, "not");
+
+ $over = 0;
+ eval "-$op \$gv";
+ is( $over, $exp, "string overload $is called for -$op on GLOB" );
+
+ # IO refs always get string overload called. This might be a bug.
+ $op eq "t" || $op eq "T" || $op eq "B"
+ and ($exp, $is) = (1, "is");
+
+ $over = 0;
+ eval "-$op \$io";
+ is( $over, $exp, "string overload $is called for -$op on IO");
+
+ $rv = eval "-$op \$both";
+ is( $rv, "-$op", "correct -$op on string/-X overload" );
+
+ $rv = eval "-$op \$neither";
+ ok( !$@, "-$op succeeds with random overloading" )
+ or diag( $@ );
+ is( $rv, eval "-$op \$nstr", "correct -$op with random overloading" );
+
+ is( eval "-r -$op \$ft", "-r", "stacked overloaded -$op" );
+ is( eval "-$op -r \$ft", "-$op", "overloaded stacked -$op" );