Pragmas Assert and Assertion_Policy
Author: JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor

Ada Reference Manual — Legal Information

# 11.4.2 Pragmas Assert and Assertion_Policy

1/3
Pragma Assert is used to assert the truth of a boolean expression at a point within a sequence of declarations or statements.
1.1/3
Assert pragmas, subtype predicates (see 3.2.4), preconditions and postconditions (see 6.1.1), and type invariants (see 7.3.2) are collectively referred to as assertions; their boolean expressions are referred to as assertion expressions.
1.2/3
Pragma Assertion_Policy is used to control whether assertions are to be ignored by the implementation, checked at run time, or handled in some implementation-defined manner.

#### Syntax

2/2
The form of a pragma Assert is as follows:
3/2
pragma Assert([Check =>] boolean_ expression[, [Message =>] string_ expression]);
4/2
A pragma Assert is allowed at the place where a declarative_item or a statement is allowed.
5/2
The form of a pragma Assertion_Policy is as follows:
6/2
pragma Assertion_Policy(policy_ identifier);
6.1/3
pragma Assertion_Policy(
assertion_ aspect_mark => policy_ identifier
{, assertion_ aspect_mark => policy_ identifier});
7/3
A pragma Assertion_Policy is allowed only immediately within a declarative_part, immediately within a package_specification, or as a configuration pragma.

#### Name Resolution Rules

8/2
The expected type for the boolean_ expression of a pragma Assert is any boolean type. The expected type for the string_ expression of a pragma Assert is type String.

#### Legality Rules

9/3
The assertion_ aspect_mark of a pragma Assertion_Policy shall be one of Assert, Static_Predicate, Dynamic_Predicate, Pre, Pre'Class, Post, Post'Class, Type_Invariant, Type_Invariant'Class, or some implementation defined aspect_mark. The policy_ identifier shall be either Check, Ignore, or some implementation-defined identifier.

#### Static Semantics

10/3
A pragma Assertion_Policy determines for each assertion aspect named in the pragma_argument_associations whether assertions of the given aspect are to be enforced by a run-time check. The policy_ identifier Check requires that assertion expressions of the given aspect be checked that they evaluate to True at the points specified for the given aspect; the policy_ identifier Ignore requires that the assertion expression not be evaluated at these points, and the run-time checks not be performed. Note that for subtype predicate aspects (see 3.2.4), even when the applicable Assertion_Policy is Ignore, the predicate will still be evaluated as part of membership tests and Valid attribute_references, and if static, will still have an effect on loop iteration over the subtype, and the selection of case_statement_alternatives and variants.
10.1/3
If no assertion_ aspect_marks are specified in the pragma, the specified policy applies to all assertion aspects.
10.2/3
A pragma Assertion_Policy applies to the named assertion aspects in a specific region, and applies to all assertion expressions specified in that region. A pragma Assertion_Policy given in a declarative_part or immediately within a package_specification applies from the place of the pragma to the end of the innermost enclosing declarative region. The region for a pragma Assertion_Policy given as a configuration pragma is the declarative region for the entire compilation unit (or units) to which it applies.
10.3/3
If a pragma Assertion_Policy applies to a generic_instantiation, then the pragma Assertion_Policy applies to the entire instance.
10.4/3
If multiple Assertion_Policy pragmas apply to a given construct for a given assertion aspect, the assertion policy is determined by the one in the innermost enclosing region of a pragma Assertion_Policy specifying a policy for the assertion aspect. If no such Assertion_Policy pragma exists, the policy is implementation defined.
11/2
The following language-defined library package exists:
12/2
package Ada.Assertions is
pragma Pure(Assertions);
13/2
Assertion_Error : exception;
14/2
procedure Assert(Check : in Boolean);
procedure Assert(Check : in Boolean; Message : in String);
15/2
end Ada.Assertions;
16/3
A compilation unit containing a check for an assertion (including a pragma Assert) has a semantic dependence on the Assertions library unit.
17/3
This paragraph was deleted.

#### Dynamic Semantics

18/3
If performing checks is required by the Assert assertion policy in effect at the place of a pragma Assert, the elaboration of the pragma consists of evaluating the boolean expression, and if the result is False, evaluating the Message argument, if any, and raising the exception Assertions.Assertion_Error, with a message if the Message argument is provided.
19/2
Calling the procedure Assertions.Assert without a Message parameter is equivalent to:
20/2
if Check = False then
raise Ada.Assertions.Assertion_Error;
end if;
21/2
Calling the procedure Assertions.Assert with a Message parameter is equivalent to:
22/2
if Check = False then
raise Ada.Assertions.Assertion_Error with Message;
end if;
23/2
The procedures Assertions.Assert have these effects independently of the assertion policy in effect.

#### Bounded (Run-Time) Errors

23.1/3
It is a bounded error to invoke a potentially blocking operation (see 9.5.1) during the evaluation of an assertion expression associated with a call on, or return from, a protected operation. If the bounded error is detected, Program_Error is raised. If not detected, execution proceeds normally, but if it is invoked within a protected action, it might result in deadlock or a (nested) protected action.

#### Implementation Permissions

24/2
Assertion_Error may be declared by renaming an implementation-defined exception from another package.
25/2
Implementations may define their own assertion policies.
26/3
If the result of a function call in an assertion is not needed to determine the value of the assertion expression, an implementation is permitted to omit the function call. This permission applies even if the function has side effects.
27/3
An implementation need not allow the specification of an assertion expression if the evaluation of the expression has a side effect such that an immediate reevaluation of the expression could produce a different value. Similarly, an implementation need not allow the specification of an assertion expression that is checked as part of a call on or return from a callable entity C, if the evaluation of the expression has a side effect such that the evaluation of some other assertion expression associated with the same call of (or return from) C could produce a different value than it would if the first expression had not been evaluated.
NOTES
28/2
2 Normally, the boolean expression in a pragma Assert should not call functions that have significant side effects when the result of the expression is True, so that the particular assertion policy in effect will not affect normal operation of the program.

Ada 2005 and 2012 Editions sponsored in part by Ada-Europe