diff options
author | Ed Schonberg <schonberg@adacore.com> | 2018-07-31 09:56:21 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2018-07-31 09:56:21 +0000 |
commit | 6cdce5064b7e2c30beec8a99f1b19869f14398a7 (patch) | |
tree | a9c4a33556cefd3b66bc8a316f84ce245d638003 /gcc/ada | |
parent | c992e2e4bd68729e7849c5649a9492263aedc063 (diff) | |
download | gcc-6cdce5064b7e2c30beec8a99f1b19869f14398a7.zip gcc-6cdce5064b7e2c30beec8a99f1b19869f14398a7.tar.gz gcc-6cdce5064b7e2c30beec8a99f1b19869f14398a7.tar.bz2 |
[Ada] Spurious error on default parameter in protected operation
This patch fixes a spurious compiler error on a call to a protected
operation whose profile includes a defaulted in-parameter that is a call
to another protected function of the same object.
2018-07-31 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* exp_ch6.adb (Expand_Protected_Subprogram_Call): Handle
properly a protected call that includes a default parameter that
is a call to a protected function of the same type.
gcc/testsuite/
* gnat.dg/prot5.adb, gnat.dg/prot5_pkg.adb,
gnat.dg/prot5_pkg.ads: New testcase.
From-SVN: r263101
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/exp_ch6.adb | 24 |
2 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index ccb8aa4..e54c9e0 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2018-07-31 Ed Schonberg <schonberg@adacore.com> + + * exp_ch6.adb (Expand_Protected_Subprogram_Call): Handle + properly a protected call that includes a default parameter that + is a call to a protected function of the same type. + 2018-07-31 Justin Squirek <squirek@adacore.com> * lib-writ.adb (Write_With_Lines): Modfiy the generation of diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb index f71cdab..224f4c7 100644 --- a/gcc/ada/exp_ch6.adb +++ b/gcc/ada/exp_ch6.adb @@ -6387,6 +6387,30 @@ package body Exp_Ch6 is then Rec := New_Occurrence_Of (First_Entity (Current_Scope), Sloc (N)); + -- A default parameter of a protected operation may be a call to + -- a protected function of the type. This appears as an internal + -- call in the profile of the operation, but if the context is an + -- external call we must convert the call into an external one, + -- using the protected object that is the target, so that: + + -- Prot.P (F) + -- is transformed into + -- Prot.P (Prot.F) + + elsif Nkind (Parent (N)) = N_Procedure_Call_Statement + and then Nkind (Name (Parent (N))) = N_Selected_Component + and then Is_Protected_Type (Etype (Prefix (Name (Parent (N))))) + and then Is_Entity_Name (Name (N)) + and then Scope (Entity (Name (N))) = + Etype (Prefix (Name (Parent (N)))) + then + Rewrite (Name (N), + Make_Selected_Component (Sloc (N), + Prefix => New_Copy_Tree (Prefix (Name (Parent (N)))), + Selector_Name => Relocate_Node (Name (N)))); + Analyze_And_Resolve (N); + return; + else -- If the context is the initialization procedure for a protected -- type, the call is legal because the called entity must be a |