Disable bitwise operators
authorFlorian Ragwitz <rafl@debian.org>
Tue, 9 Nov 2010 18:01:51 +0000 (19:01 +0100)
committerFlorian Ragwitz <rafl@debian.org>
Tue, 9 Nov 2010 18:03:50 +0000 (19:03 +0100)
Some of them used to return wrong results, others just failed horribly. We're
disabling them alltogether, with a useful error message, until maybe someone
figures out how to make them DWIM.

MANIFEST
dist/Math-BigRat/lib/Math/BigRat.pm
dist/Math-BigRat/t/bitwise.t [new file with mode: 0644]

index 5a17254..fa2698f 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -2886,6 +2886,7 @@ dist/Math-BigRat/t/bigratpm.t             Math::BigRat test
 dist/Math-BigRat/t/bigrat.t            Math::BigRat test
 dist/Math-BigRat/t/bigratup.t          test under $Math::BigInt::upgrade
 dist/Math-BigRat/t/bigroot.t           Math::BigRat test
+dist/Math-BigRat/t/bitwise.t           Math::BigRat test
 dist/Math-BigRat/t/hang.t              Math::BigRat test for bug #34584 - hang in exp()
 dist/Math-BigRat/t/Math/BigRat/Test.pm Math::BigRat test helper
 dist/Math-BigRat/t/requirer.t          see if require works properly
index 3508bf9..92cc59c 100644 (file)
@@ -16,6 +16,7 @@ package Math::BigRat;
 # anythig older is untested, and unlikely to work
 use 5.006;
 use strict;
+use Carp ();
 
 use Math::BigFloat;
 use vars qw($VERSION @ISA $upgrade $downgrade
@@ -26,7 +27,16 @@ use vars qw($VERSION @ISA $upgrade $downgrade
 $VERSION = '0.26';
 $VERSION = eval $VERSION;
 
-use overload;                  # inherit overload from Math::BigFloat
+# inherit overload from Math::BigFloat, but disable the bitwise ops that don't
+# make much sense for rationals unless they're truncated or something first
+
+use overload
+    map {
+       my $op = $_;
+       ($op => sub {
+           Carp::croak("bitwise operation $op not supported in Math::BigRat");
+       });
+    } qw(& | ^ ~ << >> &= |= ^= <<= >>=);
 
 BEGIN
   {
diff --git a/dist/Math-BigRat/t/bitwise.t b/dist/Math-BigRat/t/bitwise.t
new file mode 100644 (file)
index 0000000..be9aa4c
--- /dev/null
@@ -0,0 +1,15 @@
+use strict;
+use warnings;
+use Test::More tests => 22;
+
+use Math::BigRat;
+
+my $x = Math::BigRat->new('3/7');
+
+for my $op (qw(& | ^ << >> &= |= ^= <<= >>=)) {
+    ok !eval "my \$y = \$x $op 42; 1";
+    like $@, qr/^bitwise operation \Q$op\E not supported in Math::BigRat/;
+}
+
+ok !eval "my \$y = ~\$x; 1";
+like $@, qr/^bitwise operation ~ not supported in Math::BigRat/;