[Issue 11206] static array can be implicitly built from items, when nested in aggregate

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Oct 9 09:38:01 PDT 2013


http://d.puremagic.com/issues/show_bug.cgi?id=11206



--- Comment #3 from Maxim Fomin <maxim at maxim-fomin.ru> 2013-10-09 09:38:00 PDT ---
(In reply to comment #2)
> (In reply to comment #1)
> > So, what?
> > 
> > Basically you are complainig about:
> > 
> > import std.stdio;
> > 
> > struct AGG
> > {
> >     int[1] t;
> >     double d;
> > }
> > 
> > void main()
> > {
> >     AGG tarr2 = AGG(1); 
> >     writeln(tarr2);
> > }
> > 
> > which prints AGG([1], nan).
> 
> ...Unsure what you are trying to show? the "AGG(1)".

actually the AGG([1], nan) to show struct literal behavior.

> > AGG(1) is a struct literal which is valid in D.
> 
> I'm arguing that AGG should not be constructible taking a 1.

That's clear, but if you want to break the language you need to consider
writing to newsgroup. Silent language change based on some issue in bugzilla is
evil.

> > Integer literal is a valid
> > initializer for static array. Statement "AGG!S ts1 = AGG!S(1);" is rejected
> > because (unfortunately) 1 is not convertible to struct.
> 
> Yes, integer is a valid initializer for a static array, and it is also a valid
> initializer for a struct that holds an int.

Right.

> 
> However, 1 is not convertible to a struct, 

Right. It is sad fact but in this context it is irrelevant because in the
example there is no conversion from 1 to struct, there is struct literal with
partial initializer which match initializer for first field.

> not is it convertible to a static array.

Wrong. int[1] ai = 1; ai = 1; is fine with the language so far. However in this
case we speak about struct initializer so having integer literal to be
initializer for static integer array is sufficient.

> AGG(1) should not compile, because 1 is not convertible to
> typeof(AGG.tupleof[0]);

Please refer to the spec or argue if spec is incomplete for a particular case.
Making up rules is not good. Adressing your point - this is incorrect because
typeof(AGG.tupleof[0]) has type int[1] and initializaing or assigning 1 to
int[1] is legal in D. I deliberatly unwrapped all templates to show that you
are effectivelly protesting against int[1] = 1; 

> What's happening is an implicit *construction* of a static array, in a context
> where implicit construction is not allowed.

This is not the case. Here is struct literal with partial list of initializers
which match respective type initializers which is fine as far D is concern. If
you are complaining because this breaks some assumption of a brilliant phobos
ideom, this should be mentioned explicitly so some solution without damaging
language can be found (personally I object to break the language for the sake
of writing cute template in phobos).  

Please don't reopen issue: CLOSED->REOPENED->CLOSED war is not good either.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list