[Issue 1594] version not honored for invarient declaration

Bill Baxter dnewsgroup at billbaxter.com
Fri Oct 19 12:26:33 PDT 2007


John Mandeville wrote:
> d-bugmail at puremagic.com Wrote:
> 
>> I know its not intuitive but the compiler is behaving correctly. All the code
>> inside a version block must be valid code for the compiler you are using.
>>
>> Here is how you need to do what you want to achieve...
>>
>> version(D_Version2)
>> {
>>         string str = "Version 2";
>>         mixin("invariant int myint = 2;");
>> }
>>
>> else
>> {
>>         string str = "Version 1";
>>         const int myint = 1;
>> }
> 
> Hmmmm.  The following would also work:
> 
> version (D_Version2)
> {
> 	mixin( "alias invariant int invarInt;" );
> 	invarInt myint = 2;
> }
> 
> Unfortunately, this does not work:
> 
> version (D_Version2)
> {
> 	mixin( "alias invariant int invarInt;" );
> }
> else
> {
> 	alias const int invarInt;
> }
> 
> Neither v.1 nor v. 2 likes alias of const.  (I can't figure out why neither likes alias of const but v. 2 likes alias of invariant.  const is a storage class, not a type modifier; but then, I  presume, the same is true for invariant in v. 2.)
> 
> Could an invariant storage class be added to version 1 that is just equivalent 10 const?  We obviously don't want to add a new storage class semantics to version 1--changes to v. 1 at this point should be limited essentially to bug fixes.  However, using the word invariant with const semantics might be a small enough change to be a worthwhile.  It would be a convenience to those trying to develop for version 1 and version 2 sinultaneously.
> 

And make the type constructor flavors no ops in v1 (invariant(char)[] 
--> char[]), and make .idup synonymous with .dup.  These things would go 
a long way to making it easier to support both v1 and v2 of D I think.



More information about the Digitalmars-d-bugs mailing list