From: Gary Dismukes Date: Fri, 22 Aug 2008 14:56:32 +0000 (+0200) Subject: sem_util.adb (Has_Preelaborable_Initialization): Revise checking of private types... X-Git-Tag: releases/gcc-4.4.0~2933 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9f4e488138d23660082c4ecd744dd0ae7a5db028;p=thirdparty%2Fgcc.git sem_util.adb (Has_Preelaborable_Initialization): Revise checking of private types to allow for types derived from a private type... 2008-08-22 Gary Dismukes * sem_util.adb (Has_Preelaborable_Initialization): Revise checking of private types to allow for types derived from a private type with preelaborable initialization, but return False for a private extension (unless it has the pragma). From-SVN: r139480 --- diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 7d8865c98883..83c3f4b21f23 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -4616,14 +4616,6 @@ package body Sem_Util is return Has_Preelaborable_Initialization (Base_Type (E)); end if; - -- Other private types never have preelaborable initialization - - if Is_Private_Type (E) then - return False; - end if; - - -- Here for all non-private view - -- All elementary types have preelaborable initialization if Is_Elementary_Type (E) then @@ -4643,6 +4635,13 @@ package body Sem_Util is elsif Is_Derived_Type (E) then + -- If the derived type is a private extension then it doesn't have + -- preelaborable initialization. + + if Ekind (Base_Type (E)) = E_Record_Type_With_Private then + return False; + end if; + -- First check whether ancestor type has preelaborable initialization Has_PE := Has_Preelaborable_Initialization (Etype (Base_Type (E))); @@ -4663,6 +4662,13 @@ package body Sem_Util is Has_PE := False; end if; + -- Private types not derived from a type having preelaborable init and + -- that are not marked with pragma Preelaborable_Initialization do not + -- have preelaborable initialization. + + elsif Is_Private_Type (E) then + return False; + -- Record type has PI if it is non private and all components have PI elsif Is_Record_Type (E) then