Fix bogus error on Value_Size clause for variant record type
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 10 Sep 2020 15:59:11 +0000 (17:59 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 10 Sep 2020 16:00:57 +0000 (18:00 +0200)
This is a regression present on the mainline and 10 branch: the compiler
rejects a Value_Size clause on a discriminated record type with variant.

gcc/ada/ChangeLog:
* gcc-interface/decl.c (set_rm_size): Do not take into account the
Value_Size clause if it is not for the entity itself.

gcc/testsuite/ChangeLog:
* gnat.dg/specs/size_clause5.ads: New test.

gcc/ada/gcc-interface/decl.c
gcc/testsuite/gnat.dg/specs/size_clause5.ads [new file with mode: 0644]

index f85b2b5..8045fa5 100644 (file)
@@ -9083,10 +9083,12 @@ set_rm_size (Uint uint_size, tree gnu_type, Entity_Id gnat_entity)
   if (uint_size == No_Uint)
     return;
 
-  /* Only issue an error if a Value_Size clause was explicitly given.
-     Otherwise, we'd be duplicating an error on the Size clause.  */
+  /* Only issue an error if a Value_Size clause was explicitly given for the
+     entity; otherwise, we'd be duplicating an error on the Size clause.  */
   gnat_attr_node
     = Get_Attribute_Definition_Clause (gnat_entity, Attr_Value_Size);
+  if (Present (gnat_attr_node) && Entity (gnat_attr_node) != gnat_entity)
+    gnat_attr_node = Empty;
 
   /* Get the size as an INTEGER_CST.  Issue an error if a size was specified
      but cannot be represented in bitsizetype.  */
diff --git a/gcc/testsuite/gnat.dg/specs/size_clause5.ads b/gcc/testsuite/gnat.dg/specs/size_clause5.ads
new file mode 100644 (file)
index 0000000..ba45bbf
--- /dev/null
@@ -0,0 +1,16 @@
+-- { dg-do compile }
+
+package Size_Clause5 is
+
+  type Arr is array (1 .. 16) of Boolean;
+
+  type RRec (D : Boolean) is record
+    case D is
+      when True =>  I : Integer;
+      when False => A : Arr;
+    end case;
+  end record;
+  for RRec'Object_Size use 160;
+  for RRec'Value_Size use 160;
+
+end Size_Clause5;