<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Dec 12, 2012, at 11:45 PM, <a href="mailto:endlessroad1991@gmail.com">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">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>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>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>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>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>2b.ii. _declspec(property) int *x[] and foo.x[0][1]?</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>2c.ii. For that matter, given _declspec(property) int x[], is (foo.x)[0] legal at all?</div><div>2d. Given _declspec(property) int x[][], can you use fewer subscripts than that? Can you still use more?</div><div>2e. Just to verify, what happens if you subscript _declspec(property) int x;? (no brackets at all)</div><div>3. Are there restrictions on the element type?</div><div>3a. Can it be a reference?</div><div>3b. Can it be a bounded array type? (_declspec(property) int x[][10])</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>3d. Do parens in the declarator affect any of this?</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>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>4d. Are the index types in the accessors limited in some way, or can they be e.g. arbitrary class types?</div><div><br></div><div>I'm sure we can find more questions. :)</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>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><div><br></div><div>John.</div></div></body></html>