Update Changes.
[p5sagit/p5-mst-13.2.git] / mg.c
diff --git a/mg.c b/mg.c
index c0d6132..088ae0b 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -379,11 +379,13 @@ Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
     return 0;
 }
 
-void
+int
 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
 {
     dTHR;
     Perl_croak(aTHX_ PL_no_modify);
+    /* NOT REACHED */
+    return 0;
 }
 
 U32
@@ -1745,18 +1747,21 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
                    PL_compiling.cop_warnings = pWARN_NONE;
                    break;
                }
-                if (isWARN_on(sv, WARN_ALL) && !isWARNf_on(sv, WARN_ALL)) {
-                   PL_compiling.cop_warnings = pWARN_ALL;
-                   PL_dowarn |= G_WARN_ONCE ;
-               }       
-               else {
+               {
                    STRLEN len, i;
                    int accumulate = 0 ;
+                   int any_fatals = 0 ;
                    char * ptr = (char*)SvPV(sv, len) ;
-                   for (i = 0 ; i < len ; ++i) 
-                       accumulate += ptr[i] ;
+                   for (i = 0 ; i < len ; ++i) {
+                       accumulate |= ptr[i] ;
+                       any_fatals |= (ptr[i] & 0xAA) ;
+                   }
                    if (!accumulate)
                        PL_compiling.cop_warnings = pWARN_NONE;
+                   else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
+                       PL_compiling.cop_warnings = pWARN_ALL;
+                       PL_dowarn |= G_WARN_ONCE ;
+                   }   
                     else {
                        if (specialWARN(PL_compiling.cop_warnings))
                            PL_compiling.cop_warnings = newSVsv(sv) ;
@@ -1765,6 +1770,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
                        if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
                            PL_dowarn |= G_WARN_ONCE ;
                    }
+
                }
            }
        }