Thread overview
final struct ?
May 19, 2020
wjoe
May 19, 2020
user1234
May 19, 2020
wjoe
May 20, 2020
user1234
May 20, 2020
wjoe
May 19, 2020
As I was reading a few source files of a library I found dozens of final struct declarations like this:

final struct Foo {

  const pure final nothrow bar() { ... }

}

What's this supposed to express ?

A final class is a class that can't be subclassed - structs can't be subclassed, so does that express something else or is the final redundant ?
Additionally since it's not possible to subclass a struct it's also not possible to override bar() - does 'final bar()' mean something else ?

The only relevant bits of my web search for 'dlang: final' were results for final class, virtual functions and final switch. Am I missing something ?
May 19, 2020
On Tuesday, 19 May 2020 at 10:01:34 UTC, wjoe wrote:
> As I was reading a few source files of a library I found dozens of final struct declarations like this:
>
> final struct Foo {
>
>   const pure final nothrow bar() { ... }
>
> }
>
> What's this supposed to express ?
>
> A final class is a class that can't be subclassed - structs can't be subclassed, so does that express something else or is the final redundant ?
> Additionally since it's not possible to subclass a struct it's also not possible to override bar() - does 'final bar()' mean something else ?
>
> The only relevant bits of my web search for 'dlang: final' were results for final class, virtual functions and final switch. Am I missing something ?

It has no purpose. In D many attributes are allowed even if they have no meaning.
D-Scanner checks this kind of stuff, to some extent, but not the compiler.
May 19, 2020
On Tuesday, 19 May 2020 at 10:08:37 UTC, user1234 wrote:
> On Tuesday, 19 May 2020 at 10:01:34 UTC, wjoe wrote:
>> [...]
>
> It has no purpose. In D many attributes are allowed even if they have no meaning.
> D-Scanner checks this kind of stuff, to some extent, but not the compiler.

Thank you.
May 20, 2020
On Tuesday, 19 May 2020 at 10:29:51 UTC, wjoe wrote:
> On Tuesday, 19 May 2020 at 10:08:37 UTC, user1234 wrote:
>> On Tuesday, 19 May 2020 at 10:01:34 UTC, wjoe wrote:
>>> [...]
>>
>> It has no purpose. In D many attributes are allowed even if they have no meaning.
>> D-Scanner checks this kind of stuff, to some extent, but not the compiler.
>
> Thank you.

A little sample to show you more cases of attributes that have no effect:

---
struct Foo
{
    nothrow @nogc int field; // why not ?

    void func()
    {
        void nested() const
        {
            field++;      // mutation is allowed because const is a noop
            extern int j; // extern decl in a nested func...
        }

        nothrow i = 8;    // just like auto
        pure f = 9;       // just like auto
        @safe s = 10;     // just like auto
        @system t = s;    // just like auto
    }
}

void main() { }
---
May 20, 2020
On Wednesday, 20 May 2020 at 04:40:33 UTC, user1234 wrote:
> On Tuesday, 19 May 2020 at 10:29:51 UTC, wjoe wrote:
>> On Tuesday, 19 May 2020 at 10:08:37 UTC, user1234 wrote:
>>> [...]
>>
>> Thank you.
>
> A little sample to show you more cases of attributes that have no effect:
>
> ---
> struct Foo
> {
>     nothrow @nogc int field; // why not ?
>
>     void func()
>     {
>         void nested() const
>         {
>             field++;      // mutation is allowed because const is a noop
>             extern int j; // extern decl in a nested func...
>         }
>
>         nothrow i = 8;    // just like auto
>         pure f = 9;       // just like auto
>         @safe s = 10;     // just like auto
>         @system t = s;    // just like auto
>     }
> }
>
> void main() { }
> ---

much appreciated :)