[Ada] Improve integration of strub with type systems

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

This patch brings various improvements to the integration of strub
modes into the Ada type system.  Strub modes for subprograms are
promoted to subprogram types when applied to access-to-subprogram
objects and types, and promoted from subprograms to access types'
designated types.  Matching strub modes are required for renaming,
overriding, interface implementation, and compatible strub modes are
required for conversions.

A complementary patch for the GCC interface introduces matching build
system changes, and warnings when strub modes are applied to composite
data objects or their types, and another complementary patch for GCC
does the same for C-family languages.

The GCC patch also fixes a strub callability error affecting
type-converted direct calls, and several tests to exercise the
newly-added features, and reverts strub annotations from public
subprograms, that would have caused their renamings to be rejected.

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


	* strub.adb, strub.ads: New files.
	* exp_attr.adb (Access_Cases): Copy strub mode to subprogram type.
	* exp_disp.adb (Expand_Dispatching_Call): Likewise.
	* freeze.adb (Check_Inherited_Conditions): Check that strub modes
	match overridden subprograms and interfaces.
	(Freeze_All): Renaming declarations too.
	* sem_attr.adb (Resolve_Attribute): Reject 'Access to
	strub-annotated data object.
	* sem_ch3.adb (Derive_Subprogram): Copy strub mode to
	inherited subprogram.
	* sem_prag.adb (Analyze_Pragma): Propagate Strub Machine_Attribute
	from access-to-subprogram to subprogram type when required,
	but not from access-to-data to data type.  Mark the entity that
	got the pragma as having a gigi rep item.
	* sem_res.adb (Resolve): Reject implicit conversions that
	would change strub modes.
	(Resolve_Type_Conversions): Reject checked conversions
	between incompatible strub modes.
	* doc/gnat_rm/security_hardening_features.rst: Update.
	* gnat_rm.texi: Regenerate.
	* libgnat/a-except.ads (Raise_Exception): Revert strub-callable
	annotation in public subprogram.
	* libgnat/s-arit128.ads (Multiply_With_Ovflo_Check128): Likewise.
	* libgnat/s-arit64.ads (Multiply_With_Ovflo_Check64): Likewise.
	* libgnat/s-secsta.ads (SS_Allocate): Likewise.
	(SS_Mark, SS_Release): Likewise.
	* gcc-interface/Make-lang.in (GNAT_ADA_OBJS): Add ada/strub.o.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.diff.gz
Type: application/gzip
Size: 13339 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc-patches/attachments/20211109/f54e9337/attachment-0001.gz>

More information about the Gcc-patches mailing list