Upgrade to Text-Tabs+Wrap-2006.0711. Keep the local changes from
[p5sagit/p5-mst-13.2.git] / toke.c
diff --git a/toke.c b/toke.c
index dc94328..f4e4499 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -298,7 +298,7 @@ static struct debug_tokens {
     { WHEN,            TOKENTYPE_IVAL,         "WHEN" },
     { WHILE,           TOKENTYPE_IVAL,         "WHILE" },
     { WORD,            TOKENTYPE_OPVAL,        "WORD" },
-    { 0,               TOKENTYPE_NONE,         0 }
+    { 0,               TOKENTYPE_NONE,         NULL }
 };
 
 /* dump the returned token in rv, plus any optional arg in yylval */
@@ -429,8 +429,8 @@ S_no_op(pTHX_ const char *what, char *s)
                    "\t(Missing semicolon on previous line?)\n");
        else if (PL_oldoldbufptr && isIDFIRST_lazy_if(PL_oldoldbufptr,UTF)) {
            const char *t;
-           for (t = PL_oldoldbufptr; *t && (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
-               /**/;
+           for (t = PL_oldoldbufptr; (isALNUM_lazy_if(t,UTF) || *t == ':'); t++)
+               NOOP;
            if (t < PL_bufptr && isSPACE(*t))
                Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                        "\t(Do you need to predeclare %.*s?)\n",
@@ -499,7 +499,7 @@ S_feature_is_enabled(pTHX_ const char *name, STRLEN namelen)
     dVAR;
     HV * const hinthv = GvHV(PL_hintgv);
     char he_name[32] = "feature_";
-    (void) strncpy(&he_name[8], name, 24);
+    (void) my_strlcpy(&he_name[8], name, 24);
 
     return (hinthv && hv_exists(hinthv, he_name, 8 + namelen));
 }
@@ -737,7 +737,9 @@ S_incline(pTHX_ char *s)
        e = t + 1;
     }
     else {
-       for (t = s; !isSPACE(*t); t++) ;
+       t = s;
+       while (!isSPACE(*t))
+           t++;
        e = t;
     }
     while (SPACE_OR_TAB(*e) || *e == '\r' || *e == '\f')
@@ -842,9 +844,10 @@ S_skipspace1(pTHX_ register char *s)
 STATIC char *
 S_skipspace2(pTHX_ register char *s, SV **svp)
 {
-    char *start = s;
-    I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
-    I32 startoff = start - SvPVX(PL_linestr);
+    char *start;
+    const I32 bufptroff = PL_bufptr - SvPVX(PL_linestr);
+    const I32 startoff = s - SvPVX(PL_linestr);
+
     s = skipspace(s);
     PL_bufptr = SvPVX(PL_linestr) + bufptroff;
     if (!PL_madskills || !svp)
@@ -1075,8 +1078,9 @@ S_check_uni(pTHX)
        return;
     while (isSPACE(*PL_last_uni))
        PL_last_uni++;
-    for (s = PL_last_uni; isALNUM_lazy_if(s,UTF) || *s == '-'; s++)
-       /**/;
+    s = PL_last_uni;
+    while (isALNUM_lazy_if(s,UTF) || *s == '-')
+       s++;
     if ((t = strchr(s, '(')) && t < PL_bufptr)
        return;
 
@@ -1194,8 +1198,8 @@ S_curmad(pTHX_ char slot, SV *sv)
        addmad(newMADsv(slot, sv), where, 0);
 }
 #else
-#  define start_force(where)    /*EMPTY*/
-#  define curmad(slot, sv)      /*EMPTY*/
+#  define start_force(where)    NOOP
+#  define curmad(slot, sv)      NOOP
 #endif
 
 /*
@@ -1306,7 +1310,7 @@ STATIC void
 S_force_ident(pTHX_ register const char *s, int kind)
 {
     dVAR;
-    if (s && *s) {
+    if (*s) {
        const STRLEN len = strlen(s);
        OP* const o = (OP*)newSVOP(OP_CONST, 0, newSVpvn(s, len));
        start_force(PL_curforce);
@@ -1972,8 +1976,7 @@ S_scan_const(pTHX_ char *start)
                /* FALL THROUGH */
            default:
                {
-                   if (isALNUM(*s) &&
-                       *s != '_' &&
+                   if ((isALPHA(*s) || isDIGIT(*s)) &&
                        ckWARN(WARN_MISC))
                        Perl_warner(aTHX_ packWARN(WARN_MISC),
                               "Unrecognized escape \\%c passed through",
@@ -2476,7 +2479,7 @@ S_intuit_method(pTHX_ char *start, GV *gv, CV *cv)
                }
            }
        } else
-           gv = 0;
+           gv = NULL;
     }
     s = scan_word(s, tmpbuf, sizeof tmpbuf, TRUE, &len);
     /* start is the beginning of the possible filehandle/object,
@@ -2592,7 +2595,8 @@ Perl_filter_add(pTHX_ filter_t funcp, SV *datasv)
     IoANY(datasv) = FPTR2DPTR(void *, funcp); /* stash funcp into spare field */
     IoFLAGS(datasv) |= IOf_FAKE_DIRP;
     DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_add func %p (%s)\n",
-                         IoANY(datasv), SvPV_nolen(datasv)));
+                         FPTR2DPTR(void *, IoANY(datasv)),
+                         SvPV_nolen(datasv)));
     av_unshift(PL_rsfp_filters, 1);
     av_store(PL_rsfp_filters, 0, datasv) ;
     return(datasv);
@@ -2607,7 +2611,8 @@ Perl_filter_del(pTHX_ filter_t funcp)
     SV *datasv;
 
 #ifdef DEBUGGING
-    DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p", FPTR2DPTR(XPVIO *, funcp)));
+    DEBUG_P(PerlIO_printf(Perl_debug_log, "filter_del func %p",
+                         FPTR2DPTR(void*, funcp)));
 #endif
     if (!PL_rsfp_filters || AvFILLp(PL_rsfp_filters)<0)
        return;
@@ -2636,7 +2641,14 @@ Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
     /* This API is bad. It should have been using unsigned int for maxlen.
        Not sure if we want to change the API, but if not we should sanity
        check the value here.  */
-    const unsigned int correct_length = maxlen < 0 ? INT_MAX : maxlen;
+    const unsigned int correct_length
+       = maxlen < 0 ?
+#ifdef PERL_MICRO
+       0x7FFFFFFF
+#else
+       INT_MAX
+#endif
+       : maxlen;
 
     if (!PL_rsfp_filters)
        return -1;
@@ -2682,7 +2694,7 @@ Perl_filter_read(pTHX_ int idx, SV *buf_sv, int maxlen)
     funcp = DPTR2FPTR(filter_t, IoANY(datasv));
     DEBUG_P(PerlIO_printf(Perl_debug_log,
                          "filter_read %d: via function %p (%s)\n",
-                         idx, datasv, SvPV_nolen_const(datasv)));
+                         idx, (void*)datasv, SvPV_nolen_const(datasv)));
     /* Call function. The function is expected to      */
     /* call "FILTER_READ(idx+1, buf_sv)" first.                */
     /* Return: <0:error, =0:eof, >0:not eof            */
@@ -2727,11 +2739,11 @@ S_find_in_my_stash(pTHX_ const char *pkgname, I32 len)
     }
 
     /* use constant CLASS => 'MyClass' */
-    if ((gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV))) {
-        SV *sv;
-        if (GvCV(gv) && (sv = cv_const_sv(GvCV(gv)))) {
+    gv = gv_fetchpvn_flags(pkgname, len, 0, SVt_PVCV);
+    if (gv && GvCV(gv)) {
+       SV * const sv = cv_const_sv(GvCV(gv));
+       if (sv)
             pkgname = SvPV_nolen_const(sv);
-        }
     }
 
     return gv_stashpv(pkgname, FALSE);
@@ -2777,7 +2789,7 @@ Perl_madlex(pTHX)
            if (PL_realtokenstart < 0 || !CopLINE(PL_curcop))
                PL_thistoken = newSVpvn("",0);
            else {
-               char *tstart = SvPVX(PL_linestr) + PL_realtokenstart;
+               char * const tstart = SvPVX(PL_linestr) + PL_realtokenstart;
                PL_thistoken = newSVpvn(tstart, s - tstart);
            }
        }
@@ -3647,8 +3659,10 @@ Perl_yylex(pTHX)
                }
 #endif
                if (d) {
-                   while (*d && !isSPACE(*d)) d++;
-                   while (SPACE_OR_TAB(*d)) d++;
+                   while (*d && !isSPACE(*d))
+                       d++;
+                   while (SPACE_OR_TAB(*d))
+                       d++;
 
                    if (*d++ == '-') {
                        const bool switches_done = PL_doswitches;
@@ -3807,9 +3821,7 @@ Perl_yylex(pTHX)
 
            if (strnEQ(s,"=>",2)) {
                s = force_word(PL_bufptr,WORD,FALSE,FALSE,FALSE);
-                DEBUG_T( { S_printbuf(aTHX_
-                       "### Saw unary minus before =>, forcing word %s\n", s);
-                } );
+               DEBUG_T( { printbuf("### Saw unary minus before =>, forcing word %s\n", s); } );
                OPERATOR('-');          /* unary minus */
            }
            PL_last_uni = PL_oldbufptr;
@@ -3993,6 +4005,7 @@ Perl_yylex(pTHX)
            attrs = NULL;
            while (isIDFIRST_lazy_if(s,UTF)) {
                I32 tmp;
+               SV *sv;
                d = scan_word(s, PL_tokenbuf, sizeof PL_tokenbuf, FALSE, &len);
                if (isLOWER(*s) && (tmp = keyword(PL_tokenbuf, len))) {
                    if (tmp < 0) tmp = -tmp;
@@ -4010,6 +4023,7 @@ Perl_yylex(pTHX)
                        break;
                    }
                }
+               sv = newSVpvn(s, len);
                if (*d == '(') {
                    d = scan_str(d,TRUE,TRUE);
                    if (!d) {
@@ -4020,11 +4034,11 @@ Perl_yylex(pTHX)
                        yyerror("Unterminated attribute parameter in attribute list");
                        if (attrs)
                            op_free(attrs);
+                       sv_free(sv);
                        return REPORT(0);       /* EOF indicator */
                    }
                }
                if (PL_lex_stuff) {
-                   SV *sv = newSVpvn(s, len);
                    sv_catsv(sv, PL_lex_stuff);
                    attrs = append_elem(OP_LIST, attrs,
                                        newSVOP(OP_CONST, 0, sv));
@@ -4032,7 +4046,8 @@ Perl_yylex(pTHX)
                    PL_lex_stuff = NULL;
                }
                else {
-                   if (len == 6 && strnEQ(s, "unique", len)) {
+                   if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
+                       sv_free(sv);
                        if (PL_in_my == KEY_our) {
 #ifdef USE_ITHREADS
                            GvUNIQUE_on(cGVOPx_gv(yylval.opval));
@@ -4047,14 +4062,22 @@ Perl_yylex(pTHX)
 
                    /* NOTE: any CV attrs applied here need to be part of
                       the CVf_BUILTIN_ATTRS define in cv.h! */
-                   else if (!PL_in_my && len == 6 && strnEQ(s, "lvalue", len))
+                   else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "lvalue", len)) {
+                       sv_free(sv);
                        CvLVALUE_on(PL_compcv);
-                   else if (!PL_in_my && len == 6 && strnEQ(s, "locked", len))
+                   }
+                   else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
+                       sv_free(sv);
                        CvLOCKED_on(PL_compcv);
-                   else if (!PL_in_my && len == 6 && strnEQ(s, "method", len))
+                   }
+                   else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
+                       sv_free(sv);
                        CvMETHOD_on(PL_compcv);
-                   else if (!PL_in_my && len == 9 && strnEQ(s, "assertion", len))
+                   }
+                   else if (!PL_in_my && len == 9 && strnEQ(SvPVX(sv), "assertion", len)) {
+                       sv_free(sv);
                        CvASSERTION_on(PL_compcv);
+                   }
                    /* After we've set the flags, it could be argued that
                       we don't need to do the attributes.pm-based setting
                       process, and shouldn't bother appending recognized
@@ -4068,7 +4091,7 @@ Perl_yylex(pTHX)
                    else
                        attrs = append_elem(OP_LIST, attrs,
                                            newSVOP(OP_CONST, 0,
-                                                   newSVpvn(s, len)));
+                                                   sv));
                }
                s = PEEKSPACE(d);
                if (*s == ':' && s[1] != ':')
@@ -4443,12 +4466,13 @@ Perl_yylex(pTHX)
                }
        }
        if (PL_lex_brackets < PL_lex_formbrack) {
-           const char *t;
+           const char *t = s;
 #ifdef PERL_STRICT_CR
-           for (t = s; SPACE_OR_TAB(*t); t++) ;
+           while (SPACE_OR_TAB(*t))
 #else
-           for (t = s; SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
+           while (SPACE_OR_TAB(*t) || *t == '\r')
 #endif
+               t++;
            if (*t == '\n' || *t == '#') {
                s--;
                PL_expect = XBLOCK;
@@ -4576,10 +4600,10 @@ Perl_yylex(pTHX)
                if (*s == '[') {
                    PL_tokenbuf[0] = '@';
                    if (ckWARN(WARN_SYNTAX)) {
-                       char *t;
-                       for(t = s + 1;
-                           isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$';
-                           t++) ;
+                       char *t = s+1;
+
+                       while (isSPACE(*t) || isALNUM_lazy_if(t,UTF) || *t == '$')
+                           t++;
                        if (*t++ == ',') {
                            PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
                            while (t < PL_bufend && *t != ']')
@@ -4597,12 +4621,15 @@ Perl_yylex(pTHX)
                        && (t = strchr(s, '}')) && (t = strchr(t, '=')))
                        {
                            char tmpbuf[sizeof PL_tokenbuf];
-                           for (t++; isSPACE(*t); t++) ;
+                           do {
+                               t++;
+                           } while (isSPACE(*t));
                            if (isIDFIRST_lazy_if(t,UTF)) {
                                STRLEN dummylen;
                                t = scan_word(t, tmpbuf, sizeof tmpbuf, TRUE,
                                              &dummylen);
-                               for (; isSPACE(*t); t++) ;
+                               while (isSPACE(*t))
+                                   t++;
                                if (*t == ';' && get_cv(tmpbuf, FALSE))
                                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                                                "You need to quote \"%s\"",
@@ -4768,14 +4795,14 @@ Perl_yylex(pTHX)
     case '0': case '1': case '2': case '3': case '4':
     case '5': case '6': case '7': case '8': case '9':
        s = scan_num(s, &yylval);
-       DEBUG_T( { S_printbuf(aTHX_ "### Saw number in %s\n", s); } );
+       DEBUG_T( { printbuf("### Saw number in %s\n", s); } );
        if (PL_expect == XOPERATOR)
            no_op("Number",s);
        TERM(THING);
 
     case '\'':
        s = scan_str(s,!!PL_madskills,FALSE);
-       DEBUG_T( { S_printbuf(aTHX_ "### Saw string before %s\n", s); } );
+       DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
        if (PL_expect == XOPERATOR) {
            if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
                PL_expect = XTERM;
@@ -4792,7 +4819,7 @@ Perl_yylex(pTHX)
 
     case '"':
        s = scan_str(s,!!PL_madskills,FALSE);
-       DEBUG_T( { S_printbuf(aTHX_ "### Saw string before %s\n", s); } );
+       DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
        if (PL_expect == XOPERATOR) {
            if (PL_lex_formbrack && PL_lex_brackets == PL_lex_formbrack) {
                PL_expect = XTERM;
@@ -4817,7 +4844,7 @@ Perl_yylex(pTHX)
 
     case '`':
        s = scan_str(s,!!PL_madskills,FALSE);
-       DEBUG_T( { S_printbuf(aTHX_ "### Saw backtick string before %s\n", s); } );
+       DEBUG_T( { printbuf("### Saw backtick string before %s\n", s); } );
        if (PL_expect == XOPERATOR)
            no_op("Backticks",s);
        if (!s)
@@ -5178,7 +5205,9 @@ Perl_yylex(pTHX)
                if (*s == '(') {
                    CLINE;
                    if (cv) {
-                       for (d = s + 1; SPACE_OR_TAB(*d); d++) ;
+                       d = s + 1;
+                       while (SPACE_OR_TAB(*d))
+                           d++;
                        if (*d == ')' && (sv = gv_const_sv(gv))) {
                            s = d + 1;
 #ifdef PERL_MAD
@@ -5352,7 +5381,9 @@ Perl_yylex(pTHX)
                bareword:
                    if (lastchar != '-') {
                        if (ckWARN(WARN_RESERVED)) {
-                           for (d = PL_tokenbuf; *d && isLOWER(*d); d++) ;
+                           d = PL_tokenbuf;
+                           while (isLOWER(*d))
+                               d++;
                            if (!*d && !gv_stashpv(PL_tokenbuf,FALSE))
                                Perl_warner(aTHX_ packWARN(WARN_RESERVED), PL_warn_reserved,
                                       PL_tokenbuf);
@@ -5464,7 +5495,7 @@ Perl_yylex(pTHX)
                        PUTBACK;
                        PerlIO_apply_layers(aTHX_ PL_rsfp, NULL,
                                            Perl_form(aTHX_ ":encoding(%"SVf")",
-                                                     name));
+                                                     (void*)name));
                        FREETMPS;
                        LEAVE;
                    }
@@ -5944,6 +5975,7 @@ Perl_yylex(pTHX)
 
        case KEY_our:
        case KEY_my:
+       case KEY_state:
            PL_in_my = tmp;
            s = SKIPSPACE1(s);
            if (isIDFIRST_lazy_if(s,UTF)) {
@@ -5957,7 +5989,7 @@ Perl_yylex(pTHX)
                if (!PL_in_my_stash) {
                    char tmpbuf[1024];
                    PL_bufptr = s;
-                   sprintf(tmpbuf, "No such class %.1000s", PL_tokenbuf);
+                   my_snprintf(tmpbuf, sizeof(tmpbuf), "No such class %.1000s", PL_tokenbuf);
                    yyerror(tmpbuf);
                }
 #ifdef PERL_MAD
@@ -5992,8 +6024,10 @@ Perl_yylex(pTHX)
            s = SKIPSPACE1(s);
            if (isIDFIRST_lazy_if(s,UTF)) {
                const char *t;
-               for (d = s; isALNUM_lazy_if(d,UTF); d++) ;
-               for (t=d; *t && isSPACE(*t); t++) ;
+               for (d = s; isALNUM_lazy_if(d,UTF);)
+                   d++;
+               for (t=d; isSPACE(*t);)
+                   t++;
                if ( *t && strchr("|&*+-=!?:.", *t) && ckWARN_d(WARN_PRECEDENCE)
                    /* [perl #16184] */
                    && !(t[0] == '=' && t[1] == '>')
@@ -6447,7 +6481,7 @@ Perl_yylex(pTHX)
                    if (bad_proto && ckWARN(WARN_SYNTAX))
                        Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
                                    "Illegal character in prototype for %"SVf" : %s",
-                                   PL_subname, d);
+                                   (void*)PL_subname, d);
                    SvCUR_set(PL_lex_stuff, tmp);
                    have_proto = TRUE;
 
@@ -6476,7 +6510,7 @@ Perl_yylex(pTHX)
                    if (!have_name)
                        Perl_croak(aTHX_ "Illegal declaration of anonymous subroutine");
                    else if (*s != ';')
-                       Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, PL_subname);
+                       Perl_croak(aTHX_ "Illegal declaration of subroutine %"SVf, (void*)PL_subname);
                }
 
 #ifdef PERL_MAD
@@ -6663,7 +6697,7 @@ S_pending_ident(pTHX)
 {
     dVAR;
     register char *d;
-    register I32 tmp = 0;
+    PADOFFSET tmp = 0;
     /* pit holds the identifier we read and pending_ident is reset */
     char pit = PL_pending_ident;
     PL_pending_ident = 0;
@@ -6688,7 +6722,8 @@ S_pending_ident(pTHX)
         }
         else {
             if (strchr(PL_tokenbuf,':'))
-                yyerror(Perl_form(aTHX_ PL_no_myglob,PL_tokenbuf));
+                yyerror(Perl_form(aTHX_ PL_no_myglob,
+                           PL_in_my == KEY_my ? "my" : "state", PL_tokenbuf));
 
             yylval.opval = newOP(OP_PADANY, 0);
             yylval.opval->op_targ = allocmy(PL_tokenbuf);
@@ -6806,7 +6841,7 @@ S_pending_ident(pTHX)
 I32
 Perl_keyword (pTHX_ const char *name, I32 len)
 {
-  dVAR;
+    dVAR;
   switch (len)
   {
     case 1: /* 5 tokens of length 1 */
@@ -7713,46 +7748,46 @@ Perl_keyword (pTHX_ const char *name, I32 len)
           switch (name[1])
           {
             case 'a':
-            switch (name[2])
-            {
-              case 'i':
-                if (name[3] == 't')
-                {                                 /* wait       */
-                  return -KEY_wait;
-                }
+              switch (name[2])
+              {
+                case 'i':
+                  if (name[3] == 't')
+                  {                               /* wait       */
+                    return -KEY_wait;
+                  }
 
-                goto unknown;
+                  goto unknown;
 
-              case 'r':
-                if (name[3] == 'n')
-                {                                 /* warn       */
-                  return -KEY_warn;
-                }
+                case 'r':
+                  if (name[3] == 'n')
+                  {                               /* warn       */
+                    return -KEY_warn;
+                  }
 
-                goto unknown;
+                  goto unknown;
 
-              default:
-                goto unknown;
-            }
+                default:
+                  goto unknown;
+              }
 
             case 'h':
               if (name[2] == 'e' &&
                   name[3] == 'n')
               {                                   /* when       */
                 return (FEATURE_IS_ENABLED("switch") ? KEY_when : 0);
-          }
+              }
 
-          goto unknown;
+              goto unknown;
 
-        default:
-          goto unknown;
-      }
+            default:
+              goto unknown;
+          }
 
         default:
           goto unknown;
       }
 
-    case 5: /* 38 tokens of length 5 */
+    case 5: /* 39 tokens of length 5 */
       switch (name[0])
       {
         case 'B':
@@ -7809,13 +7844,13 @@ Perl_keyword (pTHX_ const char *name, I32 len)
           {
             case 'l':
               if (name[2] == 'e' &&
-              name[3] == 's' &&
-              name[4] == 's')
-          {                                       /* bless      */
-            return -KEY_bless;
-          }
+                  name[3] == 's' &&
+                  name[4] == 's')
+              {                                   /* bless      */
+                return -KEY_bless;
+              }
 
-          goto unknown;
+              goto unknown;
 
             case 'r':
               if (name[2] == 'e' &&
@@ -8112,14 +8147,29 @@ Perl_keyword (pTHX_ const char *name, I32 len)
               goto unknown;
 
             case 't':
-              if (name[2] == 'u' &&
-                  name[3] == 'd' &&
-                  name[4] == 'y')
-              {                                   /* study      */
-                return KEY_study;
-              }
+              switch (name[2])
+              {
+                case 'a':
+                  if (name[3] == 't' &&
+                      name[4] == 'e')
+                  {                               /* state      */
+                    return (FEATURE_IS_ENABLED("state") ? KEY_state : 0);
+                  }
 
-              goto unknown;
+                  goto unknown;
+
+                case 'u':
+                  if (name[3] == 'd' &&
+                      name[4] == 'y')
+                  {                               /* study      */
+                    return KEY_study;
+                  }
+
+                  goto unknown;
+
+                default:
+                  goto unknown;
+              }
 
             default:
               goto unknown;
@@ -8778,17 +8828,17 @@ Perl_keyword (pTHX_ const char *name, I32 len)
 
                   case 'i':
                     if (name[4] == 'n' &&
-                  name[5] == 'e' &&
-                  name[6] == 'd')
-              {                                   /* defined    */
-                return KEY_defined;
-              }
+                        name[5] == 'e' &&
+                        name[6] == 'd')
+                    {                             /* defined    */
+                      return KEY_defined;
+                    }
 
-              goto unknown;
+                    goto unknown;
 
-            default:
-              goto unknown;
-          }
+                  default:
+                    goto unknown;
+                }
               }
 
               goto unknown;
@@ -10329,23 +10379,25 @@ S_scan_word(pTHX_ register char *s, char *dest, STRLEN destlen, int allow_packag
            Perl_croak(aTHX_ ident_too_long);
        if (isALNUM(*s))        /* UTF handled below */
            *d++ = *s++;
-       else if (*s == '\'' && allow_package && isIDFIRST_lazy_if(s+1,UTF)) {
+       else if (allow_package && (*s == '\'') && isIDFIRST_lazy_if(s+1,UTF)) {
            *d++ = ':';
            *d++ = ':';
            s++;
        }
-       else if (*s == ':' && s[1] == ':' && allow_package && s[2] != '$') {
+       else if (allow_package && (s[0] == ':') && (s[1] == ':') && (s[2] != '$')) {
            *d++ = *s++;
            *d++ = *s++;
        }
        else if (UTF && UTF8_IS_START(*s) && isALNUM_utf8((U8*)s)) {
            char *t = s + UTF8SKIP(s);
+           size_t len;
            while (UTF8_IS_CONTINUED(*t) && is_utf8_mark((U8*)t))
                t += UTF8SKIP(t);
-           if (d + (t - s) > e)
+           len = t - s;
+           if (d + len > e)
                Perl_croak(aTHX_ ident_too_long);
-           Copy(s, d, t - s, char);
-           d += t - s;
+           Copy(s, d, len, char);
+           d += len;
            s = t;
        }
        else {
@@ -10458,10 +10510,11 @@ S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRL
                    Perl_croak(aTHX_ ident_too_long);
            }
            *d = '\0';
-           while (s < send && SPACE_OR_TAB(*s)) s++;
+           while (s < send && SPACE_OR_TAB(*s))
+               s++;
            if ((*s == '[' || (*s == '{' && strNE(dest, "sub")))) {
                if (ckWARN(WARN_AMBIGUOUS) && keyword(dest, d - dest)) {
-                   const char *brack = *s == '[' ? "[...]" : "{...}";
+                   const char * const brack = (*s == '[') ? "[...]" : "{...}";
                    Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
                        "Ambiguous use of %c{%s%s} resolved to %c%s%s",
                        funny, dest, brack, funny, dest, brack);
@@ -10490,12 +10543,12 @@ S_scan_ident(pTHX_ register char *s, register const char *send, char *dest, STRL
                PL_lex_state = LEX_INTERPEND;
                PL_expect = XREF;
            }
-           if (funny == '#')
-               funny = '@';
            if (PL_lex_state == LEX_NORMAL) {
                if (ckWARN(WARN_AMBIGUOUS) &&
                    (keyword(dest, d - dest) || get_cv(dest, FALSE)))
                {
+                   if (funny == '#')
+                       funny = '@';
                    Perl_warner(aTHX_ packWARN(WARN_AMBIGUOUS),
                        "Ambiguous use of %c{%s} resolved to %c%s",
                        funny, dest, funny, dest);
@@ -10666,6 +10719,8 @@ S_scan_subst(pTHX_ char *start)
            sv_catpv(repl, es ? "eval " : "do ");
        sv_catpvs(repl, "{");
        sv_catsv(repl, PL_lex_repl);
+       if (strchr(SvPVX(PL_lex_repl), '#'))
+           sv_catpvs(repl, "\n");
        sv_catpvs(repl, "}");
        SvEVALED_on(repl);
        SvREFCNT_dec(PL_lex_repl);
@@ -10794,7 +10849,9 @@ S_scan_heredoc(pTHX_ register char *s)
     e = PL_tokenbuf + sizeof PL_tokenbuf - 1;
     if (!outer)
        *d++ = '\n';
-    for (peek = s; SPACE_OR_TAB(*peek); peek++) ;
+    peek = s;
+    while (SPACE_OR_TAB(*peek))
+       peek++;
     if (*peek == '`' || *peek == '\'' || *peek =='"') {
        s = peek;
        term = *s++;
@@ -11070,7 +11127,7 @@ S_scan_inputsymbol(pTHX_ char *start)
        or if it didn't end, or if we see a newline
     */
 
-    if (len >= sizeof PL_tokenbuf)
+    if (len >= (I32)sizeof PL_tokenbuf)
        Perl_croak(aTHX_ "Excessively long <> operator");
     if (s >= end)
        Perl_croak(aTHX_ "Unterminated <> operator");
@@ -11129,12 +11186,11 @@ S_scan_inputsymbol(pTHX_ char *start)
           filehandle
        */
        if (*d == '$') {
-           I32 tmp;
-
            /* try to find it in the pad for this block, otherwise find
               add symbol table ops
            */
-           if ((tmp = pad_findmy(d)) != NOT_IN_PAD) {
+           const PADOFFSET tmp = pad_findmy(d);
+           if (tmp != NOT_IN_PAD) {
                if (PAD_COMPNAME_FLAGS_isOUR(tmp)) {
                    HV * const stash = PAD_COMPNAME_OURSTASH(tmp);
                    HEK * const stashname = HvNAME_HEK(stash);
@@ -11482,7 +11538,7 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
        */
 #ifdef PERL_MAD
        if (PL_madskills) {
-           char *tstart = SvPVX(PL_linestr) + stuffstart;
+           char * const tstart = SvPVX(PL_linestr) + stuffstart;
            if (PL_thisstuff)
                sv_catpvn(PL_thisstuff, tstart, PL_bufend - tstart);
            else
@@ -11522,11 +11578,12 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
     if (!PL_encoding || UTF) {
 #ifdef PERL_MAD
        if (PL_madskills) {
-           char *tstart = SvPVX(PL_linestr) + stuffstart;
+           char * const tstart = SvPVX(PL_linestr) + stuffstart;
+           const int len = s - start;
            if (PL_thisstuff)
-               sv_catpvn(PL_thisstuff, tstart, s - tstart);
+               sv_catpvn(PL_thisstuff, tstart, len);
            else
-               PL_thisstuff = newSVpvn(tstart, s - tstart);
+               PL_thisstuff = newSVpvn(tstart, len);
            if (!PL_thisclose && !keep_delims)
                PL_thisclose = newSVpvn(s,termlen);
        }
@@ -11539,11 +11596,12 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
 #ifdef PERL_MAD
     else {
        if (PL_madskills) {
-           char *tstart = SvPVX(PL_linestr) + stuffstart;
+           char * const tstart = SvPVX(PL_linestr) + stuffstart;
+           const int len = s - tstart - termlen;
            if (PL_thisstuff)
-               sv_catpvn(PL_thisstuff, tstart, s - tstart - termlen);
+               sv_catpvn(PL_thisstuff, tstart, len);
            else
-               PL_thisstuff = newSVpvn(tstart, s - tstart - termlen);
+               PL_thisstuff = newSVpvn(tstart, len);
            if (!PL_thisclose && !keep_delims)
                PL_thisclose = newSVpvn(s - termlen,termlen);
        }
@@ -11996,10 +12054,13 @@ S_scan_formline(pTHX_ register char *s)
 
     while (!needargs) {
        if (*s == '.') {
+           t = s+1;
 #ifdef PERL_STRICT_CR
-           for (t = s+1;SPACE_OR_TAB(*t); t++) ;
+           while (SPACE_OR_TAB(*t))
+               t++;
 #else
-           for (t = s+1;SPACE_OR_TAB(*t) || *t == '\r'; t++) ;
+           while (SPACE_OR_TAB(*t) || *t == '\r')
+               t++;
 #endif
            if (*t == '\n' || t == PL_bufend) {
                eofmt = TRUE;
@@ -12235,13 +12296,13 @@ Perl_yyerror(pTHX_ const char *s)
         PL_multi_end = 0;
     }
     if (PL_in_eval & EVAL_WARNONLY && ckWARN_d(WARN_SYNTAX))
-       Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, msg);
+       Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "%"SVf, (void*)msg);
     else
        qerror(msg);
     if (PL_error_count >= 10) {
        if (PL_in_eval && SvCUR(ERRSV))
            Perl_croak(aTHX_ "%"SVf"%s has too many errors.\n",
-            ERRSV, OutCopFILE(PL_curcop));
+                      (void*)ERRSV, OutCopFILE(PL_curcop));
        else
            Perl_croak(aTHX_ "%s has too many errors.\n",
             OutCopFILE(PL_curcop));
@@ -12385,7 +12446,8 @@ utf16_textfilter(pTHX_ int idx, SV *sv, int maxlen)
     const I32 count = FILTER_READ(idx+1, sv, maxlen);
     DEBUG_P(PerlIO_printf(Perl_debug_log,
                          "utf16_textfilter(%p): %d %d (%d)\n",
-                         utf16_textfilter, idx, maxlen, (int) count));
+                         FPTR2DPTR(void *, utf16_textfilter),
+                         idx, maxlen, (int) count));
     if (count) {
        U8* tmps;
        I32 newlen;
@@ -12407,7 +12469,8 @@ utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen)
     const I32 count = FILTER_READ(idx+1, sv, maxlen);
     DEBUG_P(PerlIO_printf(Perl_debug_log,
                          "utf16rev_textfilter(%p): %d %d (%d)\n",
-                         utf16rev_textfilter, idx, maxlen, (int) count));
+                         FPTR2DPTR(void *, utf16rev_textfilter),
+                         idx, maxlen, (int) count));
     if (count) {
        U8* tmps;
        I32 newlen;