Make sv_vcatpvfn() complain when special formats "%s" and "%.0f" can't find their...
Vincent Pit [Thu, 6 May 2010 18:28:58 +0000 (20:28 +0200)]
This fixes [RT #62874] : printf does not print a warning when a lone %s conversion is used

sv.c
t/op/sprintf.t

diff --git a/sv.c b/sv.c
index ae9f9d0..4f2ad99 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -9365,6 +9365,8 @@ Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
        else if (svix < svmax) {
            sv_catsv(sv, *svargs);
        }
+       else
+           S_vcatpvfn_missing_argument(aTHX);
        return;
     }
     if (args && patlen == 3 && pat[0] == '%' &&
@@ -9390,7 +9392,7 @@ Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
            if (svix < svmax)
                nv = SvNV(*svargs);
            else
-               return;
+               S_vcatpvfn_missing_argument(aTHX);
            if (*pp == 'g') {
                /* Add check for digits != 0 because it seems that some
                   gconverts are buggy in this case, and we don't yet have
index a127143..8d93297 100644 (file)
@@ -373,6 +373,8 @@ __END__
 >%+8.1f<    >-1234.875<   > -1234.9<
 >%*.*f<     >[5, 2, 12.3456]< >12.35<
 >%f<        >0<           >0.000000<
+>%.0f<      >[]<          >0 MISSING<
+> %.0f<     >[]<          > 0 MISSING<
 >%.0f<      >0<           >0<
 >%.0f<      >2**38<       >274877906944<   >Should have exact int'l rep'n<
 >%.0f<      >0.1<         >0<
@@ -494,6 +496,8 @@ __END__
 >%#p<       >''<          >%#p INVALID<
 >%q<        >''<          >%q INVALID<
 >%r<        >''<          >%r INVALID<
+>%s<        >[]<          > MISSING<
+> %s<       >[]<          >  MISSING<
 >%s<        >'string'<    >string<
 >%10s<      >'string'<    >    string<
 >%+10s<     >'string'<    >    string<