Bug 2733 – Unclear semantics of template value parameters
Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
x86
OS
Windows
Creation time
2009-03-15T04:59:00Z
Last change time
2014-04-18T09:12:08Z
Keywords
accepts-invalid
Assigned to
nobody
Creator
samukha
Comments
Comment #0 by samukha — 2009-03-15T04:59:51Z
The following code compiles but the generated binary is not correct.
import std.stdio;
void foo(string s)()
{
writefln(s);
}
void main()
{
string s = "test";
foo!(s);
}
----
Prints nothing. In less trivial cases, passing non-const arguments to value parameters causes data corruption/access violations.
It is not defined whether the argument should be passed by alias or the code should fail to compile complaining about the argument not being evaluatable at compile time.
Comment #1 by smjg — 2009-04-01T04:53:17Z
Non-alias template arguments are, by definition, compile-time constants. s isn't a compile-time constant - it's a mutable reference to immutable data. So this shouldn't compile.
Comment #2 by samukha — 2009-04-01T05:13:11Z
I'm not that sure anymore. Actually, I wouldn't mind if they were passed by alias. Then, I could write simply
template foo(string s)
{}
instead of
template foo(alias s) if (isString!(s))
{}
If I want to restrict template arguments to statically known values, I can use a isCompileTime constraint
template foo(string s) if (isCompileTime!(s))
{
}
Comment #3 by smjg — 2009-04-01T07:05:32Z
(In reply to comment #2)
> If I want to restrict template arguments to statically known values, I can use
> a isCompileTime constraint
Templates with non-alias parameters are instantiated by value at compile-time in the first place. What you're proposing would be a radical change to this.
You could try defining that such a template may be instantiated either by value or by alias. However, this is effectively creating two mutually incompatible templates, and it can be confusing to try to work out which is being instantiated.
I can't think of a practical use case for passing a string by alias in a function template, but I'm guessing there's a use for it in templates of some kinds. The question is whether there are enough use cases for syntactic sugar to be worthwhile, but it could look something like
template foo(string alias s)
....
Comment #4 by kamm-removethis — 2009-06-28T00:14:00Z
I changed the version to a D1 one as it is also accepts-invalid there.
Comment #5 by bugzilla — 2012-01-23T00:28:38Z
Not a spec issue - it's a D1 only bug where a template value parameter that is not a compile-time constant is allowed.
Comment #6 by yebblies — 2012-01-29T22:25:10Z
*** This issue has been marked as a duplicate of issue 2257 ***