aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/sem_attr.adb
diff options
context:
space:
mode:
authorSteve Baird <baird@adacore.com>2024-02-15 14:49:18 -0800
committerMarc Poulhiès <poulhies@adacore.com>2024-05-16 10:49:27 +0200
commit91c6302c8d641990f8977bf8eb5a40370da6efa9 (patch)
tree2f127790f7b3f35cdd16d757b7d71401bb1965f4 /gcc/ada/sem_attr.adb
parente730d52a9459d1112e888858c7286aab0e358fac (diff)
downloadgcc-91c6302c8d641990f8977bf8eb5a40370da6efa9.zip
gcc-91c6302c8d641990f8977bf8eb5a40370da6efa9.tar.gz
gcc-91c6302c8d641990f8977bf8eb5a40370da6efa9.tar.bz2
ada: Formal_Derived_Type'Size is not static
In deciding whether a Size attribute reference is static, the compiler could get confused about whether an implicitly-declared subtype of a generic formal type is itself a generic formal type, possibly resulting in an assertion failure and then a bugbox. gcc/ada/ * sem_attr.adb (Eval_Attribute): Expand existing checks for generic formal types for which Is_Generic_Type returns False. In that case, mark the attribute reference as nonstatic.
Diffstat (limited to 'gcc/ada/sem_attr.adb')
-rw-r--r--gcc/ada/sem_attr.adb10
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb
index 65442d4..2fa7d7d 100644
--- a/gcc/ada/sem_attr.adb
+++ b/gcc/ada/sem_attr.adb
@@ -8685,10 +8685,20 @@ package body Sem_Attr is
-- If the root type or base type is generic, then we cannot fold. This
-- test is needed because subtypes of generic types are not always
-- marked as being generic themselves (which seems odd???)
+ --
+ -- Should this situation be addressed instead by either
+ -- a) setting Is_Generic_Type in more cases
+ -- or b) replacing preceding calls to Is_Generic_Type with calls to
+ -- Sem_Util.Some_New_Function
+ -- so that we wouldn't have to deal with these cases here ???
if Is_Generic_Type (P_Root_Type)
or else Is_Generic_Type (P_Base_Type)
+ or else (Present (Associated_Node_For_Itype (P_Base_Type))
+ and then Is_Generic_Type (Defining_Identifier
+ (Associated_Node_For_Itype (P_Base_Type))))
then
+ Set_Is_Static_Expression (N, False);
return;
end if;