This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
"use overload fallback => 0" should enable overloading [perl #113010]
authorJesse Luehrs <doy@tozt.net>
Fri, 29 Jun 2012 05:38:04 +0000 (00:38 -0500)
committerJesse Luehrs <doy@tozt.net>
Fri, 29 Jun 2012 05:46:57 +0000 (00:46 -0500)
This makes

  package Foo;
  use overload fallback => 0;

and

  package Bar;
  use overload '+' => \&add, fallback => 0;

behave identically when an operator other than '+' is used.

gv.c
lib/overload.t

diff --git a/gv.c b/gv.c
index c4089cd..8251c29 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -2274,10 +2274,16 @@ Perl_Gv_AMupdate(pTHX_ HV *stash, bool destructing)
        NOOP;   /* Equivalent to !SvTRUE and !SvOK  */
     }
 #endif
-    else if (SvTRUE(sv))
+    else if (SvTRUE(sv)) {
        amt.fallback=AMGfallYES;
-    else if (SvOK(sv))
+        filled = 1;
+        have_ovl = 1;
+    }
+    else if (SvOK(sv)) {
        amt.fallback=AMGfallNEVER;
+        filled = 1;
+        have_ovl = 1;
+    }
 
     for (i = 1; i < lim; i++)
        amt.table[i] = NULL;
index a132492..5212083 100644 (file)
@@ -48,7 +48,7 @@ package main;
 
 $| = 1;
 BEGIN { require './test.pl' }
-plan tests => 5184;
+plan tests => 5186;
 
 use Scalar::Util qw(tainted);
 
@@ -2627,6 +2627,18 @@ is eval {"$a"}, overload::StrVal($a), 'fallback is stored under "()"';
     is($obj->val, 7, "correct result (add incr void)");
 }
 
+# [perl #113010]
+{
+    {
+        package OnlyFallback;
+        use overload fallback => 0;
+    }
+    my $obj = bless {}, 'OnlyFallback';
+    my $died = !eval { "".$obj; 1 };
+    my $err = $@;
+    ok($died, "fallback of 0 causes error");
+    like($err, qr/"\.": no method found/, "correct error");
+}
 
 { # undefining the overload stash -- KEEP THIS TEST LAST
     package ant;