VHDL: Declaring an empty array (in a test bench)
You don't need to declare int_set, use integer_vector instead.
You can use 'length to test for an empty array.

An empty array is called a null array, because it has a null range. A null range and thus a null array can be constructed by using e.g. 0 downto 1. Alternatively, an ascending direction can be used (1 to 0) can be used.


  5.2.1 General
  [...]
  A range specifies a subset of values of a scalar type. A range is said to be a null range if the specified subset is empty.
  
  The range L to R is called an ascending range; if L > R, then the range is a null range. The range L downto R is called a descending range; if L &lt; R, then the range is a null range. L is called the left bound of the range, and R is called the right bound of the range. The lower bound of a range is the left bound if the range is ascending or the right bound if the range is descending. The upper bound of a range is the right bound if the range is ascending or the left bound if the range is descending. The value V is said to belong to the range if the relations (lower bound &lt;= V) and (V &lt;= upper bound) are both true. The operators >, &lt;, and &lt;= in the preceding definitions are the predefined operators of the applicable scalar type.
  [...]
  
  5.3.2.2 Index constraints and discrete ranges
  [...]
  An array constraint of the first form is compatible with the type if, and only if, the constraint defined by each discrete range is compatible with the corresponding index subtype and the array element constraint, if present, is compatible with the element subtype of the type. If any of the discrete ranges defines a null range, any array thus constrained is a null array, having no elements. An array value satisfies an index constraint if at each index position the array value and the index constraint have the same index range. (Note, however, that assignment and certain other operations on arrays involve an implicit subtype conversion.)
  [...]
  
  8.5 Slice names
  [...]
  The bounds of the discrete range define those of the slice and shall be of the type of the index of the array. The slice is a null slice if the discrete range is a null range. It is an error if the direction of the discrete range is not the same as that of the index range of the array denoted by the prefix of the slice name.  
  
  For the evaluation of a name that is a slice, the prefix and the discrete range are evaluated. It is an error if either of the bounds of the discrete range does not belong to the index range of the prefixing array, unless the
  slice is a null slice. (The bounds of a null slice need not belong to the subtype of the index.)
  [...]


Such a null array can be initialized/assigned with (others =&gt; ...).

Example for your integer vector:

constant Empty : integer_vector(0 downto 1) := (others =&gt; 0);




Btw: VHDL already defines a function 'maximum' that calculates the biggest integer in an array.