diff options
-rw-r--r-- | gcc/ada/ChangeLog | 19 | ||||
-rw-r--r-- | gcc/ada/exp_ch4.adb | 9 | ||||
-rw-r--r-- | gcc/ada/exp_ch8.adb | 8 | ||||
-rw-r--r-- | gcc/ada/sem_ch13.adb | 5 |
4 files changed, 34 insertions, 7 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index b8f882d..5f29776 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,22 @@ +2013-04-24 Ed Schonberg <schonberg@adacore.com> + + * exp_ch8.adb (Expand_N_Subprogram_Renaming_Declaration): If this + is a renaming of predefined equality for an untagged record, + add generated body to the freeze actions for the subprogram, to + prevent freezing issues when the record has incomplete components. + * exp_ch4.adb (Expand_Composite_Equality): If the type is a type + without completion, return a predefined comparison instead of + just False. This may happen when building the expression for + record equality, when some component has a type whose completion + has not been seen yet. The operation will be analyzed an expanded + after the type has been frozen, at which point all component + types will have been completed, or an error reported. + +2013-04-24 Ed Schonberg <schonberg@adacore.com> + + * sem_ch13.adb (Analyze_Aspect_Specifications): Do not delay + analysis of a Convention aspect. + 2013-04-24 Eric Botcazou <ebotcazou@adacore.com> * fe.h (Machine_Overflows_On_Target): New macro and declaration. diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 76bf939..e463f38 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -2568,11 +2568,14 @@ package body Exp_Ch4 is Full_Type := Typ; end if; - -- Defense against malformed private types with no completion the error - -- will be diagnosed later by check_completion + -- If the private type has no completion the context may be the + -- expansion of a composite equality for a composite type with some + -- still incomplete components. The expression will not be analyzed + -- until the enclosing type is completed, at which point this will be + -- properly expanded, unless there is a bona fide completion error. if No (Full_Type) then - return New_Reference_To (Standard_False, Loc); + return Make_Op_Eq (Loc, Left_Opnd => Lhs, Right_Opnd => Rhs); end if; Full_Type := Base_Type (Full_Type); diff --git a/gcc/ada/exp_ch8.adb b/gcc/ada/exp_ch8.adb index 3b5c7d3..97bfac4 100644 --- a/gcc/ada/exp_ch8.adb +++ b/gcc/ada/exp_ch8.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2012, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2013, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -328,8 +328,8 @@ package body Exp_Ch8 is -- meaning. It may be redefined later, but the renaming is -- elaborated where it occurs. This is technically known as -- Squirreling semantics. Renaming is rewritten as a subprogram - -- declaration, and the body is inserted at the end of the - -- current declaration list to prevent premature freezing. + -- declaration, and the generated body is inserted into the + -- freeze actions for the subprogram. Decl := Build_Body_For_Renaming; @@ -345,7 +345,7 @@ package body Exp_Ch8 is Rhs => Make_Identifier (Loc, Chars (Right)), Bodies => Declarations (Decl)))))); - Append (Decl, List_Containing (N)); + Append_Freeze_Action (Id, Decl); end if; end; end if; diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 40749ad..31f5ab8 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -1487,6 +1487,11 @@ package body Sem_Ch13 is Make_Aitem_Pragma (Pragma_Argument_Associations => Arg_List, Pragma_Name => P_Name); + + -- Convention is a static name, and must be associated + -- with the entity at once. + + Delay_Required := False; end; -- CPU, Interrupt_Priority, Priority |