D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 11107 - variable initialized to mutable non-TLS global.
Summary: variable initialized to mutable non-TLS global.
Status: NEW
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P3 normal
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-09-22 23:57 UTC by monarchdodra
Modified: 2024-12-13 18:11 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description monarchdodra 2013-09-22 23:57:30 UTC
//----
class A{}

auto a = new A; //(3)
immutable ia = new immutable(A); //(4)
auto i = new int; //(5)
immutable ii = new immutable(int); //(6)

struct S
{
    auto a = new A; //(10) HERE!!!
    auto i = new int; //(11)
}
//----

I'm not sure if this is a reg, but:

2.062:
main.d(3): Error: cannot evaluate new A at compile time
main.d(4): Error: cannot evaluate new immutable(A) at compile time
main.d(5): Error: cannot evaluate new int at compile time
main.d(6): Error: cannot evaluate new immutable(int) at compile time
main.d(10): Error: cannot evaluate new A at compile time
main.d(11): Error: cannot evaluate new int at compile time

2.063 has allowed evaluating classes at compile time (but not ints, apparently):

main.d(3): Error: variable main.a is mutable. Only const or immutable class thread local variable are allowed, not main.A
main.d(5): Error: Cannot interpret new int at compile time
main.d(6): Error: Cannot interpret new immutable(int) at compile time
main.d(11): Error: Cannot interpret new int at compile time

I believe that this code is wrong:
- first, because it is surprising that 'a' reference a global class instance, as opposed to a new A for each new S (even if it's the correct behavior).
- second, because the new global instance is not TLS (referenced by T.init), yet is placed in a non-shared.

Line 10 should be illegal. It should be either of:
    immutable ai = new immutable(A);
    shared as = new shared(A);
Comment 1 yebblies 2013-11-20 03:45:05 UTC
This is basically the class version of issue 2947
Comment 2 dlangBugzillaToGithub 2024-12-13 18:11:52 UTC
THIS ISSUE HAS BEEN MOVED TO GITHUB

https://github.com/dlang/dmd/issues/18678

DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB