digitalmars.D.bugs - [Issue 22192] New: [The D Bug Tracker]
- d-bugmail puremagic.com (44/44) Aug 08 2021 https://issues.dlang.org/show_bug.cgi?id=22192
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