Why code failed to compile for foo2?

Tejas notrealemail at gmail.com
Mon Dec 13 08:41:28 UTC 2021

On Sunday, 12 December 2021 at 03:02:28 UTC, apz28 wrote:
> On Sunday, 12 December 2021 at 00:02:25 UTC, Stanislav Blinov 
> wrote:
>> @apz28, I can't figure out the intent here. To convert result 
>> of abs to an unsigned?
> The function logic works only for unsigned type and the 
> parameter value can be altered in body hence Unqual. If not 
> Unqual, must declare a local var and make a copy. Just asking 
> if this can be done to avoid a cast by caller

AFAIK stuff like `const int` implicitly converts to `int` since 
`int` is passed by value so the `const`ness of the original value 
is not violated.

That's why code like:
void main(){
	const int a = 55;
	int b = a;
compiles and executes.

So, in a similar vein, your code will transform to:

void foo1(ubyte x) {}
void foo1(ushort x) {}
void foo1(uint x) {}
void foo1(ulong x) {}

import std.traits : Unconst;
import std.stdio : writeln;

void foo2(T)(T x) if(is(Unconst!(T) : ulong)) {//You don't need 
Unqual for this

void foo3(ulong param){ //I'm assuming this is your function that 
you will pass your uint to

void main()
     import std.math;

     int s = int.min + 1; //abs returns int.min for abs(int.min) 
lol XD
     foo2(abs(s)); //failed? //Not anymore :D

Again, please remember that `std.math.algebraic:abs` doesn't 
return `uint` for `int` and so on, please see [the 

>>The absolute value of the number. If floating-point or 
>>integral, the __return type__ will be the __same as the input__.

>>Does not work correctly for signed intergal types and value 

More information about the Digitalmars-d-learn mailing list