digitalmars.D.learn - UDA example
- Craig Dillabaugh (26/26) Aug 19 2013 When I attempt to compile the following example code from the
- Jacob Carlborg (4/28) Aug 19 2013 Move everything out of "main" and it will work.
- Craig Dillabaugh (14/49) Aug 19 2013 So I guess it was option (c) after all.
- Dicebot (24/25) Aug 19 2013 It is not exactly about UDA - key is different meaning of curly
- Craig Dillabaugh (2/29) Aug 19 2013 Thank you, makes perfect sense.
When I attempt to compile the following example code from the section on UDAs at: http://dlang.org/attribute.html void main(string args[]) { template Tuple (T...) { alias T Tuple; } enum EEE = 7; ("hello") struct SSS { } (3) { (4) EEE SSS int foo; } alias Tuple!(__traits(getAttributes, foo)) TP; pragma(msg, TP); // prints tuple(3, 4, 7, (SSS)) pragma(msg, TP[2]); // prints 7 } I get the following errors: UDAs.d(9): Error: basic type expected, not { UDAs.d(9): Error: no identifier for declarator int UDAs.d(9): Error: semicolon expected, not '{' Line 9 is the one starting " (3) ..." Is this due to: a. a DMD bug (DMD64 D Compiler v2.063.2, Linux) b. a Documentation bug c. me not properly copying/pasting the example :/ Craig P.S. This reCAPTCHA anti-spam think sucks.
Aug 19 2013
On 2013-08-19 19:57, Craig Dillabaugh wrote:When I attempt to compile the following example code from the section on UDAs at: http://dlang.org/attribute.html void main(string args[]) { template Tuple (T...) { alias T Tuple; } enum EEE = 7; ("hello") struct SSS { } (3) { (4) EEE SSS int foo; } alias Tuple!(__traits(getAttributes, foo)) TP; pragma(msg, TP); // prints tuple(3, 4, 7, (SSS)) pragma(msg, TP[2]); // prints 7 } I get the following errors: UDAs.d(9): Error: basic type expected, not { UDAs.d(9): Error: no identifier for declarator int UDAs.d(9): Error: semicolon expected, not '{' Line 9 is the one starting " (3) ..." Is this due to: a. a DMD bug (DMD64 D Compiler v2.063.2, Linux) b. a Documentation bug c. me not properly copying/pasting the example :/Move everything out of "main" and it will work. -- /Jacob Carlborg
Aug 19 2013
On Monday, 19 August 2013 at 18:01:40 UTC, Jacob Carlborg wrote:On 2013-08-19 19:57, Craig Dillabaugh wrote:So I guess it was option (c) after all. I am still curious though was is wrong using UDAs inside main(). If I have the following code inside main. (7) int b; pragma(msg, __traits(getAttributes, b) ); or ("goodbye") struct D {} pragma(msg, __traits(getAttributes, D) ); Then it compiles fine. But if I make it: (7) { {11} int b; } pragma(msg, __traits(getAttributes, b) ); Then I get the same error. CraigWhen I attempt to compile the following example code from the section on UDAs at: http://dlang.org/attribute.html void main(string args[]) { template Tuple (T...) { alias T Tuple; } enum EEE = 7; ("hello") struct SSS { } (3) { (4) EEE SSS int foo; } alias Tuple!(__traits(getAttributes, foo)) TP; pragma(msg, TP); // prints tuple(3, 4, 7, (SSS)) pragma(msg, TP[2]); // prints 7 } I get the following errors: UDAs.d(9): Error: basic type expected, not { UDAs.d(9): Error: no identifier for declarator int UDAs.d(9): Error: semicolon expected, not '{' Line 9 is the one starting " (3) ..." Is this due to: a. a DMD bug (DMD64 D Compiler v2.063.2, Linux) b. a Documentation bug c. me not properly copying/pasting the example :/Move everything out of "main" and it will work.
Aug 19 2013
On Monday, 19 August 2013 at 18:21:26 UTC, Craig Dillabaugh wrote:I am still curious though was is wrong using UDAs inside main().It is not exactly about UDA - key is different meaning of curly brace {} syntax in function bodies and in declaration scopes. Used in declaration scope {} apply all attributes attached to it to every declaration inside: const { int a; double b; } static assert (is(typeof(a) == const)); This also applies for UDA's. In function body it creates new variable scope - variables declared inside get destroyed upon leaving the scope and are not available outside. void foo() { { int a; } // a = 42; // error } As this usage of {} does not expect any attribute propagation, UDA's get rejected too.
Aug 19 2013
On Monday, 19 August 2013 at 18:28:24 UTC, Dicebot wrote:On Monday, 19 August 2013 at 18:21:26 UTC, Craig Dillabaugh wrote:Thank you, makes perfect sense.I am still curious though was is wrong using UDAs inside main().It is not exactly about UDA - key is different meaning of curly brace {} syntax in function bodies and in declaration scopes. Used in declaration scope {} apply all attributes attached to it to every declaration inside: const { int a; double b; } static assert (is(typeof(a) == const)); This also applies for UDA's. In function body it creates new variable scope - variables declared inside get destroyed upon leaving the scope and are not available outside. void foo() { { int a; } // a = 42; // error } As this usage of {} does not expect any attribute propagation, UDA's get rejected too.
Aug 19 2013