import std.traits : isSomeFunction;
bool isStronglyPure(F...)()
if (F.length == 1 && isSomeFunction!F)
import std.traits : arity, isDelegate, isAssociativeArray, isPointer,
hasAliasing, Parameters, ParameterStorageClassTuple, ParameterStorageClass,
FunctionAttribute, functionAttributes;
static if (!(functionAttributes!F & FunctionAttribute.pure_))
static foreach (i; 0 .. length) {
if (is(Parameters!F[i] == immutable)
|| is(Parameters!F[i] == const))
else if (is(Parameters!F[i] == class)
|| isDelegate!(Parameters!F[i])
|| isAssociativeArray!(Parameters!F[i])
|| isPointer!(Parameters!F[i])
|| hasAliasing!(Parameters!F[i])
|| ParameterStorageClassTuple!F[i] == ParameterStorageClass.out_
|| ParameterStorageClassTuple!F[i] == ParameterStorageClass.ref_)
void j(immutable ref S s) pure
int k(int function() pure f) pure
static assert ( isStronglyPure!f);
static assert (!isStronglyPure!g);
static assert (!isStronglyPure!h);
static assert (!isStronglyPure!(C.i));
static assert (!isStronglyPure!i);
static assert ( isStronglyPure!j);
static assert (!isStronglyPure!k);
static assert ( isStronglyPure!l);