diff options
author | Karl Williamson <khw@cpan.org> | 2014-09-22 11:56:48 -0600 |
---|---|---|
committer | Karl Williamson <khw@cpan.org> | 2014-09-29 11:07:40 -0600 |
commit | cc4d09e1f55f1a823a9b410aa3e43aab0df8147a (patch) | |
tree | 476764295d45b9f5528ffa62205dc79ff77ca6a3 /toke.c | |
parent | 477afe810ce7934cb37983108672d43de207e0c5 (diff) | |
download | perl-cc4d09e1f55f1a823a9b410aa3e43aab0df8147a.tar.gz |
Deprecate multiple "x" in "/xx"
It is planned for a future Perl release to have /xx mean something
different from just /x. To prepare for this, this commit raises a
deprecation warning if someone currently has this usage. A grep of CPAN
did not turn up any instances of this, but this is to be safe anyway.
The added code is more general than actually needed, in case we want to
do this for another flag.
Diffstat (limited to 'toke.c')
-rw-r--r-- | toke.c | 17 |
1 files changed, 13 insertions, 4 deletions
@@ -8668,7 +8668,7 @@ S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni) } static bool -S_pmflag(pTHX_ const char* const valid_flags, U32 * pmfl, char** s, char* charset) { +S_pmflag(pTHX_ const char* const valid_flags, U32 * pmfl, char** s, char* charset, unsigned int * x_mod_count) { /* Adds, subtracts to/from 'pmfl' based on the next regex modifier flag * found in the parse starting at 's', based on the subset that are valid @@ -8697,7 +8697,7 @@ S_pmflag(pTHX_ const char* const valid_flags, U32 * pmfl, char** s, char* charse switch (c) { - CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl); + CASE_STD_PMMOD_FLAGS_PARSE_SET(pmfl, *x_mod_count); case GLOBAL_PAT_MOD: *pmfl |= PMf_GLOBAL; break; case CONTINUE_PAT_MOD: *pmfl |= PMf_CONTINUE; break; case ONCE_PAT_MOD: *pmfl |= PMf_KEEP; break; @@ -8772,6 +8772,7 @@ S_scan_pat(pTHX_ char *start, I32 type) const char * const valid_flags = (const char *)((type == OP_QR) ? QR_PAT_MODS : M_PAT_MODS); char charset = '\0'; /* character set modifier */ + unsigned int x_mod_count = 0; PERL_ARGS_ASSERT_SCAN_PAT; @@ -8821,7 +8822,9 @@ S_scan_pat(pTHX_ char *start, I32 type) pm->op_pmflags |= PMf_IS_QR; } - while (*s && S_pmflag(aTHX_ valid_flags, &(pm->op_pmflags), &s, &charset)) {}; + while (*s && S_pmflag(aTHX_ valid_flags, &(pm->op_pmflags), + &s, &charset, &x_mod_count)) + {}; /* issue a warning if /c is specified,but /g is not */ if ((pm->op_pmflags & PMf_CONTINUE) && !(pm->op_pmflags & PMf_GLOBAL)) { @@ -8829,6 +8832,8 @@ S_scan_pat(pTHX_ char *start, I32 type) "Use of /c modifier is meaningless without /g" ); } + STD_PMMOD_FLAGS_PARSE_X_WARN(x_mod_count); + PL_lex_op = (OP*)pm; pl_yylval.ival = OP_MATCH; return s; @@ -8843,6 +8848,7 @@ S_scan_subst(pTHX_ char *start) line_t first_line; I32 es = 0; char charset = '\0'; /* character set modifier */ + unsigned int x_mod_count = 0; char *t; PERL_ARGS_ASSERT_SCAN_SUBST; @@ -8876,12 +8882,15 @@ S_scan_subst(pTHX_ char *start) s++; es++; } - else if (! S_pmflag(aTHX_ S_PAT_MODS, &(pm->op_pmflags), &s, &charset)) + else if (! S_pmflag(aTHX_ S_PAT_MODS, &(pm->op_pmflags), + &s, &charset, &x_mod_count)) { break; } } + STD_PMMOD_FLAGS_PARSE_X_WARN(x_mod_count); + if ((pm->op_pmflags & PMf_CONTINUE)) { Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP), "Use of /c modifier is meaningless in s///" ); } |