[PATCH] D13336: [MSVC] 'property' with an empty array in array subscript expression.

John McCall via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 20 11:27:57 PDT 2015


rjmccall added a comment.

Needs more tests.

1. Dependent template instantiation.
2. Non-dependent template instantiation.
3. Indexes which are themselves pseudo-objects.
4. Templated getters and setters.
5. Non-POD by-value argument types.


================
Comment at: include/clang/AST/BuiltinTypes.def:253
@@ -251,1 +252,3 @@
+PLACEHOLDER_TYPE(MSPropertySubscript, MSPropertySubscriptTy)
+
 #ifdef LAST_BUILTIN_TYPE
----------------
Hmm.  I don't think you need a new placeholder type.  These subscripts are still an ordinary pseudo-object; you can load and store at any point.  Instead, you should detect this case by the expression node used, which can either be an ArraySubscriptExpr or a new node if you find it necessary.

================
Comment at: lib/Sema/SemaExpr.cpp:3934
@@ -3921,1 +3933,3 @@
+  if (!IsMSPropertySubscript &&
+      base->getType()->isNonOverloadPlaceholderType()) {
     ExprResult result = CheckPlaceholderExpr(base);
----------------
I think what you should do here is:
1. Detect whether the base type has pseudo-object type.
2. If so, give the pseudo-object code a chance to work on the expression.  In most cases, it will just load; but if the base is an MSPropertyRefExpr of array type, or an ArraySubscriptExpr, it can leave it alone.
3. If the pseudo-object code returned an expression that's still of pseudo-object type, just build an ArraySubscriptExpr of pseudo-object type after you've folded pseudo-objects in the index as well.

================
Comment at: lib/Sema/SemaExpr.cpp:4115
@@ -4097,1 +4114,3 @@
+          BuiltinType::MSPropertySubscript);
+  if (!LHSExp->getType()->getAs<VectorType>() && !IsMSPropertySubscript) {
     ExprResult Result = DefaultFunctionArrayLvalueConversion(LHSExp);
----------------
Placeholders should never get here.

================
Comment at: lib/Sema/SemaPseudoObject.cpp:1458
@@ -1433,4 +1457,3 @@
   }
 
   return S.ActOnCallExpr(S.getCurScope(), GetterExpr.get(),
----------------
Don't modify ArgExprs in buildGet or buildSet; you might need to build both, e.g. when building a compound assignment or inc/dec.

Since you need to copy into a new array anyway, you might as well accumulate them index expressions in stack order and then reverse them when adding them to this array.


http://reviews.llvm.org/D13336





More information about the cfe-commits mailing list