<div class="gmail_extra"><br><br></div><div class="gmail_quote">On Thu, Dec 13, 2012 at 4:23 PM, John McCall <span dir="ltr"><<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid"><div><div><div><div>On Dec 12, 2012, at 11:45 PM, <a href="mailto:endlessroad1991@gmail.com" target="_blank">endlessroad1991@gmail.com</a> wrote:</div>

<blockquote type="cite"><div>Thanks, that's a very detailed and thorough comment.</div><div> </div><div>MSDN page for __declspec(property): <a href="http://msdn.microsoft.com/en-us/library/yhfk0thd.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/yhfk0thd.aspx</a></div>


<div>we can declare "array-like" property:</div><div>        __declspec(property(get=GetX, put=PutX)) int x[][];</div><div>and access it with indices:</div><div>        var = obj->x[expr1][expr2];</div><div>

it will be translated into:</div>
<div>        var = obj->GetX(expr1, expr2);</div><div> </div><div>And that's what "ParamCount" in "PropertyAttr" is for.</div><div>We don't know how many params until we parse to "int x[][]", so we have to modify the Attr when we get here.</div>

</blockquote><div><br></div></div><div>That documentation says you can declare this as "int x[]" and it permits an arbitrary amount of subscripts, but apparently you can *also* add multiple []s.  It would be good to understand the requirements and limitations of this language feature as implemented in MSVC.  In particular:</div>

<div><br></div><div>1.  Can you directly template these declarations? (template <class T> _declspec(property) T foo;)</div></div></div></blockquote><div>No </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>1a.  Are any of the following answers different if T is dependent, and if so, are those likely to be bugs or actually intended?</div><div>1b.  What if you have template <class T> struct A { _declspec(property) T foo; }; and then instantiate the template at T=int[]?</div>

</div></div></blockquote><div>Yes, this works fine. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>2.  What's the relationship between []s and the number of indices?</div><div>2a.  Given _declspec(property) int x[], can you in fact use multiple indices with it, like foo.x[2][3]?</div></div></div></blockquote>

<div>No </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid"><div><div><div>2b.  If so, what happens if the "element type" is itself subscriptable?</div>

<div>2b.i. _declspec(property) std::vector<int> x[] and foo.x[0][1]?</div></div></div></blockquote><div>No </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>2b.ii. _declspec(property) int *x[] and foo.x[0][1]?</div></div></div></blockquote><div><div>Yes, this works fine. </div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>2c.  Do parentheses change these answers at all?</div><div>2c.i. _declspec(property) int* x[] and (foo.x[0])[1]?</div></div></div></blockquote><div><div>Yes, this works fine.  </div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>2c.ii. For that matter, given _declspec(property) int x[], is (foo.x)[0] legal at all?</div></div></div></blockquote><div><div>Yes, this works fine.  </div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>2d.  Given _declspec(property) int x[][], can you use fewer subscripts than that?  Can you still use more?</div></div></div></blockquote><div>Answer for both questions is NO. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>2e.  Just to verify, what happens if you subscript _declspec(property) int x;?  (no brackets at all)</div></div></div></blockquote><div>No </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>3.  Are there restrictions on the element type?</div><div>3a.  Can it be a reference?</div></div></div></blockquote><div>Yes </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>3b.  Can it be a bounded array type?  (_declspec(property) int x[][10])</div></div></div></blockquote><div>No. Seems that whatever you put in the brackets will be ignored, and treated as a param to getter/setter. </div>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid"><div><div><div>3c.  Can it be an unbounded array type if you use, e.g., a typedef?  (typedef int intarr[]; _declspec(property) intarr x;, or intarr x[] for that matter.)  Does this change the behavior of subscripting?</div>

</div></div></blockquote><div>Surprisingly, in this situation, the [] in intarr is still interpreted as a param to getter/setter. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>3d.  Do parens in the declarator affect any of this?</div></div></div></blockquote><div>No </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>4.  What exactly does the element type do there?  Is it just for type-checking the property against the accessors?</div><div>4a.  I'd been assuming that the accessors were selected by overload resolution at access time using the name given/inferred in the property attribute.  Is this not true?  Are they selected/filtered by initial type-checking somehow?</div>

</div></div></blockquote><div>It is true. You can define "T GetV(int, int)" and "T GetV(double, double)". And getter will choose the best match like normal overload functions.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>4b.  Is access control checked on the accessors from the declaration point of the property or from the use point?</div><div>4c.  Can the accessors be inherited from base classes?  Are normal ambiguity controls enforced?  Can you scope-qualify the accessor names, e.g. get=Base1::getElt?</div>

</div></div></blockquote><div>Inherit: yes. Ambiguity: yes. Scope-quailify: No, seems that there can only be one identifier after get= or put=. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div>4d.  Are the index types in the accessors limited in some way, or can they be e.g. arbitrary class types?</div></div></div></blockquote><div>They can be arbitary types. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div><div><br></div><div>I'm sure we can find more questions. :)</div><div><div><br></div><blockquote type="cite"><div>Considering this situation, is it still possible to do it in your suggested way?</div>
</blockquote><div><br></div></div><div>Sure, that's not really a problem.  One very important thing — something I seem to have unconscionably forgotten put in my initial review — is that this is way, way more than just a property on a FieldDecl;  this really needs to be some new kind of Decl, probably named MSPropertyDecl.  That node would then be a reasonable place to stash things like the expected (minimum?) number of indices and any other important information from type-checking the declaration, e.g. the possibly-filtered lookup results.  You'll probably need to recognize the presence of the attribute in the parser and enter into a completely different Sema entrypoint, kindof like how the 'friend' keyword does.</div>

<span><font color="#888888"><div><br></div><div>John.</div></font></span></div></div></blockquote></div><div class="gmail_extra"><br> </div><div class="gmail_extra">Based on answers of these questions, let's guess how VC implements property.</div>

<div class="gmail_extra">I think the design principle for them is, reuse existing compiler code as much as possible, and make the solution as simple as possible.</div><div class="gmail_extra">Here are my opinions:</div><div class="gmail_extra">

1. Any [], [10], or [] that comes from typedef, is treated as a param to getter/setter. Hence, they lose their origin semantics meaning.</div><div class="gmail_extra">2. For accessors, they will be translated into getter/setter.</div>

<div class="gmail_extra">    i. property can be private, as long as getter/setter is public, they work well.</div><div class="gmail_extra">    ii. getter/setter will be chosen like any normal overloaded functions.</div><div class="gmail_extra">

3. property are treated like normal members. So they can be inherited, and have ambiguity problem when a class has multiple base classes.</div><div class="gmail_extra">The only problem here, is when the element type is subscriptable itself.</div>
<div class="gmail_extra">    i. When it's pointer type, subscripting the property works as expected.</div><div class="gmail_extra">    ii. When it's class type which has overwritten operator[] (no matter vector or self-defined class),  subscripting the property doesn't compile.</div>
<div class="gmail_extra">I can't guess why this happens.<br clear="all"><br>-- <br>Best Regards, Tong Shen (沈彤)<br>

</div>