digitalmars.D.bugs - [Issue 11714] New: Improve error message for wrongly initialized thread-local class instances
- d-bugmail puremagic.com (31/31) Dec 10 2013 https://d.puremagic.com/issues/show_bug.cgi?id=11714
- d-bugmail puremagic.com (7/7) Dec 10 2013 https://d.puremagic.com/issues/show_bug.cgi?id=11714
- d-bugmail puremagic.com (7/7) Dec 10 2013 https://d.puremagic.com/issues/show_bug.cgi?id=11714
- d-bugmail puremagic.com (8/8) Dec 10 2013 https://d.puremagic.com/issues/show_bug.cgi?id=11714
- d-bugmail puremagic.com (14/14) Dec 11 2013 https://d.puremagic.com/issues/show_bug.cgi?id=11714
- d-bugmail puremagic.com (9/9) Dec 11 2013 https://d.puremagic.com/issues/show_bug.cgi?id=11714
- d-bugmail puremagic.com (8/12) Dec 11 2013 https://d.puremagic.com/issues/show_bug.cgi?id=11714
- d-bugmail puremagic.com (21/23) Dec 12 2013 https://d.puremagic.com/issues/show_bug.cgi?id=11714
- d-bugmail puremagic.com (23/25) Dec 12 2013 https://d.puremagic.com/issues/show_bug.cgi?id=11714
https://d.puremagic.com/issues/show_bug.cgi?id=11714 Summary: Improve error message for wrongly initialized thread-local class instances Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: enhancement Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: joseph.wakeling webdrake.net 2013-12-10 02:45:33 PST --- If a developer tries to initialize a static/thread-local class instance with a value not knowable at compile time, the compiler will object with an error message as follows: Error: variable %s is mutable. Only const or immutable class thread local variable are allowed, not %s This easily leads to the wrong conclusion that thread-local class instances must themselves be const or immutable, rather than the reality that the initialization value must be. This error message should be replaced with something more friendly, along the lines of Cannot initialize thread-local class variable %s with a mutable value. Only const or immutable initial values are allowed (e.g. null). Background: http://forum.dlang.org/post/mailman.408.1386663198.3242.digitalmars-d-learn puremagic.com -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 10 2013
https://d.puremagic.com/issues/show_bug.cgi?id=11714 2013-12-10 02:47:36 PST --- Pull request with fix (slightly different message from the one suggested here): https://github.com/D-Programming-Language/dmd/pull/2943 -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 10 2013
https://d.puremagic.com/issues/show_bug.cgi?id=11714 2013-12-10 09:13:13 PST --- Created an attachment (id=1300) Test case for the existing error message. To see, run rdmd -main tlclass.d -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 10 2013
https://d.puremagic.com/issues/show_bug.cgi?id=11714 2013-12-10 09:14:48 PST --- The attached test case illustrates the error, in this case: tlclass.d(8): Error: variable tlclass.a2 is mutable. Only const or immutable class thread local variable are allowed, not tlclass.A -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 10 2013
https://d.puremagic.com/issues/show_bug.cgi?id=11714 David Nadlinger <code klickverbot.at> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |code klickverbot.at PST --- As I mentioned in the pull request, I believe what the error message is supposed to say is something along the lines of: "Thread-local mutable class variable cannot be initialized with reference to compile-time constant, use static constructor instead." Has been a while since I implemented ClassReferenceExp for LDC, though. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 11 2013
https://d.puremagic.com/issues/show_bug.cgi?id=11714 2013-12-11 14:52:56 PST --- OK, but "with reference to compile-time constant" is still not exactly obvious in its meaning (among other things, it's not clear if what is meant is "with reference to" or "with _a_ reference to", but either way I think we can still be clearer). -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 11 2013
https://d.puremagic.com/issues/show_bug.cgi?id=11714 PST ---OK, but "with reference to compile-time constant" is still not exactly obvious in its meaning (among other things, it's not clear if what is meant is "with reference to" or "with _a_ reference to", but either way I think we can still be clearer).With *a* reference to – I stripped out the articles trying to make the error message as concise as possible, and missed that it would distort the meaning. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 11 2013
https://d.puremagic.com/issues/show_bug.cgi?id=11714 2013-12-12 02:18:32 PST ---With *a* reference to – I stripped out the articles trying to make the error message as concise as possible, and missed that it would distort the meaning.Easier to use "with a reference to" and "with respect to" respectively, for the two different cases (just for future reference:-). What I'm really concerned about, though, is that to me that message is still pretty much incomprehensible about what it is that I actually did wrong. Even when clarified with instructions about what to do to resolve it (initialize to null or use static this) it's not obvious about what I got wrong or why it's wrong. If I understand the logic right, the result of "new MyClass" is not knowable at compile time --> hence, a compile time constant; but inferring the former meaning from the latter is not obvious unless one already knows. Rather than requiring the programmer's knowledge and understanding to comprehend the error message, we should aim to use the error message to _increase_ the programmer's knowledge and understanding. So, I want an error message that idiots like me can read and go, "Oh! THAT's why it's wrong," as well as understanding how to fix it. :-) -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 12 2013
https://d.puremagic.com/issues/show_bug.cgi?id=11714 PST ---If I understand the logic right, the result of "new MyClass" is not knowable at compile timeActually it is, otherwise you'd get a "cannot be read/evaluated at compile time" error in the constructor. The issue here is that in D global variables can only be initialized with statically known data (written to the relevant sections of the object file). For everything else, you need to use a static constructor. While support for converting CTFE class instances into data blobs to write to an object file was implemented a while ago, variables of a class type are of course references and need to point somewhere. Now, if a variable is either immutable or explicitly shared between threads, that's fine, you just emit the data once and then initialize the variable to point to that. However, for mutable, thread-local data, this simple scheme doesn't work, as it would require a new instance to be created for each new thread. I didn't really think about whether it would be possible to resolve that situation by emitting all the instance data into the TLS section yet, but this certainly isn't implemented in DMD right now. Thus, initializing class references that are (potentially) modified from more than one thread with CTFE instances is disallowed. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Dec 12 2013