This change adds a missing guard to the SCO generation circuitry that caused
bogus extra SCOs to be generated for loop statements in separate bodies.

The following compilation must produce the indicated SCOs:

$ gcc -c -fdump-scos pak.adb
$ grep "^C" pak.ali
C 3 pak-p.adb
CS F3:8-3:18
CS >S3:8 4:7-4:7

package body Pak is
    procedure P is separate;
end Pak;
package Pak is
   procedure P;
end Pak;
separate (Pak) procedure P is
begin
   for J in 0 .. 0 loop
      null;
   end loop;
end P;

2013-07-05  Thomas Quinot  <qui...@adacore.com>

        * par_sco.adb (Traverse_Declarations_Or_Statements): Ignore
        N_Implicit_Label_Declaration nodes.

Index: par_sco.adb
===================================================================
--- par_sco.adb (revision 200688)
+++ par_sco.adb (working copy)
@@ -2095,7 +2095,13 @@
       if Is_Non_Empty_List (L) then
          N := First (L);
          while Present (N) loop
-            Traverse_One (N);
+
+            --  Note: For separate bodies, we see the tree after Par.Labl has
+            --  introduced implicit labels, so we need to ignore those nodes.
+
+            if Nkind (N) /= N_Implicit_Label_Declaration then
+               Traverse_One (N);
+            end if;
             Next (N);
          end loop;
 

Reply via email to