[Issue 10008] Inconsistent inference of template and non-template function attributes

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Apr 29 17:26:11 PDT 2013


http://d.puremagic.com/issues/show_bug.cgi?id=10008



--- Comment #3 from Kenji Hara <k.hara.pg at gmail.com> 2013-04-29 17:26:09 PDT ---
(In reply to comment #2)
> OK, this explains why function from templated struct is deduced to have all
> attributes. But this tells nothing about another case. I understand that Z.foo
> is not required to be @safe/pure/nothrow because it isn't marked as such, but
> on the other hand S.foo() is also not marked and clearly there is contradiction
> here.

Short answer is that it is just same as the difference between:
  void foo() {}
and
  void bar()() {}

Both don't have attributes explicitly, but bar would be inferred to
@safe/pure/nothrow when it is instantiated.

---

There is an essential difference between template functions and non-template
ones. For the former, the actual function attributes of instantiated code is
not pre-deterministic. Ultimately, it would depend on the arguments which is
given on the template parameters. Attribute inference for the instantiated
functions is necessary for making function attributes more convenient.

On the other hand, the functions out of the template declaration should be "as
is". You can hide the function body in the library file for the separate
compilation, and just only declaring function signatures in di file. Therefore,
we cannot/should not apply attribute inference for normal functions.

The contradiction you feel comes from the essential difference that I described
in above. Thanks.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list