From fbc891ce838d50f87f51648f1bf049f1eb5cda7a Mon Sep 17 00:00:00 2001 From: Robin Barker Date: Fri, 5 Oct 2007 13:12:05 +0100 Subject: [PATCH] New [PATCH] use 5.006; use 5.10.0 From: "Robin Barker" Message-ID: <2C2E01334A940D4792B3E115F95B7226016048DB@exchsvr1.npl.ad.local> p4raw-id: //depot/perl@32031 --- pod/perldiag.pod | 3 +++ pod/perlfunc.pod | 6 ++++++ pp_ctl.c | 26 ++++++++++++++++++++------ t/lib/warnings/pp_ctl | 17 +++++++++++++++++ 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/pod/perldiag.pod b/pod/perldiag.pod index 1c5128a..5286fbe 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -4943,6 +4943,9 @@ 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 is preceded by a +C (see C in L). + =item Warning: something's wrong (W) You passed warn() an empty string (the equivalent of C) or diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod index e6f6cc4..f3454b4 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 followed by a +v-string version like C, to avoid the unintuitive C. (older perl versions fail gracefully at the first C, +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 Cing library modules that have changed in incompatible ways from diff --git a/pp_ctl.c b/pp_ctl.c index b512686..7f37b75 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -3080,10 +3080,14 @@ 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 ( SvVOK(sv) && ckWARN(WARN_PORTABLE) ) { /* require v5.6.1 */ + HV * hinthv = GvHV(PL_hintgv); + SV ** ptr = NULL; + if (hinthv) ptr = hv_fetchs(hinthv, "v_string", FALSE); + if ( !(ptr && *ptr && SvIOK(*ptr) && SvIV(*ptr)) ) Perl_warner(aTHX_ packWARN(WARN_PORTABLE), "v-string in use/require non-portable"); - + } sv = new_version(sv); if (!sv_derived_from(PL_patchlevel, "version")) upg_version(PL_patchlevel, TRUE); @@ -3133,15 +3137,25 @@ PP(pp_require) } } - /* If we request a version >= 5.9.5, load feature.pm with the - * feature bundle that corresponds to the required version. - * We do this only with use, not require. */ - if (PL_compcv && vcmp(sv, sv_2mortal(upg_version(newSVnv(5.009005), FALSE))) >= 0) { + /* We do this only with use, not require. */ + if (PL_compcv && + /* If we request a version >= 5.6.0, then v-string are OK + so set $^H{v_string} to suppress the v-string warning */ + vcmp(sv, sv_2mortal(upg_version(newSVnv(5.006), FALSE))) >= 0) { + HV * hinthv = GvHV(PL_hintgv); + if( hinthv ) { + (void)hv_stores(hinthv, "v_string", newSViv(1)); + PL_hints |= HINT_LOCALIZE_HH; + } + /* If we request a version >= 5.9.5, load feature.pm with the + * feature bundle that corresponds to the required version. */ + if (vcmp(sv, sv_2mortal(upg_version(newSVnv(5.009005), FALSE))) >= 0) { SV *const importsv = vnormal(sv); *SvPVX_mutable(importsv) = ':'; ENTER; Perl_load_module(aTHX_ 0, newSVpvs("feature"), NULL, importsv, NULL); LEAVE; + } } RETPUSHYES; diff --git a/t/lib/warnings/pp_ctl b/t/lib/warnings/pp_ctl index d27e896..923d54c 100644 --- a/t/lib/warnings/pp_ctl +++ b/t/lib/warnings/pp_ctl @@ -240,3 +240,20 @@ use warnings; eval 'print $foo'; } EXPECT +######## +# pp_ctl.c +use warnings; +eval 'use 5.006; use 5.10.0'; +EXPECT +######## +# pp_ctl.c +use warnings; +eval '{use 5.006;} use 5.10.0'; +EXPECT +v-string in use/require non-portable at (eval 1) line 2. +######## +# pp_ctl.c +use warnings; +eval 'use vars; use 5.10.0'; +EXPECT +v-string in use/require non-portable at (eval 1) line 2. -- 2.7.4