Przeglądaj źródła

* decrease macro nesting counter early when expanding empty macro
to avoid errors about too depth macro nesting, resolves #38802

git-svn-id: trunk@49265 -

florian 4 lat temu
rodzic
commit
77cc2f4ced
3 zmienionych plików z 39 dodań i 5 usunięć
  1. 1 0
      .gitattributes
  2. 14 5
      compiler/scanner.pas
  3. 24 0
      tests/webtbs/tw38802.pp

+ 1 - 0
.gitattributes

@@ -18832,6 +18832,7 @@ tests/webtbs/tw38703.pp svneol=native#text/pascal
 tests/webtbs/tw38718.pp svneol=native#text/pascal
 tests/webtbs/tw38733.pp svneol=native#text/pascal
 tests/webtbs/tw38766.pp svneol=native#text/plain
+tests/webtbs/tw38802.pp svneol=native#text/pascal
 tests/webtbs/tw3893.pp svneol=native#text/plain
 tests/webtbs/tw3898.pp svneol=native#text/plain
 tests/webtbs/tw3899.pp svneol=native#text/plain

+ 14 - 5
compiler/scanner.pas

@@ -4883,12 +4883,21 @@ type
                        inc(yylexcount);
                        substitutemacro(pattern,mac.buftext,mac.buflen,
                          mac.fileinfo.line,mac.fileinfo.fileindex);
-                     { handle empty macros }
+                       { handle empty macros }
                        if c=#0 then
-                         reload;
-                       readtoken(false);
-                       { that's all folks }
-                       dec(yylexcount);
+                         begin
+                           reload;
+                           { avoid macro nesting error in case of
+                             a sequence of empty macros, see #38802 }
+                           dec(yylexcount);
+                           readtoken(false);
+                         end
+                       else
+                         begin
+                           readtoken(false);
+                           { that's all folks }
+                           dec(yylexcount);
+                         end;
                        exit;
                      end
                     else

+ 24 - 0
tests/webtbs/tw38802.pp

@@ -0,0 +1,24 @@
+{$mode objfpc} {$h+} {$macro on}
+
+begin
+	// Warning: Expanding of macros exceeds a depth of 16.
+	// If macros contain any source code (barring comments and directives) — even 'begin end;', this will compile.
+	{$define do_A :=}
+	{$define do_B :=}
+	{$define do_C :=}
+	{$define do_D :=}
+	{$define do_E :=}
+	{$define do_F :=}
+	{$define do_G :=}
+	{$define do_H :=}
+	{$define do_I :=}
+	{$define do_J :=}
+	{$define do_K :=}
+	{$define do_L :=}
+	{$define do_M :=}
+	{$define do_N :=}
+	{$define do_O :=}
+	{$define do_P :=}
+	{$define do_Q :=}
+	do_A do_B do_C do_D do_E do_F do_G do_H do_I do_J do_K do_L do_M do_N do_O do_P do_Q
+end.