www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 22192] New: [The D Bug Tracker]

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 puremagic.com
          Reporter: eyal 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.

--
Aug 08 2021