[Issue 22192] New: [The D Bug Tracker]
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Sun Aug  8 13:45:48 UTC 2021
    
    
  
https://issues.dlang.org/show_bug.cgi?id=22192
          Issue ID: 22192
           Summary: [The D Bug Tracker]
           Product: D
           Version: D2
          Hardware: All
               URL: http://dlang.org/
                OS: All
            Status: NEW
          Severity: major
          Priority: P3
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: eyal at weka.io
This program exhibits at least 2 different issues:
struct S() {
align(1):
    bool x;
    public int* i;
    public void initialize(int* i) {
        this.i = i;
    }
}
S!() r1;
// pragma(msg, "r1.initialize:", typeof(r1.initialize));  // <-- magical line
pragma(msg, "S!().initialize:", typeof(S!().initialize));
Now this program compiles and the pragma msg emits:
"S!().initialize:void(int* i)"
Issue A) this is wrong, because inside a template, it should infer the method
to be pure nothrow @nogc, but it doesn't.
Issue B) if you uncomment the magical line, the pragma msgs now emit:
"r1.initialize:pure nothrow @nogc @safe void(int* i)
S!().initialize:pure nothrow @nogc @safe void(int* i)"
so the first pragma(msg) changes the inferred type of initialize to correctly
include "pure nothrow @nogc" but *incorrectly* include "@safe" (it isn't @safe
because it assigns a misaligned pointer!)
-----------------
A) So a typeof() computation on a type has side-effects.
B) The attribute inference is too narrow without it
C) The attribute inference is too wide with it
-----------------
I've minimized to this example when debugging linker errors - where different
compilation contexts inferred "@safe pure" differently on an expression.
--
    
    
More information about the Digitalmars-d-bugs
mailing list