diff options
-rw-r--r-- | embedvar.h | 2 | ||||
-rw-r--r-- | intrpvar.h | 4 | ||||
-rw-r--r-- | perlapi.h | 2 | ||||
-rw-r--r-- | pod/perldiag.pod | 2 | ||||
-rw-r--r-- | pod/perlfunc.pod | 6 | ||||
-rw-r--r-- | pp_ctl.c | 9 | ||||
-rw-r--r-- | sv.c | 2 | ||||
-rw-r--r-- | t/lib/warnings/pp_ctl | 5 |
8 files changed, 30 insertions, 2 deletions
diff --git a/embedvar.h b/embedvar.h index 15057bce69..93ba32e162 100644 --- a/embedvar.h +++ b/embedvar.h @@ -345,6 +345,7 @@ #define PL_utf8_xdigit (vTHX->Iutf8_xdigit) #define PL_utf8cache (vTHX->Iutf8cache) #define PL_utf8locale (vTHX->Iutf8locale) +#define PL_v_string_ok (vTHX->Iv_string_ok) #define PL_warnhook (vTHX->Iwarnhook) #define PL_watchaddr (vTHX->Iwatchaddr) #define PL_watchok (vTHX->Iwatchok) @@ -659,6 +660,7 @@ #define PL_Iutf8_xdigit PL_utf8_xdigit #define PL_Iutf8cache PL_utf8cache #define PL_Iutf8locale PL_utf8locale +#define PL_Iv_string_ok PL_v_string_ok #define PL_Iwarnhook PL_warnhook #define PL_Iwatchaddr PL_watchaddr #define PL_Iwatchok PL_watchok diff --git a/intrpvar.h b/intrpvar.h index a6a4a1c641..6fd9b5d3db 100644 --- a/intrpvar.h +++ b/intrpvar.h @@ -668,7 +668,9 @@ PERLVARI(Islabs, I32**, NULL) /* Array of slabs that have been allocated */ PERLVARI(Islab_count, U32, 0) /* Size of the array */ #endif -PERLVARI(Iisarev, HV*, NULL) /* Reverse map of @ISA dependencies */ +PERLVARI(Iisarev, HV*, NULL) /* Reverse map of @ISA dependencies */ + +PERLVARI(Iv_string_ok, bool, FALSE) /* use/require v_string OK */ /* If you are adding a U8 or U16, see the 'Space' comments above on where * there are gaps which currently will be structure padding. */ @@ -726,6 +726,8 @@ END_EXTERN_C #define PL_utf8cache (*Perl_Iutf8cache_ptr(aTHX)) #undef PL_utf8locale #define PL_utf8locale (*Perl_Iutf8locale_ptr(aTHX)) +#undef PL_v_string_ok +#define PL_v_string_ok (*Perl_Iv_string_ok_ptr(aTHX)) #undef PL_warnhook #define PL_warnhook (*Perl_Iwarnhook_ptr(aTHX)) #undef PL_watchaddr diff --git a/pod/perldiag.pod b/pod/perldiag.pod index 1d2650fdc1..9d79311c08 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -4942,6 +4942,8 @@ C<use 5.006_001>. This of course won't help: the older Perls won't suddenly start understanding newer features, but at least they will show a sensible error message indicating the required minimum version. +This warning is suppressed if the C<use 5.x.y> is preceded by a +C<use 5.006> (see C<use VERSION> in L<perlfunc/use>). =item Warning: something's wrong diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod index 48478f30cf..49df408af4 100644 --- a/pod/perlfunc.pod +++ b/pod/perlfunc.pod @@ -6853,9 +6853,15 @@ avoided, because it leads to misleading error messages under earlier versions of Perl that do not support this syntax. The equivalent numeric version should be used instead. +Alternatively, you can use a numeric version C<use 5.006> followed by a +v-string version like C<use v5.10.1>, to avoid the unintuitive C<use +5.010_001>. (older perl versions fail gracefully at the first C<use>, +later perl versions understand the v-string syntax in the second). + use v5.6.1; # compile time version check use 5.6.1; # ditto use 5.006_001; # ditto; preferred for backwards compatibility + use 5.006; use 5.6.1; # ditto, for compatibility and readability This is often useful if you need to check the current Perl version before C<use>ing library modules that have changed in incompatible ways from @@ -3085,11 +3085,18 @@ PP(pp_require) sv = POPs; if ( (SvNIOKp(sv) || SvVOK(sv)) && PL_op->op_type != OP_DOFILE) { - if ( SvVOK(sv) && ckWARN(WARN_PORTABLE) ) /* require v5.6.1 */ + if (!PL_v_string_ok && + SvVOK(sv) && ckWARN(WARN_PORTABLE) ) /* require v5.6.1 */ Perl_warner(aTHX_ packWARN(WARN_PORTABLE), "v-string in use/require non-portable"); sv = new_version(sv); + if (PL_compcv && + vcmp(sv, sv_2mortal(upg_version(newSVnv(5.006), FALSE))) >= 0) + /* version 5.006 recognises 5.x.y in C<use 5.x.y> so + can portably C<use 5.10.0> following C<use 5.006> */ + PL_v_string_ok = TRUE; + if (!sv_derived_from(PL_patchlevel, "version")) upg_version(PL_patchlevel, TRUE); if (cUNOP->op_first->op_type == OP_CONST && cUNOP->op_first->op_private & OPpCONST_NOVER) { @@ -11534,6 +11534,8 @@ perl_clone_using(PerlInterpreter *proto_perl, UV flags, PTR2UV(PL_watchok)); } + PL_v_string_ok = proto_perl->Iv_string_ok; + if (!(flags & CLONEf_KEEP_PTR_TABLE)) { ptr_table_free(PL_ptr_table); PL_ptr_table = NULL; diff --git a/t/lib/warnings/pp_ctl b/t/lib/warnings/pp_ctl index d27e8963f4..dac35525c6 100644 --- a/t/lib/warnings/pp_ctl +++ b/t/lib/warnings/pp_ctl @@ -240,3 +240,8 @@ use warnings; eval 'print $foo'; } EXPECT +######## +# pp_ctl.c +use warnings; +eval 'use 5.006; use 5.10.0'; +EXPECT |