Thread overview
Why is align() on structures not allowed within unit-test code blocks?
Dec 04, 2011
GrahamC
Dec 04, 2011
Timon Gehr
Re: Why is align() on structures not allowed within unit-test code
Dec 04, 2011
bearophile
December 04, 2011
Is there a good reason why align() applied to structure definitions is not allowed on the struct definition line within unit-test code blocks?

E.g.:

unittest {

     align(1) struct Foo {
        char	c;
 	      int		i;
    }

     void Bar() {
 	        Foo f;
     }

}

int main() {
     return 0;
}


fails to compile. The error message is:
    found 'align' instead of statement

The error message is the same for both DMD and GDC.

If you take the align(1) out it compiles OK.
If you move the structure definition out of the unit-test block but leave the align(1) in place it compiles OK.
If you put the align(1) on each member variable definition instead of the struct line it compiles OK.

If the structure type is only used within the unit-test code then I would think it ought to be possible to define it (including it's alignment attribute) within that unit-test code block.
December 04, 2011
On 12/04/2011 03:01 PM, GrahamC wrote:
> Is there a good reason why align() applied to structure definitions is not allowed on the struct definition line within unit-test code blocks?
>
> E.g.:
>
> unittest {
>
>       align(1) struct Foo {
>          char	c;
>   	      int		i;
>      }
>
>       void Bar() {
>   	        Foo f;
>       }
>
> }
>
> int main() {
>       return 0;
> }
>
>
> fails to compile. The error message is:
>      found 'align' instead of statement
>
> The error message is the same for both DMD and GDC.
>
> If you take the align(1) out it compiles OK.
> If you move the structure definition out of the unit-test block but leave the align(1) in place it compiles OK.
> If you put the align(1) on each member variable definition instead of the struct line it compiles OK.
>
> If the structure type is only used within the unit-test code then I would think it ought to be possible to define it (including it's alignment attribute) within that unit-test code block.

The reason is that it is parsed as function-local and that DMD's parser for some strange reason uses different grammar rules for declarations when inside a function body. You could maybe file a bug report.

A possible workaround is to take the declaration out of the unittest block and wrap it into a version(unittest) block like this:


version(unittest) {
    align(1) struct Foo {
        char c;
        int i;
    }
}
unittest {
    void Bar() {
        Foo f;
    }
}

int main() {
     return 0;
}

It invades the namespace of the module when compiling with -unittest though.
December 04, 2011
Timon Gehr:

> The reason is that it is parsed as function-local and that DMD's parser for some strange reason uses different grammar rules for declarations when inside a function body. You could maybe file a bug report.

http://d.puremagic.com/issues/show_bug.cgi?id=7065

Bye,
bearophile