An initialization expression must evaluate at compile time to a constant. It is used to specify an initial value for an entity. In an initialization expression, each operation is intrinsic and each operand is one of the following: o A constant or subobject of a constant o An array constructor where each element, and the bounds and strides of each implied-do are expressions whose primaries are initialization expressions o A structure constructor whose components are initialization expressions o An elemental intrinsic function reference of type integer or character, whose arguments are initialization expressions of type integer or character o A reference to one of the following inquiry functions: BIT_SIZE MINEXPONENT DIGITS PRECISION EPSILON RADIX HUGE RANGE ILEN SHAPE KIND SIZE LBOUND TINY LEN UBOUND MAXEXPONENT Each function argument must be one of the following: - An initialization expression - A variable whose kind type parameter and bounds are not assumed or defined by an ALLOCATE statement, pointer assignment, or an expression that is not an initialization expression o A reference to one of the following transformational functions (each argument must be an initialization expression): REPEAT RESHAPE SELECTED_INT_KIND SELECTED_REAL_KIND TRANSFER TRIM o A reference to the transformational function NULL o An implied-do variable within an array constructor where the bounds and strides of the corresponding implied-do are initialization expressions o Another initialization expression enclosed in parentheses Each subscript, section subscript, and substring starting and ending point must be an initialization expression. In an initialization expression, the exponential operator (**) must have a power of type integer. If an initialization expression invokes an inquiry function for a type parameter or an array bound of an object, the type parameter or array bound must be specified in a prior specification statement (or to the left of the inquiry function in the same statement).