No, that's by design. When I added that syntax first but I was asked to change it to only accept call expressions.


@int S s;

is not

That is not supposed to be legal (see above), but this might be:

@(int) S s;

Does that work?

No. It produces reams of error.



So user-defined types are OK, but not basic types. Looks like a
parsing/grammar problem for me, since attribute tuple sure should be
able to store built-in types.
Another bug report?

I'm not sure.

I find it strange that @MyType ... is OK, but not @3, when, at the same time @(MyType) and @(3) are *both* OK.


Also, why is @("hello") and @(SomeType) authorized, but not @(int)?

One extreme or the other looks OK for me: either only user-defined types are authorized (no @int, no @3) or everything a tuple can hold is authorized (hence, @int). The latter is more in line with the D way.

Also, if parenthesis can be dropped, allow them to be dropped for anything that's a token long, as is done for template arguments. That seems coherent with the rest of the language.