ABataev marked 4 inline comments as done.
ABataev added a comment.

In D74144#1941971 <https://reviews.llvm.org/D74144#1941971>, @rjmccall wrote:

> Okay, so these array-shaping expressions are only allowed as operands to 
> specific OpenMP directives?  That's a plausible interpretation of "The 
> shape-operator can appear only in clauses where it is explicitly allowed" 
> from the spec <https://www.openmp.org/spec-html/5.0/openmpsu20.html>.  If it 
> were a more general l-value expression, we could handle that just fine by 
> building the type using `ConstantArrayType`/`VariableArrayType` as 
> appropriate; but if the language intentionally restricts it, the placeholder 
> approach seems fine.


Hi John, thanks for the review!
Yes, this is not a general form of the expression, it is allowed only in a 
couple of clauses.
We cannot build an array type since this expression does not represent a 
supported array type. Sizes may be non-constant anywhere in the operation, 
variable array type does not support it. It requires extending of the variable 
array types but actually it does not worth a try, since this type is not needed 
at all.



================
Comment at: clang/lib/Sema/SemaExpr.cpp:4748
+       Base->isInstantiationDependent() ||
+       Base->containsUnexpandedParameterPack()))
+    return OMPArrayShapingExpr::Create(Context, Context.DependentTy, Base,
----------------
rjmccall wrote:
> Just check `isTypeDependent()`, none of these other conditions should 
> interfere with type-checking.
Ok, will do.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:4751
+                                       LParenLoc, RParenLoc, Dims, Brackets);
+  if (!BaseTy->isAnyPointerType())
+    return ExprError(Diag(Base->getExprLoc(),
----------------
rjmccall wrote:
> I think you should perform DefaultFunctionArrayLvalueConversion here so that 
> e.g. arrays will decay to pointers, you load pointers from l-values, and so 
> on.  If you do so, it'll handle placeholders for you.
> 
> Do you really want to allow this to operate on non-C pointer types?
1. Standard clearly states that the type of the base expression must be a 
pointer. I don't think that we should perform implicit type casting here, like 
decay to pointers, etc.
2. It is just a simple form of checking that this is a pointer type. Since this 
expression is not allowed in other languages (and I filter it out at the 
parsing stage), I think it is ok to use the generic form of type checking.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:4758
+  for (Expr *Dim : Dims) {
+    if (Dim->getType()->isNonOverloadPlaceholderType()) {
+      ExprResult Result = CheckPlaceholderExpr(Dim);
----------------
rjmccall wrote:
> I think overload placeholders need to be resolved here, too.  You may have 
> copied this code from some different place that has the ability to resolve 
> overloads later, but in this case that's not true.
No, YouCompleteMe suggested the wrong function and I just missed it. Will fix 
it, thanks!


================
Comment at: clang/lib/Sema/SemaExpr.cpp:4771
+    }
+    if (!Dim->isValueDependent() && !Dim->isTypeDependent()) {
+      ExprResult Result =
----------------
rjmccall wrote:
> You don't really care about value-dependence here, just type-dependence.  You 
> can check value-dependence before doing the constant-evaluation check below.
Yes, just a double check to be realy-really sure :)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74144/new/

https://reviews.llvm.org/D74144



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to