digitalmars.D.bugs - [Issue 5191] New: Combination of pure and nothrow result in a function that does nothing
- d-bugmail puremagic.com (68/68) Nov 09 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5191
- d-bugmail puremagic.com (13/13) Nov 09 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5191
- d-bugmail puremagic.com (38/38) Nov 10 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5191
- d-bugmail puremagic.com (10/10) Nov 26 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5191
- d-bugmail puremagic.com (10/10) Nov 29 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5191
- d-bugmail puremagic.com (12/12) Dec 04 2010 http://d.puremagic.com/issues/show_bug.cgi?id=5191
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 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: -------
Nov 09 2010
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 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: -------
Nov 09 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5191 Don <clugdbug yahoo.com.au> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |patch 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: -------
Nov 10 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5191 bearophile_hugs eml.cc changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ibuclaw ubuntu.com *** 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: -------
Nov 26 2010
http://d.puremagic.com/issues/show_bug.cgi?id=5191 David Simcha <dsimcha yahoo.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |dsimcha yahoo.com 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: -------
Nov 29 2010
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 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: -------
Dec 04 2010