https://gcc.gnu.org/g:d0a072e1f8b46eccf8fcc014e25cd47f17b86496

commit r15-4642-gd0a072e1f8b46eccf8fcc014e25cd47f17b86496
Author: Javier Miranda <mira...@adacore.com>
Date:   Thu Sep 26 09:18:48 2024 +0000

    ada: Spurious error when compiling in Syntax and Semantics Only mode
    
    Compiling under switch -gnatc, the frontend reports spurious errors
    accessing components of class-wide tagged types.
    
    gcc/ada/ChangeLog:
    
            * sem_ch3.adb (Record_Type_Definition): For tagged types, add
            the missing decoration to the First_Entity in the corresponding
            class-wide type entity.

Diff:
---
 gcc/ada/sem_ch3.adb | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb
index ea0a97bd39fc..00d5fe256d97 100644
--- a/gcc/ada/sem_ch3.adb
+++ b/gcc/ada/sem_ch3.adb
@@ -23074,6 +23074,23 @@ package body Sem_Ch3 is
          if Present (Variant_Part (Component_List (Def))) then
             Analyze (Variant_Part (Component_List (Def)));
          end if;
+
+         --  For tagged types, when compiling in Generate_Code mode, the _Tag
+         --  component is added before the creation of the class-wide entity
+         --  and it is shared by that entity once it is built.
+
+         --  However, when compiling in Check_Syntax or Check_Semantics modes,
+         --  since the _Tag component is not added to the tagged type entity,
+         --  the First_Entity of its class-wide type remains empty, and must
+         --  be explicitly set to prevent spurious errors from being reported.
+
+         if Operating_Mode <= Check_Semantics
+           and then Is_Tagged_Type (T)
+           and then Present (First_Entity (T))
+           and then No (First_Entity (Class_Wide_Type (T)))
+         then
+            Set_First_Entity (Class_Wide_Type (T), First_Entity (T));
+         end if;
       end if;
 
       --  After completing the semantic analysis of the record definition,

Reply via email to