This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #114040] Allow pod in quoted constructs
authorFather Chrysostomos <sprout@cpan.org>
Fri, 17 Aug 2012 21:45:29 +0000 (14:45 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 17 Aug 2012 23:45:22 +0000 (16:45 -0700)
When the case = in toke.c:yylex is reached and PL_lex_state is
not LEX_NORMAL, that means we are in some sort of quoted construct,
and the entire construct’s content is in the current line buffer
(which, consequently contains more than one line).  So we need to check
that when encountering pod.  Quoted constructs need to be treated the
same way as string eval, which also puts all the code in the line
buffer.

t/comp/parser.t
toke.c

index d22e9b3..09f2d1c 100644 (file)
@@ -3,7 +3,7 @@
 # Checks if the parser behaves correctly in edge cases
 # (including weird syntax errors)
 
-print "1..139\n";
+print "1..140\n";
 
 sub failed {
     my ($got, $expected, $name) = @_;
@@ -397,6 +397,25 @@ $_
 write
 }).*/;
 
+eval '
+"${;
+
+=pod
+
+=cut
+
+}";
+';
+is $@, "", 'pod inside string in string eval';
+"${;
+
+=pod
+
+=cut
+
+}";
+print "ok ", ++$test, " - pod inside string outside of string eval\n";
+
 sub 'Hello'_he_said (_);
 is prototype "Hello::_he_said", '_', 'initial tick in sub declaration';
 
diff --git a/toke.c b/toke.c
index aecd7f1..d0c9087 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -6001,7 +6001,8 @@ Perl_yylex(pTHX)
            if (PL_expect == XSTATE && isALPHA(tmp) &&
                (s == PL_linestart+1 || s[-2] == '\n') )
                {
-                   if (PL_in_eval && !PL_rsfp && !PL_parser->filtered) {
+                   if ((PL_in_eval && !PL_rsfp && !PL_parser->filtered)
+                       || PL_lex_state != LEX_NORMAL) {
                        d = PL_bufend;
                        while (s < d) {
                            if (*s++ == '\n') {