Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
November 09, 2010 [Issue 5191] New: Combination of pure and nothrow result in a function that does nothing | ||||
---|---|---|---|---|
| ||||
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@puremagic.com ReportedBy: jmdavisProg@gmx.com --- Comment #0 from Jonathan M Davis <jmdavisProg@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@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: ------- |
November 09, 2010 [Issue 5191] Combination of pure and nothrow result in a function that does nothing | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | http://d.puremagic.com/issues/show_bug.cgi?id=5191 Don <clugdbug@yahoo.com.au> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |wrong-code CC| |clugdbug@yahoo.com.au Severity|normal |critical --- Comment #1 from Don <clugdbug@yahoo.com.au> 2010-11-09 04:37:00 PST --- Nasty. It's because pure member functions are internally being marked as const somehow. That needs to be fixed. In DMD2.049, this code didn't compile. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
November 10, 2010 [Issue 5191] Combination of pure and nothrow result in a function that does nothing | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | http://d.puremagic.com/issues/show_bug.cgi?id=5191 Don <clugdbug@yahoo.com.au> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |patch --- Comment #2 from Don <clugdbug@yahoo.com.au> 2010-11-10 00:27:33 PST --- Extra test case (add to the end of the original test case): --- void delegate (int) pure nothrow dg = &foo.add!(int); dg(7); assert(foo.value == 20); -- PATCH: e2ir.c, callfunc(), line 294. To determine if a function is strongly pure, you need to look at the function declaration, not just the function type, since the 'this' parameter isn't part of the type. ----- else if (ep) { /* Do not do "no side effect" calls if a hidden parameter is passed, * as the return value is stored through the hidden parameter, which * is a side effect. */ - e = el_bin((tf->purity == PUREstrong && tf->isnothrow && (retmethod != RETstack)) ? + e = el_bin(((fd ? fd->isPure() : tf->purity) == PUREstrong && tf->isnothrow && (retmethod != RETstack)) ? OPcallns : OPcall,tyret,ec,ep); if (tf->varargs) e->Eflags |= EFLAGS_variadic; } else - { e = el_una((tf->purity == PUREstrong && tf->isnothrow && (retmethod != RETstack)) ? + { e = el_una(((fd ? fd->isPure() : tf->purity) == PUREstrong && tf->isnothrow && (retmethod != RETstack)) ? OPucallns : OPucall,tyret,ec); -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
November 26, 2010 [Issue 5191] Combination of pure and nothrow result in a function that does nothing | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | http://d.puremagic.com/issues/show_bug.cgi?id=5191 bearophile_hugs@eml.cc changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ibuclaw@ubuntu.com --- Comment #3 from bearophile_hugs@eml.cc 2010-11-26 14:42:08 PST --- *** Issue 5277 has been marked as a duplicate of this issue. *** -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
November 29, 2010 [Issue 5191] Combination of pure and nothrow result in a function that does nothing | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | http://d.puremagic.com/issues/show_bug.cgi?id=5191 David Simcha <dsimcha@yahoo.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |dsimcha@yahoo.com --- Comment #4 from David Simcha <dsimcha@yahoo.com> 2010-11-29 06:37:58 PST --- Note that inlining must be turned off for this test case to fail. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
December 05, 2010 [Issue 5191] Combination of pure and nothrow result in a function that does nothing | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jonathan M Davis | http://d.puremagic.com/issues/show_bug.cgi?id=5191 Walter Bright <bugzilla@digitalmars.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED CC| |bugzilla@digitalmars.com Resolution| |FIXED --- Comment #5 from Walter Bright <bugzilla@digitalmars.com> 2010-12-04 19:35:21 PST --- http://www.dsource.org/projects/dmd/changeset/775 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
Copyright © 1999-2021 by the D Language Foundation