[COMMITTED,48/51] ada: Skip layout derivation for C-compatible unchecked union types

Message ID 20260602084541.3829876-48-poulhies@adacore.com
State Committed
Headers
Series [COMMITTED,01/51] ada: Rename Private_Component function |

Commit Message

Marc Poulhiès June 2, 2026, 8:45 a.m. UTC
  From: Eric Botcazou <ebotcazou@adacore.com>

The machinery that computes the layout of derived types does not support
C-compatible unchecked union types, but their layout is fixed in any case.

gcc/ada/ChangeLog:

	* gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Record_Type>: Do not
	derive the layout of C-compatible unchecked union types.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/gcc-interface/decl.cc | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
  

Patch

diff --git a/gcc/ada/gcc-interface/decl.cc b/gcc/ada/gcc-interface/decl.cc
index 9b64544a2f2..cf6c37f1ca2 100644
--- a/gcc/ada/gcc-interface/decl.cc
+++ b/gcc/ada/gcc-interface/decl.cc
@@ -3551,8 +3551,11 @@  gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
 	      }
 
 	/* If this is a derived type with discriminants and these discriminants
-	   affect the initial shape it has inherited, factor them in.  */
-	if (has_discr
+	   affect the initial shape it has inherited, factor them in, but this
+	   is not needed for a C-compatible Unchecked_Union since the variants
+	   are at offset 0 in there.  */
+	if (TREE_CODE (gnu_type) == RECORD_TYPE
+	    && has_discr
 	    && !is_extension
 	    && !Has_Record_Rep_Clause (gnat_entity)
 	    && Stored_Constraint (gnat_entity) != No_Elist