Bug 1820 – Let ifti see through static if condition in some cases
Status
RESOLVED
Resolution
FIXED
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2008-02-07T17:11:17Z
Last change time
2020-03-21T03:56:36Z
Keywords
rejects-valid
Assigned to
No Owner
Creator
Andrei Alexandrescu
Comments
Comment #0 by andrei — 2008-02-07T17:11:17Z
The following code compiles and runs as expected:
import std.stdio;
template wyda(string pred = ``)
{
void wyda(int x) { writeln(pred, " ", x); }
}
void main()
{
wyda(3);
wyda!("a")(4);
}
However, the following equivalent code does not:
import std.stdio;
template wyda(string pred = ``)
{
static if (true)
void wyda(int x) { writeln(pred, " ", x); }
}
void main()
{
wyda(3);
wyda!("a")(4);
}
The proposed solution is to get rid to the maximum extent possible of the requirements for the noisy "!()" syntax. If a template name is specified without the "!", then it should simply assume "!()" followed.
Andrei
Comment #1 by yebblies — 2011-07-02T21:28:33Z
The issue here is in:
template func(T)
{
static if (cond)
void func(T x) {}
}
func is only a function template (onemember) when cond is true, and in the general case cond may rely on T, which relies on ifti.
The following might illustrate it better:
template func(T)
{
static if (is(T == int)) // how could we know this before performing ifti?
void func(T* x) {}
}
The compiler cannot generally evaluate static if conditions without the template args being known. Although it could in very simple cases, I'm not sure it's worth the effort.
One place I think this could be done is inside VersionConditions.
Comment #2 by simen.kjaras — 2017-09-19T11:50:41Z
Code in this issue compiles and runs correctly on 2.075.1.