[Issue 18269] New: Inconsistent of delegate @system attribute
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Jan 19 23:34:24 UTC 2018
https://issues.dlang.org/show_bug.cgi?id=18269
Issue ID: 18269
Summary: Inconsistent of delegate @system attribute
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: hsteoh at quickfur.ath.cx
Code:
------
void one(T)(T t, size_t ln = 0)
{
pragma(msg, "one: ", T.stringof);
two(t);
}
void two(T)(T t)
{
pragma(msg, "two: ", T.stringof);
}
enum Seq(T...) = 0;
alias Bug = Seq!(void delegate());
void main()
{
void func() @system { __gshared int x; ++x; throw new Exception(""); }
one(&func);
}
------
Compiler command:
------
dmd -o- -c test.d
------
Compiler output:
------
one: void delegate() @system
two: void delegate()
------
Note the lack of @system on the second line. Any of the following will cause
@system to appear on the second line:
- Removing the default parameter `ln` from the template function `one`.
- Commenting out the `alias Bug` line.
- Adding a default parameter `size_t ln = 0` to the template function `two`.
Curiously, if the default parameter `ln` is *moved* from `one` to `two`, the
output becomes:
-------
one: void delegate()
two: void delegate()
-------
which is even more strange, since the output now has *neither* @safe nor
@system.
Expected behaviour:
The output should at least be consistent, and certainly should not change
depending on whether the `alias Bug` line is there or not, since it has
absolutely nothing to do with the templates `one` and `two`.
--
More information about the Digitalmars-d-bugs
mailing list