[Ada] AI12-0307: uniform resolution rules for aggregates

gcc/ada/

	* sem_util.ads, sem_util.adb (Check_Ambiguous_Aggregate): When a
	subprogram call is found to be ambiguous, check whether
	ambiguity is caused by an aggregate actual.  and indicate that
	it should carry a type qualification.
	* sem_ch4.adb (Traverse_Hoonyms, Try_Primitive_Operation): Call
	it.
	* sem_res.adb (Report_Ambiguous_Argument): Call it.
This commit is contained in:
Ed Schonberg 2020-08-12 17:30:29 -04:00 committed by Pierre-Marie de Rodat
parent 1c583927a5
commit c448859271
4 changed files with 37 additions and 1 deletions

View File

@ -9339,6 +9339,7 @@ package body Sem_Ch4 is
Error_Msg_NE ("ambiguous call to&", N, Hom); Error_Msg_NE ("ambiguous call to&", N, Hom);
Report_Ambiguity (Matching_Op); Report_Ambiguity (Matching_Op);
Report_Ambiguity (Hom); Report_Ambiguity (Hom);
Check_Ambiguous_Aggregate (New_Call_Node);
Error := True; Error := True;
return; return;
end if; end if;
@ -9961,6 +9962,7 @@ package body Sem_Ch4 is
Error_Msg_NE ("ambiguous call to&", N, Prim_Op); Error_Msg_NE ("ambiguous call to&", N, Prim_Op);
Report_Ambiguity (Matching_Op); Report_Ambiguity (Matching_Op);
Report_Ambiguity (Prim_Op); Report_Ambiguity (Prim_Op);
Check_Ambiguous_Aggregate (Call_Node);
return True; return True;
end if; end if;
end if; end if;

View File

@ -2097,7 +2097,8 @@ package body Sem_Res is
then then
Error_Msg_NE ("ambiguous call to&", Arg, Name (Arg)); Error_Msg_NE ("ambiguous call to&", Arg, Name (Arg));
-- Could use comments on what is going on here??? -- Examine possible interpretations, and adapt the message
-- for inherited subprograms declared by a type derivation.
Get_First_Interp (Name (Arg), I, It); Get_First_Interp (Name (Arg), I, It);
while Present (It.Nam) loop while Present (It.Nam) loop
@ -2112,6 +2113,11 @@ package body Sem_Res is
Get_Next_Interp (I, It); Get_Next_Interp (I, It);
end loop; end loop;
end if; end if;
-- Additional message and hint if the ambiguity involves an Ada2020
-- container aggregate.
Check_Ambiguous_Aggregate (N);
end Report_Ambiguous_Argument; end Report_Ambiguous_Argument;
----------------------- -----------------------

View File

@ -2425,6 +2425,27 @@ package body Sem_Util is
end if; end if;
end Cannot_Raise_Constraint_Error; end Cannot_Raise_Constraint_Error;
-------------------------------
-- Check_Ambiguous_Aggregate --
-------------------------------
procedure Check_Ambiguous_Aggregate (Call : Node_Id) is
Actual : Node_Id;
begin
if Extensions_Allowed then
Actual := First_Actual (Call);
while Present (Actual) loop
if Nkind (Actual) = N_Aggregate then
Error_Msg_N
("\add type qualification to aggregate actual", Actual);
exit;
end if;
Next_Actual (Actual);
end loop;
end if;
end Check_Ambiguous_Aggregate;
----------------------------------------- -----------------------------------------
-- Check_Dynamically_Tagged_Expression -- -- Check_Dynamically_Tagged_Expression --
----------------------------------------- -----------------------------------------

View File

@ -349,6 +349,13 @@ package Sem_Util is
-- not necessarily mean that CE could be raised, but a response of True -- not necessarily mean that CE could be raised, but a response of True
-- means that for sure CE cannot be raised. -- means that for sure CE cannot be raised.
procedure Check_Ambiguous_Aggregate (Call : Node_Id);
-- Additional information on an ambiguous call in Ada_2020 when a
-- subprogram call has an actual that is an aggregate, and the
-- presence of container aggregates (or types with the correwponding
-- aspect) provides an additional interpretation. Message indicates
-- that an aggregate actual should carry a type qualification.
procedure Check_Dynamically_Tagged_Expression procedure Check_Dynamically_Tagged_Expression
(Expr : Node_Id; (Expr : Node_Id;
Typ : Entity_Id; Typ : Entity_Id;