July 13, 2019
for example:

void  enforce(bool val, string file = __FILE__, size_t line = __LINE__){
     if( !val ) {
         debug printf("%s, from line %d\n", file.ptr, line);
       abort();
    }
}

__gshared int base = 10;
int somefn(int val,  string file = __FILE__, size_t line = __LINE__) {
      enforce(val > 0, file, line);
     return val + base  ;
}

void main(){
     int i = somefn(1);
}

when build for release, will the parameter reduce into 1 for function  somefn && enforce ?

and how to verify this ?


July 16, 2019
On Saturday, 13 July 2019 at 06:33:35 UTC, Newbie2019 wrote:
> for example:
>
> void  enforce(bool val, string file = __FILE__, size_t line = __LINE__){
>      if( !val ) {
>          debug printf("%s, from line %d\n", file.ptr, line);
>        abort();
>     }
> }
>
> __gshared int base = 10;
> int somefn(int val,  string file = __FILE__, size_t line = __LINE__) {
>       enforce(val > 0, file, line);
>      return val + base  ;
> }
>
> void main(){
>      int i = somefn(1);
> }
>
> when build for release, will the parameter reduce into 1 for function  somefn && enforce ?


Well I put it into http://d.godbolt.org and it seems to be smart enough to remove all the code from main entirely.

https://d.godbolt.org/z/o-pKBL

Literally compiling your main to :-

_Dmain:
        xor     eax, eax
        ret

If I add a fake function for the value passed in so that it can't just determine at compile time that main needs to do nothing I get this :-

https://d.godbolt.org/z/ypgBK2

It has inlined the functions and removed anything to do with the parameters that are not used.