allow eval-groups in patterns only if they C<use re 'eval';>
[p5sagit/p5-mst-13.2.git] / toke.c
diff --git a/toke.c b/toke.c
index 27571e4..8d495f6 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -544,7 +544,7 @@ force_ident(register char *s, int kind)
            /* XXX see note in pp_entereval() for why we forgo typo
               warnings if the symbol must be introduced in an eval.
               GSAR 96-10-12 */
-           gv_fetchpv(s, in_eval ? (GV_ADDMULTI | 8) : TRUE,
+           gv_fetchpv(s, in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
                kind == '$' ? SVt_PV :
                kind == '@' ? SVt_PVAV :
                kind == '%' ? SVt_PVHV :
@@ -1522,7 +1522,7 @@ yylex(void)
        /* build ops for a bareword */
        yylval.opval = (OP*)newSVOP(OP_CONST, 0, newSVpv(tokenbuf+1, 0));
        yylval.opval->op_private = OPpCONST_ENTERED;
-       gv_fetchpv(tokenbuf+1, in_eval ? (GV_ADDMULTI | 8) : TRUE,
+       gv_fetchpv(tokenbuf+1, in_eval ? (GV_ADDMULTI | GV_ADDINEVAL) : TRUE,
                   ((tokenbuf[0] == '$') ? SVt_PV
                    : (tokenbuf[0] == '@') ? SVt_PVAV
                    : SVt_PVHV));
@@ -2821,14 +2821,28 @@ yylex(void)
        }
 
        if (tmp < 0) {                  /* second-class keyword? */
-           if (expect != XOPERATOR && (*s != ':' || s[1] != ':') &&
-               (((gv = gv_fetchpv(tokenbuf, FALSE, SVt_PVCV)) &&
-                 GvCVu(gv) && GvIMPORTED_CV(gv)) ||
-                ((gvp = (GV**)hv_fetch(globalstash,tokenbuf,len,FALSE)) &&
-                 (gv = *gvp) != (GV*)&sv_undef &&
-                 GvCVu(gv) && GvIMPORTED_CV(gv))))
-           {
-               tmp = 0;                /* overridden by importation */
+           GV *ogv = Nullgv;   /* override (winner) */
+           GV *hgv = Nullgv;   /* hidden (loser) */
+           if (expect != XOPERATOR && (*s != ':' || s[1] != ':')) {
+               CV *cv;
+               if ((gv = gv_fetchpv(tokenbuf, FALSE, SVt_PVCV)) &&
+                   (cv = GvCVu(gv)))
+               {
+                   if (GvIMPORTED_CV(gv))
+                       ogv = gv;
+                   else if (! CvMETHOD(cv))
+                       hgv = gv;
+               }
+               if (!ogv &&
+                   (gvp = (GV**)hv_fetch(globalstash,tokenbuf,len,FALSE)) &&
+                   (gv = *gvp) != (GV*)&sv_undef &&
+                   GvCVu(gv) && GvIMPORTED_CV(gv))
+               {
+                   ogv = gv;
+               }
+           }
+           if (ogv) {
+               tmp = 0;                /* overridden by import or by GLOBAL */
            }
            else if (gv && !gvp
                     && -tmp==KEY_lock  /* XXX generalizable kludge */
@@ -2836,8 +2850,13 @@ yylex(void)
            {
                tmp = 0;                /* any sub overrides "weak" keyword */
            }
-           else {
-               tmp = -tmp; gv = Nullgv; gvp = 0;
+           else {                      /* no override */
+               tmp = -tmp;
+               gv = Nullgv;
+               gvp = 0;
+               if (dowarn && hgv)
+                   warn("Subroutine %s::%s hidden by keyword; use ampersand",
+                        HvNAME(GvESTASH(hgv)), GvENAME(hgv));
            }
        }
 
@@ -4399,7 +4418,7 @@ keyword(register char *d, I32 len)
        case 3:
            if (strEQ(d,"ord"))                 return -KEY_ord;
            if (strEQ(d,"oct"))                 return -KEY_oct;
-           if (strEQ(d,"our")) { deprecate("reserved keyword \"our\"");
+           if (strEQ(d,"our")) { deprecate("reserved word \"our\"");
                                                return 0;}
            break;
        case 4: