[PATCH] D10732: [OPENMP 4.0] Initial support for array sections.
Alexey Bataev
a.bataev at hotmail.com
Thu Jul 23 03:40:41 PDT 2015
ABataev added a comment.
Richard, thanks for the review!
================
Comment at: include/clang/AST/Expr.h:2146
@@ -2145,1 +2145,3 @@
+/// \brief OpenMP 4.0 [2.4, Array Sections].
+/// To specify an array section in an OpenMP construct, array subscript
----------------
rsmith wrote:
> Have you considered starting an ExprOpenMP.h for OpenMP expressions?
Ok, moved it to ExprOpenMP.h
================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:4915-4916
@@ +4914,4 @@
+ "section of pointer to incomplete type %0">;
+def err_section_negative : Error<
+ "section %select{lower bound|length}0 is evaluated to a negative value">;
+def err_section_length_undefined : Error<
----------------
rsmith wrote:
> "section %select{...} evaluated to negative value %1"?
Fixed
================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:4918
@@ +4917,3 @@
+def err_section_length_undefined : Error<
+ "section length is undefined, but subscripted value is not a sized array">;
+
----------------
rsmith wrote:
> undefined -> unspecified
>
> sized array -> array
>
> (Can you take a section on a VLA? There doesn't seem to be any obvious reason why not, since presumably you could construct the VLA type [old_bound - start] as the result.)
Fixed
================
Comment at: lib/Sema/SemaChecking.cpp:8469-8475
@@ -8464,2 +8468,9 @@
}
+ case Stmt::ArraySectionExprClass: {
+ const ArraySectionExpr *ASE = cast<ArraySectionExpr>(expr);
+ if (ASE->getLowerBound())
+ CheckArrayAccess(ASE->getBase(), ASE->getLowerBound(),
+ /**ASE=*/nullptr, AllowOnePastEnd > 0);
+ return;
+ }
case Stmt::UnaryOperatorClass: {
----------------
rsmith wrote:
> Can you also check the end of the section here?
Ok, added
================
Comment at: lib/Sema/SemaExpr.cpp:3973-3978
@@ -3945,1 +3972,8 @@
Expr *idx, SourceLocation rbLoc) {
+ if (isArraySectionType(base->IgnoreImpCasts()->getType()))
+ return ActOnArraySectionExpr(S, base, lbLoc, idx, SourceLocation(),
+ /*Length=*/nullptr, rbLoc);
+ else if (isArraySectionType(idx->IgnoreImpCasts()->getType()))
+ return ActOnArraySectionExpr(S, idx, lbLoc, base, SourceLocation(),
+ /*Length=*/nullptr, rbLoc);
+
----------------
rsmith wrote:
> What should happen here:
>
> int x[5];
> int y[10];
> (b ? x : y[5:])[3]
>
> ? Or here:
>
> int x[5][5];
> (+x[2:])[2]
Here we should get error messages. Reworked it to allow array sections only in base part.
================
Comment at: lib/Sema/SemaExpr.cpp:4119
@@ +4118,3 @@
+ // OpenMP 4.0, [2.4 Array Sections]
+ // The lower-bound and length must evaluate to non-negative integers.
+ if (LowerBoundValue.isNegative()) {
----------------
rsmith wrote:
> Is this a constraint, or is this semantics? (Are these bounds required to be ICEs?)
Bounds are not required to be ICEs. But if they are ICEs we must check that all these values are non-negative
http://reviews.llvm.org/D10732
More information about the cfe-commits
mailing list