<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>