digitalmars.D.bugs - mixing static if and if
- Thomas Kuehne (20/20) Jun 10 2005 -----BEGIN PGP SIGNED MESSAGE-----
- Unknown W. Brackets (19/46) Jun 10 2005 Isn't that the same as:
- Thomas Kuehne (26/44) Jun 10 2005 -----BEGIN PGP SIGNED MESSAGE-----
- Unknown W. Brackets (25/84) Jun 10 2005 Well, imho, that *should* be exactly the same as:
- Thomas Kuehne (13/37) Jun 10 2005 -----BEGIN PGP SIGNED MESSAGE-----
- Thomas Kuehne (11/43) Jun 10 2005 -----BEGIN PGP SIGNED MESSAGE-----
-
Stewart Gordon
(11/56)
Jun 14 2005
- Thomas Kuehne (21/73) Jun 17 2005 -----BEGIN PGP SIGNED MESSAGE-----
- Stewart Gordon (37/50) Jun 20 2005 Not quite:
- Derek Parnell (11/65) Jun 20 2005 The more that I see 'static if', the more I think it is really dumb. Not
- Unknown W. Brackets (7/75) Jun 20 2005 What about version else then? Or, I guess, versionelse :P.
- clayasaurus (5/57) Jun 10 2005 Apparently not, as you can see in d.D.announce under the dmd.126
- Walter (4/4) Jun 10 2005 No, there's no bug. It's well defined. static-if-else is a *completely
-
Stewart Gordon
(7/14)
Jun 14 2005
- Walter (3/13) Jun 14 2005 Sure. It gets set to the default initializer for the type.
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Is the following code legal, illegal or undefined? void test(){ const int a; int b; static if(a==3){ ... } else if(b==2){ ... } } http://dstress.kuehne.cn/undefined/static_if_05_A.d http://dstress.kuehne.cn/undefined/static_if_05_B.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFCqczs3w+/yD4P9tIRAo6kAJwOP8qYWovTFgJWhWLx+ZLlo5K4ygCgnplj vS8vTWaFfxXNFUKdTIkhJaY= =LdZW -----END PGP SIGNATURE-----
Jun 10 2005
Isn't that the same as: void test() { const int a; int b; static if (a == 3) { // ... } else { if (b == 2) { // ... } } } Which is totally legal...? -[Unknown]-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Is the following code legal, illegal or undefined? void test(){ const int a; int b; static if(a==3){ ... } else if(b==2){ ... } } http://dstress.kuehne.cn/undefined/static_if_05_A.d http://dstress.kuehne.cn/undefined/static_if_05_B.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFCqczs3w+/yD4P9tIRAo6kAJwOP8qYWovTFgJWhWLx+ZLlo5K4ygCgnplj vS8vTWaFfxXNFUKdTIkhJaY= =LdZW -----END PGP SIGNATURE-----
Jun 10 2005
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Unknown W. Brackets schrieb am Fri, 10 Jun 2005 10:59:58 -0700:Isn't that the same as: void test() { const int a; int b; static if (a == 3) { // ... } else { if (b == 2) { // ... } } } Which is totally legal...?Ok, a bit more complex: void test() { cont int a; int b; if (b==1){ // ... }else static if(a==2){ // ... int c; }else if(b==3){ // ... } } Can't be rewritten in the same way. c and b are in the same scope but would be in different scopes in the rewrite. Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFCqeDE3w+/yD4P9tIRAsJYAKCD/QWeeuOIXgOAIk7pdGVDn4UTswCfQ0zR rKlVcgTibYPH3trN1A0pGZw= =z3H3 -----END PGP SIGNATURE-----
Jun 10 2005
Well, imho, that *should* be exactly the same as: void test() { const int a; int b; if (b == 1) { } else // <-- this is the else I'm talking about. { static if (a == 2) { int c; // <-- visible inside whole else above. } else { // One couldn't use c here, though. if (b == 3) { } } } } If it's not currently, I'd say that it's the bug. -[Unknown]-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Unknown W. Brackets schrieb am Fri, 10 Jun 2005 10:59:58 -0700:Isn't that the same as: void test() { const int a; int b; static if (a == 3) { // ... } else { if (b == 2) { // ... } } } Which is totally legal...?Ok, a bit more complex: void test() { cont int a; int b; if (b==1){ // ... }else static if(a==2){ // ... int c; }else if(b==3){ // ... } } Can't be rewritten in the same way. c and b are in the same scope but would be in different scopes in the rewrite. Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFCqeDE3w+/yD4P9tIRAsJYAKCD/QWeeuOIXgOAIk7pdGVDn4UTswCfQ0zR rKlVcgTibYPH3trN1A0pGZw= =z3H3 -----END PGP SIGNATURE-----
Jun 10 2005
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Unknown W. Brackets schrieb am Fri, 10 Jun 2005 13:51:00 -0700:Well, imho, that *should* be exactly the same as: void test() { const int a; int b; if (b == 1) { } else // <-- this is the else I'm talking about. { static if (a == 2) { int c; // <-- visible inside whole else above. } else { // One couldn't use c here, though. if (b == 3) { } } }b+=c;} If it's not currently, I'd say that it's the bug.Now add "b+=c;" to the end. Before the rewrite b and c were declared in the same scope. After the rewrite b and c are declared in different scopes. Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFCqgFm3w+/yD4P9tIRAg3lAKCJdhpKjjLELy2oCvmxcLtYymwDKQCgxZ9g g2X6c3SvzLTvJXIvkAOMmF4= =xXMq -----END PGP SIGNATURE-----
Jun 10 2005
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Thomas Kuehne schrieb am Fri, 10 Jun 2005 23:08:54 +0200:Unknown W. Brackets schrieb am Fri, 10 Jun 2005 13:51:00 -0700:Allright, the scopeless "static if" can be a bit confusing at first. Remove the brackets A and B and everything turns legal and documented. Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFCqgan3w+/yD4P9tIRAqE1AJ9uEdyJ6mNaDVoATcQ/8Nx5hVlkSwCfRjl2 SYtOdJSv5ZQRpkxaVv1hWb4= =4A/d -----END PGP SIGNATURE-----Well, imho, that *should* be exactly the same as: void test() { const int a; int b; if (b == 1) { } else // <-- this is the else I'm talking about. // **A** { static if (a == 2) { int c; // <-- visible inside whole else above. } else { // One couldn't use c here, though. if (b == 3) { } } // **B** }b+=c;} If it's not currently, I'd say that it's the bug.Now add "b+=c;" to the end. Before the rewrite b and c were declared in the same scope. After the rewrite b and c are declared in different scopes.
Jun 10 2005
Thomas Kuehne wrote:-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Thomas Kuehne schrieb am Fri, 10 Jun 2005 23:08:54 +0200:<snip> Legal? The outermost else block is of a normal if, not a static if, and therefore it creates a scope. Why should whether the body is a BlockStatement or not make a difference? It makes no sense, since whether or not c is declared would depend at runtime on whether b == 1. Documented? Where? Stewart. -- My e-mail is valid but not my primary mailbox. Please keep replies on the 'group where everyone may benefit.Unknown W. Brackets schrieb am Fri, 10 Jun 2005 13:51:00 -0700:Allright, the scopeless "static if" can be a bit confusing at first. Remove the brackets A and B and everything turns legal and documented.Well, imho, that *should* be exactly the same as: void test() { const int a; int b; if (b == 1) { } else // <-- this is the else I'm talking about. // **A** { static if (a == 2) { int c; // <-- visible inside whole else above. } else { // One couldn't use c here, though. if (b == 3) { } } // **B** }b+=c;} If it's not currently, I'd say that it's the bug.Now add "b+=c;" to the end. Before the rewrite b and c were declared in the same scope. After the rewrite b and c are declared in different scopes.
Jun 14 2005
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Stewart Gordon schrieb am Tue, 14 Jun 2005 10:43:04 +0100:Thomas Kuehne wrote:"if" and "else if" open new scopes. "static if" and "else static if" don't open new scopes. { // scope:1 if(a) // scope:1.2 ... else if(b) // scope:1.3 ... else static if(c) // scope:1 ... else // scope:1.4 ... } Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFCsxAX3w+/yD4P9tIRAoa6AJ98andjl0cxgPqTGzSYYHEI0TpmhQCdFCB0 K+ZEm6zUKVvuEJ5/g6BdOXQ= =0x5q -----END PGP SIGNATURE----------BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Thomas Kuehne schrieb am Fri, 10 Jun 2005 23:08:54 +0200:<snip> Legal? The outermost else block is of a normal if, not a static if, and therefore it creates a scope. Why should whether the body is a BlockStatement or not make a difference? It makes no sense, since whether or not c is declared would depend at runtime on whether b == 1. Documented? Where?Unknown W. Brackets schrieb am Fri, 10 Jun 2005 13:51:00 -0700:Allright, the scopeless "static if" can be a bit confusing at first. Remove the brackets A and B and everything turns legal and documented.Well, imho, that *should* be exactly the same as: void test() { const int a; int b; if (b == 1) { } else // <-- this is the else I'm talking about. // **A** { static if (a == 2) { int c; // <-- visible inside whole else above. } else { // One couldn't use c here, though. if (b == 3) { } } // **B** }b+=c;} If it's not currently, I'd say that it's the bug.Now add "b+=c;" to the end. Before the rewrite b and c were declared in the same scope. After the rewrite b and c are declared in different scopes.
Jun 17 2005
Thomas Kuehne wrote: <snip>"if" and "else if" open new scopes. "static if" and "else static if" don't open new scopes. { // scope:1 if(a) // scope:1.2 ... else if(b) // scope:1.3 ... else static if(c) // scope:1 ... else // scope:1.4 ... }Not quite: (a) the 'else' in 'else static if' above belongs to the non-static if above it, and so the 'else' itself opens a scope. (b) the final 'else' belongs to a 'static if', so it doesn't create a scope. So in fact, it's like this { // scope:1 if(a) // scope:1.1 ... else // scope:1.2 if(b) // scope:1.2.1 ... else // scope:1.2.2 static if(c) // scope:1.2.2 ... else // scope:1.2.2 ... } When you have 'else if', you can pretend that the scope just inside the 'else' doesn't exist, as long as you don't try to mix static and non-static ifs at the same indentation level. Thus { // scope:1 if(a) // scope:1.1 ... else if(b) // scope:1.2 ... else // scope:1.3 static if(c) // scope:1.3 ... else // scope:1.3 ... } Stewart. -- My e-mail is valid but not my primary mailbox. Please keep replies on the 'group where everyone may benefit.
Jun 20 2005
On Mon, 20 Jun 2005 10:28:07 +0100, Stewart Gordon wrote:Thomas Kuehne wrote: <snip>The more that I see 'static if', the more I think it is really dumb. Not the concept, which is just great, but the syntax. It is almost like it was purposefully designed to be as confusing and obscure as possible. I would argue that a *single* token for 'static if' and another for 'static else' would make it much easier to use. Some token names that indicate a compile-time action would be useful too. -- Derek Parnell Melbourne, Australia 20/06/2005 9:00:23 PM"if" and "else if" open new scopes. "static if" and "else static if" don't open new scopes. { // scope:1 if(a) // scope:1.2 ... else if(b) // scope:1.3 ... else static if(c) // scope:1 ... else // scope:1.4 ... }Not quite: (a) the 'else' in 'else static if' above belongs to the non-static if above it, and so the 'else' itself opens a scope. (b) the final 'else' belongs to a 'static if', so it doesn't create a scope. So in fact, it's like this { // scope:1 if(a) // scope:1.1 ... else // scope:1.2 if(b) // scope:1.2.1 ... else // scope:1.2.2 static if(c) // scope:1.2.2 ... else // scope:1.2.2 ... } When you have 'else if', you can pretend that the scope just inside the 'else' doesn't exist, as long as you don't try to mix static and non-static ifs at the same indentation level. Thus { // scope:1 if(a) // scope:1.1 ... else if(b) // scope:1.2 ... else // scope:1.3 static if(c) // scope:1.3 ... else // scope:1.3 ... } Stewart.
Jun 20 2005
What about version else then? Or, I guess, versionelse :P. Personally, I like else just fine, and I think the syntax is very understandable. I guess it's all about how you lay it out, and how you think about it. To me, else means just that - it's not a part of if, to me, but rather... "else". -[Unknown]On Mon, 20 Jun 2005 10:28:07 +0100, Stewart Gordon wrote:Thomas Kuehne wrote: <snip>The more that I see 'static if', the more I think it is really dumb. Not the concept, which is just great, but the syntax. It is almost like it was purposefully designed to be as confusing and obscure as possible. I would argue that a *single* token for 'static if' and another for 'static else' would make it much easier to use. Some token names that indicate a compile-time action would be useful too."if" and "else if" open new scopes. "static if" and "else static if" don't open new scopes. { // scope:1 if(a) // scope:1.2 ... else if(b) // scope:1.3 ... else static if(c) // scope:1 ... else // scope:1.4 ... }Not quite: (a) the 'else' in 'else static if' above belongs to the non-static if above it, and so the 'else' itself opens a scope. (b) the final 'else' belongs to a 'static if', so it doesn't create a scope. So in fact, it's like this { // scope:1 if(a) // scope:1.1 ... else // scope:1.2 if(b) // scope:1.2.1 ... else // scope:1.2.2 static if(c) // scope:1.2.2 ... else // scope:1.2.2 ... } When you have 'else if', you can pretend that the scope just inside the 'else' doesn't exist, as long as you don't try to mix static and non-static ifs at the same indentation level. Thus { // scope:1 if(a) // scope:1.1 ... else if(b) // scope:1.2 ... else // scope:1.3 static if(c) // scope:1.3 ... else // scope:1.3 ... } Stewart.
Jun 20 2005
Apparently not, as you can see in d.D.announce under the dmd.126 announcement, I was having trouble with 'else if' vs 'static else if', and you can see the difference with the sample code I attached (my last example, I posted the wrong one at first). Unknown W. Brackets wrote:Isn't that the same as: void test() { const int a; int b; static if (a == 3) { // ... } else { if (b == 2) { // ... } } } Which is totally legal...? -[Unknown]-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Is the following code legal, illegal or undefined? void test(){ const int a; int b; static if(a==3){ ... } else if(b==2){ ... } } http://dstress.kuehne.cn/undefined/static_if_05_A.d http://dstress.kuehne.cn/undefined/static_if_05_B.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFCqczs3w+/yD4P9tIRAo6kAJwOP8qYWovTFgJWhWLx+ZLlo5K4ygCgnplj vS8vTWaFfxXNFUKdTIkhJaY= =LdZW -----END PGP SIGNATURE-----
Jun 10 2005
No, there's no bug. It's well defined. static-if-else is a *completely different* statement than if-else. It might make more sense to if you replace "static if(a == 3)" with "version (identifier)", as version-else and static-if-else are very analogous in their behavior.
Jun 10 2005
Thomas Kuehne wrote:-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Is the following code legal, illegal or undefined? void test(){ const int a;<snip> Good question. Should it be legal to declare a const without a value? Stewart. -- My e-mail is valid but not my primary mailbox. Please keep replies on the 'group where everyone may benefit.
Jun 14 2005
"Stewart Gordon" <smjg_1998 yahoo.com> wrote in message news:d8mag8$p52$1 digitaldaemon.com...Thomas Kuehne wrote:Sure. It gets set to the default initializer for the type.-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Is the following code legal, illegal or undefined? void test(){ const int a;<snip> Good question. Should it be legal to declare a const without a value?
Jun 14 2005