[prev in list] [next in list] [prev in thread] [next in thread]
List: cfe-commits
Subject: Re: [PATCH] D10732: [OPENMP 4.0] Initial support for array sections.
From: Alexey Bataev via cfe-commits <cfe-commits () lists ! llvm ! org>
Date: 2015-08-24 17:45:30
Message-ID: 32dd8d4305247ccd72df0319d67e44e3 () localhost ! localdomain
[Download RAW message or body]
ABataev marked 15 inline comments as done.
ABataev added a comment.
Richard, thanks for the review!
================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:7680
@@ +7679,3 @@
+def err_omp_section_length_undefined : Error<
+ "section length is unspecified, but subscripted value is not an array">;
+
----------------
rsmith wrote:
> How about "section length is unspecified and cannot be inferred because subscripted \
> value is not an array"?
> Presumably there should also be an error for "section length is unspecified and \
> cannot be inferred because subscripted value is an array of unknown bound"?
Done.
================
Comment at: lib/AST/ASTContext.cpp:1046-1047
@@ -1045,1 +1045,4 @@
+ // Placeholder type for OMP array sections.
+ InitBuiltinType(OMPArraySectionTy, BuiltinType::OMPArraySection);
+
----------------
rsmith wrote:
> Condition this behind `if (LangOpts.OpenMP)`.
Done, thanks
================
Comment at: lib/AST/Stmt.cpp:18
@@ -17,2 +17,3 @@
#include "clang/AST/ExprObjC.h"
+#include "clang/AST/ExprOpenMP.h"
#include "clang/AST/Stmt.h"
----------------
rsmith wrote:
> This appears to be unused?
No, this one is required for getStmtInfoTableEntry(), check_implementations() and \
others.
================
Comment at: lib/Sema/SemaExpr.cpp:4001-4004
@@ +4000,6 @@
+ unsigned ArraySectionCount = 0;
+ while (auto *OASE = dyn_cast<OMPArraySectionExpr>(Base)) {
+ Base = OASE->getBase();
+ ++ArraySectionCount;
+ }
+ auto OriginalTy = Base->getType();
----------------
rsmith wrote:
> Should you `IgnoreParens()` here?
Yes, added.
================
Comment at: lib/Sema/SemaExpr.cpp:4006
@@ +4005,3 @@
+ auto OriginalTy = Base->getType();
+ for (unsigned i = 0; i < ArraySectionCount; ++i) {
+ if (OriginalTy->isAnyPointerType())
----------------
rsmith wrote:
> Please either consistently capitalize (per prevailing style in this file), or do \
> not capitalize (per new LLVM coding style), your local variables; don't mix and \
> match.
Fixed, thanks.
================
Comment at: lib/Sema/SemaExpr.cpp:4017
@@ +4016,3 @@
+
+ExprResult Sema::ActOnOMPArraySectionExpr(Scope *S, Expr *Base,
+ SourceLocation LBLoc,
----------------
rsmith wrote:
> I don't think you should need a `Scope` here; you shouldn't be performing any \
> unqualified lookups while handling this expression.
Removed
================
Comment at: lib/Sema/SemaExpr.cpp:4072
@@ +4071,3 @@
+ if (LowerBound) {
+ if (!LowerBound->getType()->isIntegerType())
+ return ExprError(Diag(LowerBound->getExprLoc(),
----------------
rsmith wrote:
> This should presumably follow the rules for the underlying language. In particular, \
> in C++, we should try to contextually implicitly convert to an integral type -- see \
> `Sema::PerformContextualImplicitConversion`).
Done.
================
Comment at: lib/Sema/SemaExpr.cpp:4110
@@ +4109,3 @@
+ llvm::APSInt LowerBoundValue;
+ if (LowerBound->EvaluateAsInt(LowerBoundValue, Context)) {
+ // OpenMP 4.0, [2.4 Array Sections]
----------------
rsmith wrote:
> Same comment here as before: using constant folding to drive an error is not OK; \
> you should only error here if the expression is an ICE.
Well, that is exactly what I'm doing here. I'm checking that this an ICE and only if \
LowerBound is ICE I'm checking its constraints. EvaluateAsInt() does not emit any \
errors if LowerBound is not ICE.
================
Comment at: lib/Sema/SemaExpr.cpp:4112
@@ +4111,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 a semantic rule? (Are we required to reject it, are we \
> permitted to reject it, or is a violation just UB?)
We are permitted to reject it.
================
Comment at: lib/Sema/SemaExpr.cpp:4146-4154
@@ +4145,11 @@
+ if (!LengthExpr) {
+ if (ColonLoc.isInvalid()) {
+ LengthExpr = ActOnIntegerConstant(SourceLocation(), /*Val=*/1).get();
+ } else {
+ if (auto *CAT =
+ dyn_cast<ConstantArrayType>(OriginalTy->getAsArrayTypeUnsafe())) {
+ llvm::APInt SizeVal = CAT->getSize();
+ LengthExpr = IntegerLiteral::Create(Context, SizeVal,
+ Context.getIntPtrType(), RBLoc);
+ } else {
+ auto *VAT = cast<VariableArrayType>(OriginalTy->getAsArrayTypeUnsafe());
----------------
rsmith wrote:
> I'm not particularly happy about fabricating an expression here, especially one \
> with an invalid location. Maybe instead store a null `LengthExpr` in this case and \
> provide accessors on your AST node to determine whether it's an implicit 1-element \
> section or an implicit to-the-end section (maybe based on whether \
> `ColonLoc.isValid()`).
Ok, I'll remove all implicit expressions here and below and will build them in \
codegen.
http://reviews.llvm.org/D10732
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic