[Ada] Tidy up implementation of Has_Compatible_Type

Pierre-Marie de Rodat derodat@adacore.com
Tue Nov 9 09:46:26 GMT 2021


Has_Compatible_Type is essentially a wrapper around Covers in Sem_Type that
handles overloading and a few other details, i.e. calling:

  Has_Compatible_Type (N, Typ)

is morally equivalent to calling:

  Covers (Typ, Etype (N)) or Covers (Typ, Interp (N))

Except that the implementation also performs the reversed tests when Typ is
neither a tagged nor an anonymous access type and this is questionable.

This change removes the reversed tests in the general case and add them back
only in the few cases where they are still needed for now.  This reduces the
total number of calls to Covers by 50%.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* sem_ch4.adb (Analyze_Membership_Op) <Find_Interpretation>: Handle
	both overloaded and non-overloaded cases.
	<Try_One_Interp>: Do a reversed call to Covers if the outcome of the
	call to Has_Compatible_Type is false.
	Simplify implementation after change to Find_Interpretation.
	(Analyze_User_Defined_Binary_Op): Be prepared for previous errors.
	(Find_Comparison_Types) <Try_One_Interp>: Do a reversed call to
	Covers if the outcome of the call to Has_Compatible_Type is false.
	(Find_Equality_Types) <Try_One_Interp>: Likewise.
	* sem_type.adb (Has_Compatible_Type): Remove the reversed calls to
	Covers.  Add explicit return on all paths.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.diff
Type: text/x-diff
Size: 7981 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20211109/9b3b0f86/attachment-0001.bin>


More information about the Gcc-patches mailing list