Thread overview
Conditionally set nothrow: for a block of code.
May 24, 2018
Mike Franklin
May 27, 2018
Uknown
May 28, 2018
Nicholas Wilson
May 29, 2018
Mike Franklin
May 24, 2018
I'm trying to find a way to declare a block of code `nothrow:` when compiling with -betterC, but not `nothrow` when not compiling with -betterC.

The solution is needed for this PR:  https://github.com/dlang/druntime/pull/2184/files#r188627707

Attempt #1
----------
void test() { }

version(D_BetterC)
{
    nothrow:
}

extern(C) void main()
{
    test();   // This should throw an error in -betterC because `main` is
              // `nothrow` but `test` isn't. It doesn't work
}

Attempt #2
----------
version(D_BetterC)
{
    enum isNoThrow = true;
}
else
{
    enum isNoThrow = false;
}

void test() { }

static if (isNoThrow)
{
    nothrow:
}

extern(C) void main()
{
    test();   // This should throw an error in -betterC because `main` is
              // `nothrow` but `test` isn't. It doesn't work
}

Attempt #3
----------
version(D_BetterC)
{
    enum nothrowValue = "nothrow:";
}
else
{
    enum nothrowValue = "";
}

void test() { }

mixin(nothrowValue);

extern(C) void main()
{
    test();   // This should throw an error in -betterC because `main` is
              // `nothrow` but `test` isn't. It doesn't work
}


Given that the PR above is for object.d, I can't turn the entire object.d source file into a string and conditionally mix that in.  Does anyone have a solution to this?

Thanks,
Mike
May 24, 2018
On 5/24/18 2:51 PM, Mike Franklin wrote:

> Given that the PR above is for object.d, I can't turn the entire object.d source file into a string and conditionally mix that in.  Does anyone have a solution to this?

My recommendation would have been the last one, but if that doesn't work, I don't think anything will that is... palatable.

The only other avenue you *could* explore is importing a file as a string and mixing the whole thing in (prepending "nothrow:" at the top).

Other than that, I think it's on to DIP territory.

-Steve
May 27, 2018
On Thursday, 24 May 2018 at 18:51:31 UTC, Mike Franklin wrote:
> I'm trying to find a way to declare a block of code `nothrow:` when compiling with -betterC, but not `nothrow` when not compiling with -betterC.
>
> The solution is needed for this PR:  https://github.com/dlang/druntime/pull/2184/files#r188627707
> [...]
> Given that the PR above is for object.d, I can't turn the entire object.d source file into a string and conditionally mix that in.
>  Does anyone have a solution to this?
>
> Thanks,
> Mike

I think conditional application of attributes would be something useful. Something like this:

version (D_BetterC)
    enum BetterC = true;
else
    enum BetterC = false;

nothrow!(BetterC):
...

Of course that would require a DIP though
May 28, 2018
On Thursday, 24 May 2018 at 18:51:31 UTC, Mike Franklin wrote:
> I'm trying to find a way to declare a block of code `nothrow:` when compiling with -betterC, but not `nothrow` when not compiling with -betterC.
>
> [...]

Not one now but, DIP 1012 will allow this as nothrow will become a regular enum attribute.

May 29, 2018
On Thursday, 24 May 2018 at 18:51:31 UTC, Mike Franklin wrote:
> I'm trying to find a way to declare a block of code `nothrow:` when compiling with -betterC, but not `nothrow` when not compiling with -betterC.
>
> The solution is needed for this PR:  https://github.com/dlang/druntime/pull/2184/files#r188627707

Walter came up with a solution to this; put the code that is conditionally `nothrow` in a template and mix it in in the appropriate branch.

void test() { }

mixin template code()
{
    extern(C) void main()
    {
        test();   // This should throw an error in -betterC because `main` is
                  // `nothrow` but `test` isn't. It doesn't work
    }
}

version(D_BetterC)
{
    nothrow:
    mixin code;
}
else
{
    mixin code;
}

Thanks, Walter.

Mike