On assignments to tagged types the compiler unconditionally generates
the runtime check of the tag (even when compiling with -gnatp). After
this patch such extra runtime check is not generated.

package Test is
   type Tagged_Simple_Record is tagged
      record
         Field1 : Integer;
      end record;
   function F1 (This : Tagged_Simple_Record)
     return Tagged_Simple_Record;

   Global_SR : Tagged_Simple_Record;

   procedure Call_Dispatching_Ops
     (Class_Obj1 : Tagged_Simple_Record'Class;
      Class_Obj2 : out Tagged_Simple_Record'Class);
end Test;

package body Test is

   function F1 (This : Tagged_Simple_Record)
     return Tagged_Simple_Record is
   begin
      return This;
   end F1;

   procedure Call_Dispatching_Ops
     (Class_Obj1 : Tagged_Simple_Record'Class;
      Class_Obj2 : out Tagged_Simple_Record'Class) is
   begin
      Class_Obj2 := F1 (Class_Obj1);
   end Call_Dispatching_Ops;

end Test;

Command:
  gcc -c -gnatp -gnatD test.adb
  grep -i "tag check" test.adb.dg

Output:
  none

Tested on x86_64-pc-linux-gnu, committed on trunk

2013-02-06  Javier Miranda  <mira...@adacore.com>

        * exp_ch5.adb (Expand_N_Assignment_Statement): Do not generate the
        runtime check on assignment to tagged types if compiling with checks
        suppressed.

Index: exp_ch5.adb
===================================================================
--- exp_ch5.adb (revision 195792)
+++ exp_ch5.adb (working copy)
@@ -2476,7 +2476,8 @@
                   --  the assignment we generate run-time check to ensure that
                   --  the tags of source and target match.
 
-                  if Is_Class_Wide_Type (Typ)
+                  if not Tag_Checks_Suppressed (Typ)
+                    and then Is_Class_Wide_Type (Typ)
                     and then Is_Tagged_Type (Typ)
                     and then Is_Tagged_Type (Underlying_Type (Etype (Rhs)))
                   then

Reply via email to