Thread overview
Template specializations in unittest blocks
Jun 08, 2015
Jeffrey Tsang
Jun 08, 2015
Timon Gehr
Jun 08, 2015
Jeffrey Tsang
June 08, 2015
The following works:

enum foo(int x) = x + foo!(x - 1);
enum foo(int x : 0) = 0;

enum bar(T) = cast(T) 3;
enum bar(T : int) = 4;

Wrap it in a unittest{}, and complaints about multiply defined templates hit. Is there a reason for this?
June 08, 2015
On 06/08/2015 08:10 PM, Jeffrey Tsang wrote:
> The following works:
>
> enum foo(int x) = x + foo!(x - 1);
> enum foo(int x : 0) = 0;
>
> enum bar(T) = cast(T) 3;
> enum bar(T : int) = 4;
>
> Wrap it in a unittest{}, and complaints about multiply defined templates
> hit. Is there a reason for this?

No good reason. DMD doesn't let local symbols overload against each other.
June 08, 2015
On 6/8/15 2:10 PM, Jeffrey Tsang wrote:
> The following works:
>
> enum foo(int x) = x + foo!(x - 1);
> enum foo(int x : 0) = 0;
>
> enum bar(T) = cast(T) 3;
> enum bar(T : int) = 4;
>
> Wrap it in a unittest{}, and complaints about multiply defined templates
> hit. Is there a reason for this?

To expand on what Timon said, a unittest block is actually a function under the hood.

Try the same thing inside a function and you will get the same issue.

Do this instead (outside of the unit test block):

version(unittest) {
... // same thing
}

-Steve
June 08, 2015
On Monday, 8 June 2015 at 18:22:49 UTC, Steven Schveighoffer wrote:
> On 6/8/15 2:10 PM, Jeffrey Tsang wrote:
>> The following works:
>>
>> enum foo(int x) = x + foo!(x - 1);
>> enum foo(int x : 0) = 0;
>>
>> enum bar(T) = cast(T) 3;
>> enum bar(T : int) = 4;
>>
>> Wrap it in a unittest{}, and complaints about multiply defined templates
>> hit. Is there a reason for this?
>
> To expand on what Timon said, a unittest block is actually a function under the hood.
>
> Try the same thing inside a function and you will get the same issue.
>
> Do this instead (outside of the unit test block):
>
> version(unittest) {
> ... // same thing
> }
>
> -Steve

OK, that makes much more sense. Thanks.