[Issue 5191] New: Combination of pure and nothrow result in a function that does nothing
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Tue Nov 9 02:32:27 PST 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5191
Summary: Combination of pure and nothrow result in a function
that does nothing
Product: D
Version: unspecified
Platform: Other
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: jmdavisProg at gmx.com
--- Comment #0 from Jonathan M Davis <jmdavisProg at gmx.com> 2010-11-09 02:31:20 PST ---
import std.stdio;
struct Foo
{
void add(T)(T value) pure nothrow
{
this.value += value;
}
this(int value)
{
this.value = value;
}
int value;
}
void main()
{
auto foo = Foo(5);
assert(foo.value == 5);
foo.add(2);
writeln(foo.value);
assert(foo.value == 7);
foo.add(3);
writeln(foo.value);
assert(foo.value == 10);
foo.add(3);
writeln(foo.value);
assert(foo.value == 13);
}
If you remove either the pure _or_ the nothrow (or both) from add(), you get
this output:
7
10
13
However, if add() is both pure and nothrow, then you get an assertion failure:
5
core.exception.AssertError at test(25): Assertion failure
----------------
./test(onAssertError+0x2e) [0x808d40e]
./test(_d_assertm+0x16) [0x8085536]
./test(void test.__assert(int)) [0x80828d6]
./test(_Dmain+0x43) [0x807f7a7]
./test(extern (C) int rt.dmain2.main(int, char**)) [0x8085746]
./test(extern (C) int rt.dmain2.main(int, char**)) [0x80856a0]
./test(extern (C) int rt.dmain2.main(int, char**)) [0x808578a]
./test(extern (C) int rt.dmain2.main(int, char**)) [0x80856a0]
./test(main+0x96) [0x8085646]
/usr/lib32/libc.so.6(__libc_start_main+0xe6) [0xf75d7c76]
./test() [0x807f6a1]
For some reason, the combination of pure and nothrow results in the function
being a no-op. Personally, since I try to make as many functions nothrow and as
many functions pure as possible, this is a serious fly in the ointment of both
pure and nothrow.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list