[perl #94984] Remove prototypes for infix ops
authorFather Chrysostomos <sprout@cpan.org>
Tue, 19 Jul 2011 05:30:52 +0000 (22:30 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 19 Jul 2011 05:30:52 +0000 (22:30 -0700)
This commit makes prototype("CORE::$_") return undef for these
infix ops, instead of the prototype (or error) shown here:

and ()
cmp Error: Cannot find an op number for cmp
eq  ($$)
ge  ($$)
gt  ($$)
le  ($$)
lt  ($$)
ne  ($$)
or  ()
x   Error: Cannot find an op number for x
xor ($$)

Those prototypes are not actually correct, and dying for what are real
Perl keywords is just mean.

pod/perldelta.pod
pp.c
t/op/cproto.t

index e041408..fce51f8 100644 (file)
@@ -696,6 +696,12 @@ like C<time>.
 
 =item *
 
+C<prototype> now returns C<undef> for all overridable infix operators.  It
+used to return incorrect prototypes for some and die for others
+[perl #94984].
+
+=item *
+
 A bug affecting lvalue context propagation through nested lvalue subroutine
 calls has been fixed.  Previously, returning a value in nested rvalue
 context would be treated as lvalue context by the inner subroutine call,
diff --git a/pp.c b/pp.c
index 3c46fc3..141f4bb 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -436,7 +436,13 @@ PP(pp_prototype)
                char str[ MAX_ARGS_OP * 2 + 2 ]; /* One ';', one '\0' */
 
                if (code == -KEY_chop || code == -KEY_chomp
-                       || code == -KEY_exec || code == -KEY_system)
+                       || code == -KEY_exec || code == -KEY_system
+                       || code == -KEY_and || code == -KEY_cmp
+                       || code == -KEY_eq || code == -KEY_ge
+                       || code == -KEY_gt || code == -KEY_le
+                       || code == -KEY_lt || code == -KEY_lt
+                       || code == -KEY_ne || code == -KEY_or
+                       || code == -KEY_x || code == -KEY_xor)
                    goto set;
                if (code == -KEY_mkdir) {
                    ret = newSVpvs_flags("_;$", SVs_TEMP);
index 9338dda..995500c 100644 (file)
@@ -33,7 +33,7 @@ __PACKAGE__ ()
 abs (_)
 accept (**)
 alarm (_)
-and ()
+and undef
 atan2 ($$)
 bind (*$)
 binmode (*;$)
@@ -48,7 +48,7 @@ chr (_)
 chroot (_)
 close (;*)
 closedir (*)
-cmp unknown
+cmp undef
 connect (*$)
 continue ()
 cos (_)
@@ -70,7 +70,7 @@ endprotoent ()
 endpwent ()
 endservent ()
 eof (;*)
-eq ($$)
+eq undef
 eval undef
 exec undef
 exists undef
@@ -84,7 +84,7 @@ foreach undef
 fork ()
 format undef
 formline ($@)
-ge ($$)
+ge undef
 getc (;*)
 getgrent ()
 getgrgid ($)
@@ -116,7 +116,7 @@ glob undef
 gmtime (;$)
 goto undef
 grep undef
-gt ($$)
+gt undef
 hex (_)
 if undef
 index ($$;$)
@@ -128,7 +128,7 @@ kill (@)
 last undef
 lc (_)
 lcfirst (_)
-le ($$)
+le undef
 length (_)
 link ($$)
 listen (*$)
@@ -137,7 +137,7 @@ localtime (;$)
 lock (\$)
 log (_)
 lstat (*)
-lt ($$)
+lt undef
 m undef
 map undef
 mkdir (_;$)
@@ -146,14 +146,14 @@ msgget ($$)
 msgrcv ($$$$$)
 msgsnd ($$$)
 my undef
-ne ($$)
+ne undef
 next undef
 no undef
 not ($)
 oct (_)
 open (*;$@)
 opendir (*$)
-or ()
+or undef
 ord (_)
 our undef
 pack ($@)
@@ -264,6 +264,6 @@ warn (@)
 when undef
 while undef
 write (;*)
-x unknown
-xor ($$)
+x undef
+xor undef
 y undef