S_doparseform() should return void, not OP*, as it should use Perl_die not DIE
authorNicholas Clark <nick@ccl4.org>
Tue, 26 Apr 2011 10:02:45 +0000 (11:02 +0100)
committerNicholas Clark <nick@ccl4.org>
Wed, 18 May 2011 18:11:03 +0000 (19:11 +0100)
a1b950687051c32e added an error condition in S_doparseform() but used DIE(...)
to report it. DIE is defined as C<return Perl_die>, which acts as a hint to the
compiler about the control flow [as Perl_die() never returns], but also forces
the return type to be OP *. Whilst this is appropriate for pp functions, it's
not for S_doparseform() - a1b950687051c32e had to change the return type to OP*
and return NULL, just to appease DIE(). Hence use Perl_die() instead, remove
return statements, and remove the didn't-return-NULL (dead) code from
pp_formline.

embed.fnc
pp_ctl.c
proto.h

index 65116ad..f32471c 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -1721,7 +1721,7 @@ snR       |char * |bytes_to_uni   |NN const U8 *start|STRLEN len|NN char *dest
 #if defined(PERL_IN_PP_CTL_C)
 sR     |OP*    |docatch        |NULLOK OP *o
 sR     |OP*    |dofindlabel    |NN OP *o|NN const char *label|NN OP **opstack|NN OP **oplimit
-sR     |OP*    |doparseform    |NN SV *sv
+s      |void   |doparseform    |NN SV *sv
 snR    |bool   |num_overflow   |NV value|I32 fldsize|I32 frcsize
 sR     |I32    |dopoptoeval    |I32 startingblock
 sR     |I32    |dopoptogiven   |I32 startingblock
index 1b0b5f7..4fb3b40 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -547,19 +547,16 @@ PP(pp_formline)
     bool item_is_utf8 = FALSE;
     bool targ_is_utf8 = FALSE;
     SV * nsv = NULL;
-    OP * parseres = NULL;
     const char *fmt;
 
     if (!SvMAGICAL(tmpForm) || !SvCOMPILED(tmpForm)) {
        if (SvREADONLY(tmpForm)) {
            SvREADONLY_off(tmpForm);
-           parseres = doparseform(tmpForm);
+           doparseform(tmpForm);
            SvREADONLY_on(tmpForm);
        }
        else
-           parseres = doparseform(tmpForm);
-       if (parseres)
-           return parseres;
+           doparseform(tmpForm);
     }
     SvPV_force(PL_formtarget, len);
     if (SvTAINTED(tmpForm))
@@ -4917,7 +4914,7 @@ PP(pp_break)
        RETURNOP(cx->blk_givwhen.leave_op);
 }
 
-STATIC OP *
+static void
 S_doparseform(pTHX_ SV *sv)
 {
     STRLEN len;
@@ -5132,8 +5129,7 @@ S_doparseform(pTHX_ SV *sv)
     SvCOMPILED_on(sv);
 
     if (unchopnum && repeat)
-        DIE(aTHX_ "Repeated format line will never terminate (~~ and @#)");
-    return 0;
+        Perl_die(aTHX_ "Repeated format line will never terminate (~~ and @#)");
 }
 
 
diff --git a/proto.h b/proto.h
index c83fd12..a733e50 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -5710,8 +5710,7 @@ STATIC OP*        S_dofindlabel(pTHX_ OP *o, const char *label, OP **opstack, OP **opli
 #define PERL_ARGS_ASSERT_DOFINDLABEL   \
        assert(o); assert(label); assert(opstack); assert(oplimit)
 
-STATIC OP*     S_doparseform(pTHX_ SV *sv)
-                       __attribute__warn_unused_result__
+STATIC void    S_doparseform(pTHX_ SV *sv)
                        __attribute__nonnull__(pTHX_1);
 #define PERL_ARGS_ASSERT_DOPARSEFORM   \
        assert(sv)