[Issue 12807] New: UFCS checks "alias this" attributes even when not called
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Mon May 26 12:18:40 PDT 2014
https://issues.dlang.org/show_bug.cgi?id=12807
Issue ID: 12807
Summary: UFCS checks "alias this" attributes even when not
called
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: DMD
Assignee: nobody at puremagic.com
Reporter: monarchdodra at gmail.com
Basically, if you call a function "UFCS style", on an object that has an alias
this, then the compiler (from what I can observe) will consider the "alias
this" as "called" to evaluate the attributes, even if the alias this is not
actually called. Example:
//----
void foo(T)(ref T t)
{
pragma(msg, T.stringof);
}
struct S
{
int impure() {assert(0);}
alias impure this;
}
void main() pure
{
S s;
foo(s); //YES
s.foo(); //NO
}
//----
Error: pure function 'D main' cannot call impure function 'main.S.impure'
//----
What's "funny" is that is you remove the "pure" on main, we can verify that
"impure" is never actually called.
Discovered while writing:
https://github.com/D-Programming-Language/phobos/pull/2202
Originally:
assert(!source.doesPointTo(source), "msg");
Worked around with:
assert(!doesPointTo(source, source), "msg");
--
More information about the Digitalmars-d-bugs
mailing list