Make side effect on strongly pure function call

This commit is contained in:
k-hara 2014-06-14 22:58:03 +09:00
parent a38148f38e
commit 5b39ab253c
4 changed files with 22 additions and 27 deletions

View file

@ -2985,9 +2985,9 @@ unittest
//static assert(!is(typeof(Appender!string(cc))));
//This should always work:
appender!string(null);
appender!(const(char)[])(null);
appender!(char[])(null);
{auto app = appender!string(null);}
{auto app = appender!(const(char)[])(null);}
{auto app = appender!(char[])(null);}
}
unittest //Test large allocations (for GC.extend)

View file

@ -2052,7 +2052,7 @@ unittest
test([ 1, 2, 3, 4, 5, 6 ], [ 6, 5, 4, 3, 2, 1 ]);
immutable foo = [1,2,3].idup;
retro(foo);
auto r = retro(foo);
}
unittest
@ -9210,12 +9210,7 @@ assert(buffer2 == [11, 12, 13, 14, 15]);
}
else
{
private static void _testSave(R)(R* range)
{
(*range).save;
}
static if(isSafe!(_testSave!R))
static if(isSafe!((R* r) => (*r).save))
{
@property auto save() @trusted
{

View file

@ -507,10 +507,10 @@ uint stride(S)(auto ref S str)
foreach (S; TypeTuple!(wchar[], const wchar[], wstring))
{
enum str = to!S("hello world");
static assert(isSafe!({ stride(str, 0); }));
static assert(isSafe!({ stride(str); }));
static assert((functionAttributes!({ stride(str, 0); }) & FunctionAttribute.pure_) != 0);
static assert((functionAttributes!({ stride(str); }) & FunctionAttribute.pure_) != 0);
static assert(isSafe!(() => stride(str, 0)));
static assert(isSafe!(() => stride(str) ));
static assert((functionAttributes!(() => stride(str, 0)) & FunctionAttribute.pure_) != 0);
static assert((functionAttributes!(() => stride(str) ) & FunctionAttribute.pure_) != 0);
}
});
}
@ -623,10 +623,10 @@ unittest
foreach (S; TypeTuple!(wchar[], const wchar[], wstring))
{
enum str = to!S("hello world");
static assert(isSafe!({ strideBack(str, 0); }));
static assert(isSafe!({ strideBack(str); }));
static assert((functionAttributes!({ strideBack(str, 0); }) & FunctionAttribute.pure_) != 0);
static assert((functionAttributes!({ strideBack(str); }) & FunctionAttribute.pure_) != 0);
static assert(isSafe!(() => strideBack(str, 0)));
static assert(isSafe!(() => strideBack(str) ));
static assert((functionAttributes!(() => strideBack(str, 0)) & FunctionAttribute.pure_) != 0);
static assert((functionAttributes!(() => strideBack(str) ) & FunctionAttribute.pure_) != 0);
}
});
}
@ -710,10 +710,10 @@ unittest
foreach (S; TypeTuple!(dchar[], const dchar[], dstring))
{
enum str = to!S("hello world");
static assert(isSafe!({ stride(str, 0); }));
static assert(isSafe!({ stride(str); }));
static assert((functionAttributes!({ stride(str, 0); }) & FunctionAttribute.pure_) != 0);
static assert((functionAttributes!({ stride(str); }) & FunctionAttribute.pure_) != 0);
static assert(isSafe!(() => stride(str, 0)));
static assert(isSafe!(() => stride(str) ));
static assert((functionAttributes!(() => stride(str, 0)) & FunctionAttribute.pure_) != 0);
static assert((functionAttributes!(() => stride(str) ) & FunctionAttribute.pure_) != 0);
}
});
}
@ -807,10 +807,10 @@ unittest
foreach (S; TypeTuple!(dchar[], const dchar[], dstring))
{
enum str = to!S("hello world");
static assert(isSafe!({ strideBack(str, 0); }));
static assert(isSafe!({ strideBack(str); }));
static assert((functionAttributes!({ strideBack(str, 0); }) & FunctionAttribute.pure_) != 0);
static assert((functionAttributes!({ strideBack(str); }) & FunctionAttribute.pure_) != 0);
static assert(isSafe!(() => strideBack(str, 0)));
static assert(isSafe!(() => strideBack(str) ));
static assert((functionAttributes!(() => strideBack(str, 0)) & FunctionAttribute.pure_) != 0);
static assert((functionAttributes!(() => strideBack(str) ) & FunctionAttribute.pure_) != 0);
}
});
}

View file

@ -64,7 +64,7 @@ int main(char[][] args)
{
// Bring in unit test for module by referencing function in it
cmp("foo", "bar"); // string
cast(void)cmp("foo", "bar"); // string
cast(void)filenameCharCmp('a', 'b'); // path
cast(void)isNaN(1.0); // math
std.conv.to!double("1.0"); // std.conv