This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #123955] Fix assert fail with 0 s/// in quotes
[perl5.git] / t / base / lex.t
index 590f219..6a8ac61 100644 (file)
@@ -1,6 +1,6 @@
 #!./perl
 
-print "1..71\n";
+print "1..102\n";
 
 $x = 'x';
 
@@ -120,26 +120,18 @@ print $foo;
 # Tests for new extended control-character variables
 # MJD 19990227
 
+my $test = 31;
+
 { my $CX = "\cX";
   my $CXY  ="\cXY";
   $ {$CX} = 17;
   $ {$CXY} = 23;
   if ($ {^XY} != 23) { print "not "  }
-  print "ok 31\n";
+  print "ok $test\n"; $test++;
  
-# Does the syntax where we use the literal control character still work?
-  if (eval "\$ {\cX}" != 17 or $@) { print "not "  }
-  print "ok 32\n";
-
-  eval "\$\cQ = 24";                 # Literal control character
-  if ($@ or ${"\cQ"} != 24) {  print "not "  }
-  print "ok 33\n";
-  if ($^Q != 24) {  print "not "  }  # Control character escape sequence
-  print "ok 34\n";
-
 # Does the old UNBRACED syntax still do what it used to?
   if ("$^XY" ne "17Y") { print "not " }
-  print "ok 35\n";
+  print "ok $test\n"; $test++;
 
   sub XX () { 6 }
   $ {"\cQ\cXX"} = 119; 
@@ -147,9 +139,7 @@ print $foo;
   $N = 5;
   # The second caret here should be interpreted as an xor
   if (($^Q^XX) != 3) { print "not " } 
-  print "ok 36\n";
-#  if (($N  ^  XX()) != 3) { print "not " } 
-#  print "ok 32\n";
+  print "ok $test\n"; $test++;
 
   # These next two tests are trying to make sure that
   # $^FOO is always global; it doesn't make sense to 'my' it.
@@ -157,12 +147,12 @@ print $foo;
 
   eval 'my $^X;';
   print "not " unless index ($@, 'Can\'t use global $^X in "my"') > -1;
-  print "ok 37\n";
+  print "ok $test\n"; $test++;
 #  print "($@)\n" if $@;
 
   eval 'my $ {^XYZ};';
   print "not " unless index ($@, 'Can\'t use global $^XYZ in "my"') > -1;
-  print "ok 38\n";
+  print "ok $test\n"; $test++;
 #  print "($@)\n" if $@;
 
 # Now let's make sure that caret variables are all forced into the main package.
@@ -172,11 +162,11 @@ print $foo;
   $ {^M} = 'Someother 3';
   package main;
   print "not " unless $^Q eq 'Someother';
-  print "ok 39\n";
+  print "ok $test\n"; $test++;
   print "not " unless $ {^Quixote} eq 'Someother 2';
-  print "ok 40\n";
+  print "ok $test\n"; $test++;
   print "not " unless $ {^M} eq 'Someother 3';
-  print "ok 41\n";
+  print "ok $test\n"; $test++;
 
   
 }
@@ -190,8 +180,6 @@ sub T {
     print "ok $num\n";
 }
 
-my $test = 42;
-
 {
 # line 42 "plink"
     local $_ = "not ok ";
@@ -213,7 +201,6 @@ EOT
 # arrays now *always* interpolate into "..." strings.
 # 20000522 MJD (mjd@plover.com)
 {
-  my $test = 47;
   eval(q(">@nosuch<" eq "><")) || print "# $@", "not ";
   print "ok $test\n";
   ++$test;
@@ -257,7 +244,6 @@ my %str = (
     xyz::bar => 1,
 );
 
-my $test = 52;
 print ((exists $str{foo}      ? "" : "not ")."ok $test\n"); ++$test;
 print ((exists $str{bar}      ? "" : "not ")."ok $test\n"); ++$test;
 print ((exists $str{xyz::bar} ? "" : "not ")."ok $test\n"); ++$test;
@@ -272,85 +258,250 @@ $test++;
 # Is "[~" scanned correctly?
 @a = (1,2,3);
 print "not " unless($a[~~2] == 3);
-print "ok 57\n";
+print "ok $test\n"; $test++;
 
 $_ = "";
-eval 's/(?:)/"${\q||}".<<\END/e;
-ok 58 - heredoc after "" in s/// in eval
+eval 's/(?:)/"ok $test" . "${\q||}".<<\END/e;
+ - heredoc after "" in s/// in eval
 END
 ';
-print $_ || "not ok 58\n";
+print $_ || "not ok $test\n"; $test++;
 
 $_ = "";
-eval 's|(?:)|"${\<<\END}"
-ok 59 - heredoc in "" in multiline s///e in eval
+eval 's|(?:)|"ok $test" . "${\<<\END}"
+ - heredoc in "" in multiline s///e in eval
 END
 |e
 ';
-print $_ || "not ok 59\n";
+print $_ || "not ok $test\n"; $test++;
 
 $_ = "";
 eval "s/(?:)/<<foo/e #\0
-ok 60 - null on same line as heredoc in s/// in eval
+ok $test - null on same line as heredoc in s/// in eval
 foo
 ";
-print $_ || "not ok 60\n";
+print $_ || "not ok $test\n"; $test++;
 
 $_ = "";
 eval ' s/(?:)/"${\<<END}"/e;
-ok 61 - heredoc in "" in single-line s///e in eval
+ok $test - heredoc in "" in single-line s///e in eval
 END
 ';
-print $_ || "not ok 61\n";
+print $_ || "not ok $test\n"; $test++;
 
 $_ = "";
 s|(?:)|"${\<<END}"
-ok 62 - heredoc in "" in multiline s///e outside eval
+ok $test - heredoc in "" in multiline s///e outside eval
 END
 |e;
-print $_ || "not ok 62\n";
+print $_ || "not ok $test\n"; $test++;
 
-$_ = "not ok 63 - s/// in s/// pattern\n";
+$_ = "not ok $test - s/// in s/// pattern\n";
 s/${s|||;\""}not //;
-print;
+print; $test++;
 
 /(?{print <<END
-ok 64 - here-doc in re-eval
+ok $test - here-doc in re-eval
 END
-})/;
+})/; $test++;
 
 eval '/(?{print <<END
-ok 65 - here-doc in re-eval in string eval
+ok $test - here-doc in re-eval in string eval
 END
-})/';
+})/'; $test++;
 
-eval 'print qq ;ok 66 - eval ending with semicolon\n;'
-  or print "not ok 66 - eval ending with semicolon\n";
+eval 'print qq ;ok $test - eval ending with semicolon\n;'
+  or print "not ok $test - eval ending with semicolon\n"; $test++;
 
 print "not " unless qr/(?{<<END})/ eq '(?^:(?{<<END}))';
 foo
 END
-print "ok 67 - here-doc in single-line re-eval\n";
+print "ok $test - here-doc in single-line re-eval\n"; $test++;
 
 $_ = qr/(?{"${<<END}"
 foo
 END
 })/;
 print "not " unless /foo/;
-print "ok 68 - here-doc in quotes in multiline re-eval\n";
+print "ok $test - here-doc in quotes in multiline re-eval\n"; $test++;
 
 eval 's//<<END/e if 0; $_ = "a
 END
 b"';
 print "not " if $_ =~ /\n\n/;
-print "ok 69 - eval 's//<<END/' does not leave extra newlines\n";
+print "ok $test - eval 's//<<END/' does not leave extra newlines\n"; $test++;
 
 $_ = a;
 eval "s/a/'b\0'#/e";
 print 'not ' unless $_ eq "b\0";
-print "ok 70 - # after null in s/// repl\n";
+print "ok $test - # after null in s/// repl\n"; $test++;
 
 s//"#" . <<END/e;
 foo
 END
-print "ok 71 - s//'#' . <<END/e\n";
+print "ok $test - s//'#' . <<END/e\n"; $test++;
+
+eval "s//3}->{3/e";
+print "not " unless $@;
+print "ok $test - s//3}->{3/e\n"; $test++;
+
+$_ = "not ok $test";
+$x{3} = "not ";
+eval 's/${\%x}{3}//e';
+print "$_ - s//\${\\%x}{3}/e\n"; $test++;
+
+eval 's/${foo#}//e';
+print "not " unless $@;
+print "ok $test - s/\${foo#}//e\n"; $test++;
+
+eval 'warn ({$_ => 1} + 1) if 0';
+print "not " if $@;
+print "ok $test - listop({$_ => 1} + 1)\n"; $test++;
+print "# $@" if $@;
+
+for(qw< require goto last next redo dump >) {
+    eval "sub { $_ foo << 2 }";
+    print "not " if $@;
+    print "ok ", $test++, " - [perl #105924] $_ WORD << ...\n";
+    print "# $@" if $@;
+}
+
+# http://rt.perl.org/rt3/Ticket/Display.html?id=56880
+my $counter = 0;
+eval 'v23: $counter++; goto v23 unless $counter == 2';
+print "not " unless $counter == 2;
+print "ok $test - Use v[0-9]+ as a label\n"; $test++;
+$counter = 0;
+eval 'v23 : $counter++; goto v23 unless $counter == 2';
+print "not " unless $counter == 2;
+print "ok $test - Use v[0-9]+ as a label with space before colon\n"; $test++;
+my $output = "";
+eval "package v10::foo; sub test2 { return 'v10::foo' }
+      package v10; sub test { return v10::foo::test2(); }
+      package main; \$output = v10::test(); "; 
+print "not " unless $output eq 'v10::foo';
+print "ok $test - call a function in package v10::foo\n"; $test++;
+
+print "not " unless (1?v65:"bar") eq 'A';
+print "ok $test - colon detection after vstring does not break ? vstring :\n"; $test++;
+if (ord("\t") == 9) {
+    print v35;
+    print "not ";
+    print v10;
+    print "ok $test - print vstring prints the vstring\n";
+}
+else {
+    print "ok $test # skipped on EBCDIC\n";
+}
+$test++;
+
+# Test pyoq ops with comments before the first delim
+q # comment
+ "b"#
+  eq 'b' or print "not ";
+print "ok $test - q <comment> <newline> ...\n"; $test++;
+qq # comment
+ "b"#
+  eq 'b' or print "not ";
+print "ok $test - qq <comment> <newline> ...\n"; $test++;
+qw # comment
+ "b"#
+  [0] eq 'b' or print "not ";
+print "ok $test - qw <comment> <newline> ...\n"; $test++;
+"b" =~ m # comment
+ "b"#
+   or print "not ";
+print "ok $test - m <comment> <newline> ...\n"; $test++;
+qr # comment
+ "b"#
+   eq qr/b/ or print "not ";
+print "ok $test - qr <comment> <newline> ...\n"; $test++;
+$_ = "a";
+s # comment
+ [a] #
+ [b] #
+ ;
+print "not " unless $_ eq 'b';
+print "ok $test - s <comment> <newline> ...\n"; $test++;
+$_ = "a";
+tr # comment
+ [a] #
+ [b] #
+ ;
+print "not " unless $_ eq 'b';
+print "ok $test - tr <comment> <newline> ...\n"; $test++;
+$_ = "a";
+y # comment
+ [a] #
+ [b] #
+ ;
+print "not " unless $_ eq 'b';
+print "ok $test - y <comment> <newline> ...\n"; $test++;
+
+print "not " unless (time
+                     =>) eq time=>;
+print "ok $test - => quotes keywords across lines\n"; $test++;
+
+# [perl #80368]
+print "not " unless eval '"a\U="' eq "a=";
+print "ok $test - [perl #80368] qq <a\\U=>\n"; $test++;
+
+sub Function_with_side_effects { $_ = "sidekick function called" }
+print "not " unless
+    (eval '${Function_with_side_effects,\$_}' || $@)
+      eq "sidekick function called";
+print "ok $test - \${...} where {...} looks like hash\n"; $test++;
+
+@_ = map{BEGIN {$_122782 = 'tst2'}; "rhu$_"} 'barb2';
+print "not " unless "@_" eq 'rhubarb2';
+print "ok $test - map{BEGIN...\n"; $test++;
+print "not " unless $_122782 eq 'tst2';
+print "ok $test - map{BEGIN...\n"; $test++;
+${
+=pod
+blah blah blah
+=cut
+\$_ } = 42;
+print "not "unless $_ == 42;
+print "ok $test - \${ <newline> =pod\n"; $test++;
+@_ = map{
+=pod
+blah blah blah
+=cut
+$_+1 } 1;
+print "not "unless "@_" eq 2;
+print "ok $test - map{ <newline> =pod\n"; $test++;
+eval { ${...}++ };
+print "not " unless $@ =~ /^Unimplemented at /;
+print "ok $test - \${...} (literal triple-dot)\n"; $test++;
+eval { () = map{...} @_ };
+print "not " unless $@ =~ /^Unimplemented at /;
+print "ok $test - map{...} (literal triple-dot)\n"; $test++;
+print "not " unless &{sub :lvalue { "a" }} eq "a";
+print "ok $test - &{sub :lvalue...}\n"; $test++;
+print "not " unless ref +(map{sub :lvalue { "a" }} 1)[0] eq "CODE";
+print "ok $test - map{sub :lvalue...}\n"; $test++;
+
+# Used to crash [perl #123711]
+0-5x-l{0};
+
+# Used to fail an assertion [perl #123617] [perl #123955]
+eval '"$a{ 1 m// }"; //';
+eval '"@0{0s 000";eval"$"';
+
+# Pending token stack overflow [perl #123677]
+{
+ local $SIG{__WARN__}=sub{};
+ eval q|s)$0{0h());qx(@0);qx(@0);qx(@0)|;
+}
+
+# Used to crash [perl #123801]
+eval q|s##[}#e|;
+
+# Used to fail an assertion [perl #123763]
+{
+ local $SIG{__WARN__}=sub{};
+ eval q|my($_);0=split|;
+ eval q|my $_; @x = split|;
+}