This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
blead breaks Attribute::Constant
authorKarl Williamson <public@khwilliamson.com>
Sun, 12 Dec 2010 18:28:20 +0000 (11:28 -0700)
committerKarl Williamson <public@khwilliamson.com>
Sun, 12 Dec 2010 20:13:45 +0000 (13:13 -0700)
The problem is that I confused FOLD with ANYOF_FOLD, and as a result,
emitted a locale regnode, which is tainted.  Any tests that required
non-tainting started failing

regcomp.c
t/op/taint.t

index 66cadcf..eb34b16 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -8955,8 +8955,8 @@ parseit:
 
        /* (A locale node can have 1 point and be folded; all the other folds
         * will include the fold, hence will have 2 points, so we won't get
-        * here with FOLD set unless it is also locale) */
-       ret = reg_node(pRExC_state, (U8) (! FOLD)
+        * here with ANYOF_FOLD set unless it is also locale) */
+       ret = reg_node(pRExC_state, (U8) (! (ANYOF_FLAGS(ret) & ANYOF_FOLD))
                                         ? EXACT
                                         : EXACTFL
                    );
index 0decc97..78b3d55 100644 (file)
@@ -17,7 +17,7 @@ use Config;
 use File::Spec::Functions;
 
 BEGIN { require './test.pl'; }
-plan tests => 336;
+plan tests => 338;
 
 $| = 1;
 
@@ -1437,6 +1437,14 @@ end
     ok(tainted($^A), "tainted formline picture makes a tainted accumulator");
 }
 
+{   # Bug #80610
+    "Constant(1)" =~ / ^ ([a-z_]\w*) (?: [(] (.*) [)] )? $ /xi;
+    my $a = $1;
+    my $b = $2;
+    ok(! tainted($a), "regex optimization of single char /[]/i doesn't taint");
+    ok(! tainted($b), "regex optimization of single char /[]/i doesn't taint");
+}
+
 # This may bomb out with the alarm signal so keep it last
 SKIP: {
     skip "No alarm()"  unless $Config{d_alarm};