diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index ad33e2825096..d3635f86c1f8 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,21 @@ +2017-04-25 Ed Schonberg <schonberg@adacore.com> + + * sem_attr.adb: minor reformatting. + +2017-04-25 Doug Rupp <rupp@adacore.com> + + * sigtramp-vxworks-target.inc [PPC64]: Add a .localentry pseudo-op. + +2017-04-25 Ed Schonberg <schonberg@adacore.com> + + * sem_ch5.adb (Analyze_Assignment): Reset Full_Analysis flag on + the first pass over an assignment statement with target names, + to prevent the generation of subtypes (such as discriminated + record components)that may carry the target name outside of the + tree for the assignment. The subtypes will be generated when + the assignment is reanalyzed in full. + (Analyze_Target_Name): Handle properly class-wide types. + 2017-04-25 Hristian Kirtchev <kirtchev@adacore.com> * elists.ads, elists.adb (Prepend_Unique_Elmt): New routine. diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb index 21d88d7d0a35..98c057e5ef5f 100644 --- a/gcc/ada/sem_attr.adb +++ b/gcc/ada/sem_attr.adb @@ -10545,8 +10545,8 @@ package body Sem_Attr is Entity (Name (Parent (N))); begin if Convention (Subp) = Convention_Intrinsic then - Error_Msg_FE ("subprogram and its formal " - & "parameters have convention Intrinsic", + Error_Msg_FE ("?subprogram and its formal " + & "access parameters have convention Intrinsic", Parent (N), Subp); Error_Msg_N ("actual cannot be access attribute", N); diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb index 8babb8ac2518..694c45f6dc10 100644 --- a/gcc/ada/sem_ch5.adb +++ b/gcc/ada/sem_ch5.adb @@ -64,10 +64,12 @@ with Uintp; use Uintp; package body Sem_Ch5 is - Current_LHS : Node_Id := Empty; - -- Holds the left-hand side of the assignment statement being analyzed. - -- Used to determine the type of a target_name appearing on the RHS, for - -- AI12-0125 and the use of '@' as an abbreviation for the LHS. + Current_Assignment : Node_Id := Empty; + -- This variable holds the node for an assignment that contains target + -- names. The corresponding flag has been set by the parser, and when + -- set the analysis of the RHS must be done with all expansion disabled, + -- because the assignment is reanalyzed after expansion has replaced all + -- occurrences of the target name appropriately. Unblocked_Exit_Count : Nat := 0; -- This variable is used when processing if statements, case statements, @@ -98,11 +100,12 @@ package body Sem_Ch5 is -- Ghost mode. procedure Analyze_Assignment (N : Node_Id) is - Lhs : constant Node_Id := Name (N); - Rhs : constant Node_Id := Expression (N); - T1 : Entity_Id; - T2 : Entity_Id; - Decl : Node_Id; + Lhs : constant Node_Id := Name (N); + Rhs : constant Node_Id := Expression (N); + T1 : Entity_Id; + T2 : Entity_Id; + Decl : Node_Id; + Save_Full_Analysis : Boolean; procedure Diagnose_Non_Variable_Lhs (N : Node_Id); -- N is the node for the left hand side of an assignment, and it is not @@ -284,10 +287,6 @@ package body Sem_Ch5 is -- Start of processing for Analyze_Assignment begin - -- Save LHS for use in target names (AI12-125) - - Current_LHS := Lhs; - Mark_Coextensions (N, Rhs); -- Analyze the target of the assignment first in case the expression @@ -301,7 +300,12 @@ package body Sem_Ch5 is -- during analysis and expansion are properly marked as Ghost. if Has_Target_Names (N) then + Current_Assignment := N; Expander_Mode_Save_And_Set (False); + Save_Full_Analysis := Full_Analysis; + Full_Analysis := False; + else + Current_Assignment := Empty; end if; Mark_And_Set_Ghost_Assignment (N, Mode); @@ -932,7 +936,6 @@ package body Sem_Ch5 is Analyze_Dimension (N); <<Leave>> - Current_LHS := Empty; Restore_Ghost_Mode (Mode); -- If the right-hand side contains target names, expansion has been @@ -942,6 +945,7 @@ package body Sem_Ch5 is if Nkind (N) = N_Assignment_Statement and then Has_Target_Names (N) then Expander_Mode_Restore; + Full_Analysis := Save_Full_Analysis; end if; end Analyze_Assignment; @@ -3543,14 +3547,10 @@ package body Sem_Ch5 is procedure Analyze_Target_Name (N : Node_Id) is begin - if No (Current_LHS) then - Error_Msg_N ("target name can only appear within an assignment", N); - Set_Etype (N, Any_Type); + -- A target name has the type of the left-hand side of the enclosing + -- assignment. - else - Set_Has_Target_Names (Parent (Current_LHS)); - Set_Etype (N, Etype (Current_LHS)); - end if; + Set_Etype (N, Etype (Name (Current_Assignment))); end Analyze_Target_Name; ------------------------ diff --git a/gcc/ada/sigtramp-vxworks-target.inc b/gcc/ada/sigtramp-vxworks-target.inc index 8eacfd82ef2a..3db6782bdc6b 100644 --- a/gcc/ada/sigtramp-vxworks-target.inc +++ b/gcc/ada/sigtramp-vxworks-target.inc @@ -305,6 +305,7 @@ CR("") \ TCR("0:") \ TCR("addis 2,12,.TOC.-0@ha") \ TCR("addi 2,2,.TOC.-0@l") \ +TCR(".localentry __gnat_sigtramp_common,.-__gnat_sigtramp_common") \ TCR("# Allocate frame and save the non-volatile") \ TCR("# registers we're going to modify") \ TCR("mflr %r0") \