[Issue 20670] New: immutable template specialization pattern matches immutable struct, strips immutable
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Fri Mar 13 08:59:15 UTC 2020
    
    
  
https://issues.dlang.org/show_bug.cgi?id=20670
          Issue ID: 20670
           Summary: immutable template specialization pattern matches
                    immutable struct, strips immutable
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: regression
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: default_357-line at yahoo.de
Consider an immutable struct:
```
immutable struct S { }
```
Let's define a template specialization that tries to strip away immutable from
a type, like Unqual.
```
mixin template Foo(T) { static assert(is(S == T)); }
mixin template Foo(T: immutable U, U) {
  pragma(msg, U.stringof);
  // even if this matches, S should still be S. There is only one S.
  static assert(is(S == U));
}
```
Let's apply it to our immutable struct:
```
mixin Foo!S;
```
Since 2.076.1, it takes the second template and fails with the static assert!
We've somehow  managed to take a struct type and strip away its inherent
constness attribute.
This is of course very bad. If we define S as `immutable struct S`, we should
not be able by any mechanism to get the non-immutable struct S back out.
--
    
    
More information about the Digitalmars-d-bugs
mailing list