digitalmars.D.bugs - typeof(typename) fails silently
- Sean Kelly (10/10) Sep 15 2008 Code like the following:
- Jarrett Billingsley (3/13) Sep 15 2008 Oh but Sean, anything illegal inside an is() expression doesn't give an ...
- BCS (3/26) Sep 15 2008 That includes things like import("file") can't find the file
- Sean Kelly (8/24) Sep 15 2008 Technically untrue. An 'is' expression must contain a type. ie. you
- Sean Kelly (5/28) Sep 15 2008 Darnit, I take it back. I suppose it's possible that the symbol passed ...
- Jarrett Billingsley (10/20) Sep 15 2008 Conversation Update kicked in halfway through my construction of just
- Sean Kelly (9/32) Sep 15 2008 I'm of two minds on this. The is expression already requires whatever
- BCS (3/11) Sep 16 2008 is(T) || is(typeof(T))
- Denis Koroskin (12/23) Sep 16 2008 template isType(T)
- Jarrett Billingsley (2/31) Sep 16 2008 D2 only.
- Sean Kelly (4/17) Sep 16 2008 Technically, the tests would have to be reversed, but yeah, that would
- Bruno Medeiros (8/38) Sep 19 2008 Could be a type, could be a value... and could be neither, like a
Code like the following: static if(is(typeof(int))) { pragma(msg, "hi"); } used to work just fine (ie. it used to print "hi") even though typeof was being used to evaluate a type. Now apparently the same tests fail, but they do so silently. If typeof isn't supposed to be used to evaluate types, could we _please_ get a compile error about this? I've just discovered that a bunch of Tango code silently stopped working when this change was implemented and it would have been great if the build had simply failed on what is now apparently an illegal operation. Sean
Sep 15 2008
On Mon, Sep 15, 2008 at 7:08 PM, Sean Kelly <sean invisibleduck.org> wrote:Code like the following: static if(is(typeof(int))) { pragma(msg, "hi"); } used to work just fine (ie. it used to print "hi") even though typeof was being used to evaluate a type. Now apparently the same tests fail, but they do so silently. If typeof isn't supposed to be used to evaluate types, could we _please_ get a compile error about this? I've just discovered that a bunch of Tango code silently stopped working when this change was implemented and it would have been great if the build had simply failed on what is now apparently an illegal operation. SeanOh but Sean, anything illegal inside an is() expression doesn't give an error! FUN.
Sep 15 2008
Reply to Jarrett,On Mon, Sep 15, 2008 at 7:08 PM, Sean Kelly <sean invisibleduck.org> wrote:That includes things like import("file") can't find the file Real fun!Code like the following: static if(is(typeof(int))) { pragma(msg, "hi"); } used to work just fine (ie. it used to print "hi") even though typeof was being used to evaluate a type. Now apparently the same tests fail, but they do so silently. If typeof isn't supposed to be used to evaluate types, could we _please_ get a compile error about this? I've just discovered that a bunch of Tango code silently stopped working when this change was implemented and it would have been great if the build had simply failed on what is now apparently an illegal operation. SeanOh but Sean, anything illegal inside an is() expression doesn't give an error! FUN.
Sep 15 2008
Jarrett Billingsley wrote:On Mon, Sep 15, 2008 at 7:08 PM, Sean Kelly <sean invisibleduck.org> wrote:Technically untrue. An 'is' expression must contain a type. ie. you can't do this: is(5) That aside, the contents of an 'is' expression must still be valid D code, and typeof(int) is clearly no longer valid D code. All I'm asking is to be told that my code is invalid. SeanCode like the following: static if(is(typeof(int))) { pragma(msg, "hi"); } used to work just fine (ie. it used to print "hi") even though typeof was being used to evaluate a type. Now apparently the same tests fail, but they do so silently. If typeof isn't supposed to be used to evaluate types, could we _please_ get a compile error about this? I've just discovered that a bunch of Tango code silently stopped working when this change was implemented and it would have been great if the build had simply failed on what is now apparently an illegal operation.Oh but Sean, anything illegal inside an is() expression doesn't give an error!
Sep 15 2008
== Quote from Sean Kelly (sean invisibleduck.org)'s articleJarrett Billingsley wrote:Darnit, I take it back. I suppose it's possible that the symbol passed to typeof within an 'is' expression might be a type and it might be a value. The 'is' expression is just doing what it's supposed to. What a pain :-) SeanOn Mon, Sep 15, 2008 at 7:08 PM, Sean Kelly <sean invisibleduck.org> wrote:Technically untrue. An 'is' expression must contain a type. ie. you can't do this: is(5) That aside, the contents of an 'is' expression must still be valid D code, and typeof(int) is clearly no longer valid D code. All I'm asking is to be told that my code is invalid.Code like the following: static if(is(typeof(int))) { pragma(msg, "hi"); } used to work just fine (ie. it used to print "hi") even though typeof was being used to evaluate a type. Now apparently the same tests fail, but they do so silently. If typeof isn't supposed to be used to evaluate types, could we _please_ get a compile error about this? I've just discovered that a bunch of Tango code silently stopped working when this change was implemented and it would have been great if the build had simply failed on what is now apparently an illegal operation.Oh but Sean, anything illegal inside an is() expression doesn't give an error!
Sep 15 2008
On Mon, Sep 15, 2008 at 9:00 PM, Sean Kelly <sean invisibleduck.org> wrote:== Quote from Sean Kelly (sean invisibleduck.org)'s articleConversation Update kicked in halfway through my construction of just such an example ;) (if you want to get _real_ technical: that's a syntactically invalid is() expression, and should give an error. However the _contents_ of the is() expression may be syntactically valid, but _semantic_ errors simply cause it to evaluate to false (except in a few, buggy cases). And as you've realized, something like typeof(A) may only be semantically invalid, meaning that according to the semantics of is(), should make it evaluate false and not give an error.)Technically untrue. An 'is' expression must contain a type. ie. you can't do this: is(5) That aside, the contents of an 'is' expression must still be valid D code, and typeof(int) is clearly no longer valid D code. All I'm asking is to be told that my code is invalid.Darnit, I take it back. I suppose it's possible that the symbol passed to typeof within an 'is' expression might be a type and it might be a value. The 'is' expression is just doing what it's supposed to. What a pain :-)
Sep 15 2008
Jarrett Billingsley wrote:On Mon, Sep 15, 2008 at 9:00 PM, Sean Kelly <sean invisibleduck.org> wrote:I'm of two minds on this. The is expression already requires whatever it contains to be a type or there will be a compile-time error, but with the change to typeof we no longer have a bullet-proof way of ensuring that something is a type. So either we use is(T) and hope T is a type or use is(typeof(T)) and hope T is not a type (because if T is a type then the condition will silently fail). Neither is ideal, for obvious reasons. Sean== Quote from Sean Kelly (sean invisibleduck.org)'s articleConversation Update kicked in halfway through my construction of just such an example ;) (if you want to get _real_ technical: that's a syntactically invalid is() expression, and should give an error. However the _contents_ of the is() expression may be syntactically valid, but _semantic_ errors simply cause it to evaluate to false (except in a few, buggy cases). And as you've realized, something like typeof(A) may only be semantically invalid, meaning that according to the semantics of is(), should make it evaluate false and not give an error.)Technically untrue. An 'is' expression must contain a type. ie. you can't do this: is(5) That aside, the contents of an 'is' expression must still be valid D code, and typeof(int) is clearly no longer valid D code. All I'm asking is to be told that my code is invalid.Darnit, I take it back. I suppose it's possible that the symbol passed to typeof within an 'is' expression might be a type and it might be a value. The 'is' expression is just doing what it's supposed to. What a pain :-)
Sep 15 2008
Reply to Sean,I'm of two minds on this. The is expression already requires whatever it contains to be a type or there will be a compile-time error, but with the change to typeof we no longer have a bullet-proof way of ensuring that something is a type. So either we use is(T) and hope T is a type or use is(typeof(T)) and hope T is not a type (because if T is a type then the condition will silently fail). Neither is ideal, for obvious reasons.is(T) || is(typeof(T)) ??
Sep 16 2008
On Tue, 16 Sep 2008 22:43:08 +0400, BCS <ao pathlink.com> wrote:Reply to Sean,template isType(T) { const bool isType = true; } template isType(alias T) { const bool isType = false; } Stdout(isType!(int)); Stdout(isType!(5)); ??I'm of two minds on this. The is expression already requires whatever it contains to be a type or there will be a compile-time error, but with the change to typeof we no longer have a bullet-proof way of ensuring that something is a type. So either we use is(T) and hope T is a type or use is(typeof(T)) and hope T is not a type (because if T is a type then the condition will silently fail). Neither is ideal, for obvious reasons.is(T) || is(typeof(T)) ??
Sep 16 2008
On Tue, Sep 16, 2008 at 6:17 PM, Denis Koroskin <2korden gmail.com> wrote:On Tue, 16 Sep 2008 22:43:08 +0400, BCS <ao pathlink.com> wrote:D2 only.Reply to Sean,template isType(T) { const bool isType = true; } template isType(alias T) { const bool isType = false; } Stdout(isType!(int)); Stdout(isType!(5)); ??I'm of two minds on this. The is expression already requires whatever it contains to be a type or there will be a compile-time error, but with the change to typeof we no longer have a bullet-proof way of ensuring that something is a type. So either we use is(T) and hope T is a type or use is(typeof(T)) and hope T is not a type (because if T is a type then the condition will silently fail). Neither is ideal, for obvious reasons.is(T) || is(typeof(T)) ??
Sep 16 2008
BCS wrote:Reply to Sean,Technically, the tests would have to be reversed, but yeah, that would work. It's just annoying :-) SeanI'm of two minds on this. The is expression already requires whatever it contains to be a type or there will be a compile-time error, but with the change to typeof we no longer have a bullet-proof way of ensuring that something is a type. So either we use is(T) and hope T is a type or use is(typeof(T)) and hope T is not a type (because if T is a type then the condition will silently fail). Neither is ideal, for obvious reasons.is(T) || is(typeof(T))
Sep 16 2008
Sean Kelly wrote:== Quote from Sean Kelly (sean invisibleduck.org)'s articleCould be a type, could be a value... and could be neither, like a non-existent symbol/reference. Super Happy Fun Time! Like Jarrett mentioned, there are lots of semantic errors that evaluate to false, whereas it would probably be much better if they generated an error. -- Bruno Medeiros - Software Developer, MSc. in CS/E graduate http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#DJarrett Billingsley wrote:Darnit, I take it back. I suppose it's possible that the symbol passed to typeof within an 'is' expression might be a type and it might be a value. The 'is' expression is just doing what it's supposed to. What a pain :-) SeanOn Mon, Sep 15, 2008 at 7:08 PM, Sean Kelly <sean invisibleduck.org> wrote:Technically untrue. An 'is' expression must contain a type. ie. you can't do this: is(5) That aside, the contents of an 'is' expression must still be valid D code, and typeof(int) is clearly no longer valid D code. All I'm asking is to be told that my code is invalid.Code like the following: static if(is(typeof(int))) { pragma(msg, "hi"); } used to work just fine (ie. it used to print "hi") even though typeof was being used to evaluate a type. Now apparently the same tests fail, but they do so silently. If typeof isn't supposed to be used to evaluate types, could we _please_ get a compile error about this? I've just discovered that a bunch of Tango code silently stopped working when this change was implemented and it would have been great if the build had simply failed on what is now apparently an illegal operation.Oh but Sean, anything illegal inside an is() expression doesn't give an error!
Sep 19 2008