forked from OSchip/llvm-project
Revert "[OPENMP50]Add initial support for OpenMP 5.0 iterator."
This reverts commit f08df464ae
to fix the
bug with serialization support for iterator expression.
This commit is contained in:
parent
1148f004fa
commit
c028472fa1
|
@ -2180,12 +2180,7 @@ enum CXCursorKind {
|
||||||
*/
|
*/
|
||||||
CXCursor_OMPArrayShapingExpr = 150,
|
CXCursor_OMPArrayShapingExpr = 150,
|
||||||
|
|
||||||
/**
|
CXCursor_LastExpr = CXCursor_OMPArrayShapingExpr,
|
||||||
* OpenMP 5.0 [2.1.6 Iterators]
|
|
||||||
*/
|
|
||||||
CXCursor_OMPIteratorExpr = 151,
|
|
||||||
|
|
||||||
CXCursor_LastExpr = CXCursor_OMPIteratorExpr,
|
|
||||||
|
|
||||||
/* Statements */
|
/* Statements */
|
||||||
CXCursor_FirstStmt = 200,
|
CXCursor_FirstStmt = 200,
|
||||||
|
|
|
@ -970,7 +970,7 @@ public:
|
||||||
#include "clang/Basic/OpenCLImageTypes.def"
|
#include "clang/Basic/OpenCLImageTypes.def"
|
||||||
CanQualType OCLSamplerTy, OCLEventTy, OCLClkEventTy;
|
CanQualType OCLSamplerTy, OCLEventTy, OCLClkEventTy;
|
||||||
CanQualType OCLQueueTy, OCLReserveIDTy;
|
CanQualType OCLQueueTy, OCLReserveIDTy;
|
||||||
CanQualType OMPArraySectionTy, OMPArrayShapingTy, OMPIteratorTy;
|
CanQualType OMPArraySectionTy, OMPArrayShapingTy;
|
||||||
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
|
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
|
||||||
CanQualType Id##Ty;
|
CanQualType Id##Ty;
|
||||||
#include "clang/Basic/OpenCLExtensionTypes.def"
|
#include "clang/Basic/OpenCLExtensionTypes.def"
|
||||||
|
|
|
@ -316,11 +316,8 @@ PLACEHOLDER_TYPE(OMPArraySection, OMPArraySectionTy)
|
||||||
// A placeholder type for OpenMP array shaping operation.
|
// A placeholder type for OpenMP array shaping operation.
|
||||||
PLACEHOLDER_TYPE(OMPArrayShaping, OMPArrayShapingTy)
|
PLACEHOLDER_TYPE(OMPArrayShaping, OMPArrayShapingTy)
|
||||||
|
|
||||||
// A placeholder type for OpenMP iterators.
|
|
||||||
PLACEHOLDER_TYPE(OMPIterator, OMPIteratorTy)
|
|
||||||
|
|
||||||
#ifdef LAST_BUILTIN_TYPE
|
#ifdef LAST_BUILTIN_TYPE
|
||||||
LAST_BUILTIN_TYPE(OMPIterator)
|
LAST_BUILTIN_TYPE(OMPArrayShaping)
|
||||||
#undef LAST_BUILTIN_TYPE
|
#undef LAST_BUILTIN_TYPE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,6 @@ class PseudoObjectExpr;
|
||||||
class AtomicExpr;
|
class AtomicExpr;
|
||||||
class OMPArraySectionExpr;
|
class OMPArraySectionExpr;
|
||||||
class OMPArrayShapingExpr;
|
class OMPArrayShapingExpr;
|
||||||
class OMPIteratorExpr;
|
|
||||||
class ObjCArrayLiteral;
|
class ObjCArrayLiteral;
|
||||||
class ObjCDictionaryLiteral;
|
class ObjCDictionaryLiteral;
|
||||||
class ObjCBoxedExpr;
|
class ObjCBoxedExpr;
|
||||||
|
@ -175,7 +174,6 @@ ExprDependence computeDependence(AtomicExpr *E);
|
||||||
|
|
||||||
ExprDependence computeDependence(OMPArraySectionExpr *E);
|
ExprDependence computeDependence(OMPArraySectionExpr *E);
|
||||||
ExprDependence computeDependence(OMPArrayShapingExpr *E);
|
ExprDependence computeDependence(OMPArrayShapingExpr *E);
|
||||||
ExprDependence computeDependence(OMPIteratorExpr *E);
|
|
||||||
|
|
||||||
ExprDependence computeDependence(ObjCArrayLiteral *E);
|
ExprDependence computeDependence(ObjCArrayLiteral *E);
|
||||||
ExprDependence computeDependence(ObjCDictionaryLiteral *E);
|
ExprDependence computeDependence(ObjCDictionaryLiteral *E);
|
||||||
|
|
|
@ -205,173 +205,6 @@ public:
|
||||||
return const_child_range(Begin, Begin + NumDims + 1);
|
return const_child_range(Begin, Begin + NumDims + 1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// OpenMP 5.0 [2.1.6 Iterators]
|
|
||||||
/// Iterators are identifiers that expand to multiple values in the clause on
|
|
||||||
/// which they appear.
|
|
||||||
/// The syntax of the iterator modifier is as follows:
|
|
||||||
/// \code
|
|
||||||
/// iterator(iterators-definition)
|
|
||||||
/// \endcode
|
|
||||||
/// where iterators-definition is one of the following:
|
|
||||||
/// \code
|
|
||||||
/// iterator-specifier [, iterators-definition ]
|
|
||||||
/// \endcode
|
|
||||||
/// where iterator-specifier is one of the following:
|
|
||||||
/// \code
|
|
||||||
/// [ iterator-type ] identifier = range-specification
|
|
||||||
/// \endcode
|
|
||||||
/// where identifier is a base language identifier.
|
|
||||||
/// iterator-type is a type name.
|
|
||||||
/// range-specification is of the form begin:end[:step], where begin and end are
|
|
||||||
/// expressions for which their types can be converted to iterator-type and step
|
|
||||||
/// is an integral expression.
|
|
||||||
/// In an iterator-specifier, if the iterator-type is not specified then the
|
|
||||||
/// type of that iterator is of int type.
|
|
||||||
/// The iterator-type must be an integral or pointer type.
|
|
||||||
/// The iterator-type must not be const qualified.
|
|
||||||
class OMPIteratorExpr final
|
|
||||||
: public Expr,
|
|
||||||
private llvm::TrailingObjects<OMPIteratorExpr, Decl *, Expr *,
|
|
||||||
SourceLocation> {
|
|
||||||
public:
|
|
||||||
/// Iterator range representation begin:end[:step].
|
|
||||||
struct IteratorRange {
|
|
||||||
Expr *Begin = nullptr;
|
|
||||||
Expr *End = nullptr;
|
|
||||||
Expr *Step = nullptr;
|
|
||||||
};
|
|
||||||
/// Iterator definition representation.
|
|
||||||
struct IteratorDefinition {
|
|
||||||
Decl *IteratorDecl = nullptr;
|
|
||||||
IteratorRange Range;
|
|
||||||
SourceLocation AssignmentLoc;
|
|
||||||
SourceLocation ColonLoc, SecondColonLoc;
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend TrailingObjects;
|
|
||||||
friend class ASTStmtReader;
|
|
||||||
friend class ASTStmtWriter;
|
|
||||||
|
|
||||||
/// Offset in the list of expressions for subelements of the ranges.
|
|
||||||
enum class RangeExprOffset {
|
|
||||||
Begin = 0,
|
|
||||||
End = 1,
|
|
||||||
Step = 2,
|
|
||||||
Total = 3,
|
|
||||||
};
|
|
||||||
/// Offset in the list of locations for subelements of colon symbols
|
|
||||||
/// locations.
|
|
||||||
enum class RangeLocOffset {
|
|
||||||
AssignLoc = 0,
|
|
||||||
FirstColonLoc = 1,
|
|
||||||
SecondColonLoc = 2,
|
|
||||||
Total = 3,
|
|
||||||
};
|
|
||||||
/// Location of 'iterator' keyword.
|
|
||||||
SourceLocation IteratorKwLoc;
|
|
||||||
/// Location of '('.
|
|
||||||
SourceLocation LPLoc;
|
|
||||||
/// Location of ')'.
|
|
||||||
SourceLocation RPLoc;
|
|
||||||
/// Number of iterator definitions.
|
|
||||||
unsigned NumIterators = 0;
|
|
||||||
|
|
||||||
OMPIteratorExpr(QualType ExprTy, SourceLocation IteratorKwLoc,
|
|
||||||
SourceLocation L, SourceLocation R,
|
|
||||||
ArrayRef<OMPIteratorExpr::IteratorDefinition> Data);
|
|
||||||
|
|
||||||
/// Construct an empty expression.
|
|
||||||
explicit OMPIteratorExpr(EmptyShell Shell, unsigned NumIterators)
|
|
||||||
: Expr(OMPIteratorExprClass, Shell), NumIterators(NumIterators) {}
|
|
||||||
|
|
||||||
/// Sets basic declaration for the specified iterator definition.
|
|
||||||
void setIteratorDeclaration(unsigned I, Decl *D);
|
|
||||||
|
|
||||||
/// Sets the location of the assignment symbol for the specified iterator
|
|
||||||
/// definition.
|
|
||||||
void setAssignmentLoc(unsigned I, SourceLocation Loc);
|
|
||||||
|
|
||||||
/// Sets begin, end and optional step expressions for specified iterator
|
|
||||||
/// definition.
|
|
||||||
void setIteratorRange(unsigned I, Expr *Begin, SourceLocation ColonLoc,
|
|
||||||
Expr *End, SourceLocation SecondColonLoc, Expr *Step);
|
|
||||||
|
|
||||||
unsigned numTrailingObjects(OverloadToken<Decl *>) const {
|
|
||||||
return NumIterators;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned numTrailingObjects(OverloadToken<Expr *>) const {
|
|
||||||
return NumIterators * static_cast<int>(RangeExprOffset::Total);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned numTrailingObjects(OverloadToken<SourceRange>) const {
|
|
||||||
return NumIterators * static_cast<int>(RangeLocOffset::Total);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
static OMPIteratorExpr *Create(const ASTContext &Context, QualType T,
|
|
||||||
SourceLocation IteratorKwLoc, SourceLocation L,
|
|
||||||
SourceLocation R,
|
|
||||||
ArrayRef<IteratorDefinition> Data);
|
|
||||||
|
|
||||||
static OMPIteratorExpr *CreateEmpty(const ASTContext &Context,
|
|
||||||
unsigned NumIterators);
|
|
||||||
|
|
||||||
SourceLocation getLParenLoc() const { return LPLoc; }
|
|
||||||
void setLParenLoc(SourceLocation L) { LPLoc = L; }
|
|
||||||
|
|
||||||
SourceLocation getRParenLoc() const { return RPLoc; }
|
|
||||||
void setRParenLoc(SourceLocation L) { RPLoc = L; }
|
|
||||||
|
|
||||||
SourceLocation getIteratorKwLoc() const { return IteratorKwLoc; }
|
|
||||||
void setIteratorKwLoc(SourceLocation L) { IteratorKwLoc = L; }
|
|
||||||
SourceLocation getBeginLoc() const LLVM_READONLY { return IteratorKwLoc; }
|
|
||||||
SourceLocation getEndLoc() const LLVM_READONLY { return RPLoc; }
|
|
||||||
|
|
||||||
/// Gets the iterator declaration for the given iterator.
|
|
||||||
Decl *getIteratorDecl(unsigned I);
|
|
||||||
const Decl *getIteratorDecl(unsigned I) const {
|
|
||||||
return const_cast<OMPIteratorExpr *>(this)->getIteratorDecl(I);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Gets the iterator range for the given iterator.
|
|
||||||
IteratorRange getIteratorRange(unsigned I);
|
|
||||||
const IteratorRange getIteratorRange(unsigned I) const {
|
|
||||||
return const_cast<OMPIteratorExpr *>(this)->getIteratorRange(I);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Gets the location of '=' for the given iterator definition.
|
|
||||||
SourceLocation getAssignLoc(unsigned I) const;
|
|
||||||
/// Gets the location of the first ':' in the range for the given iterator
|
|
||||||
/// definition.
|
|
||||||
SourceLocation getColonLoc(unsigned I) const;
|
|
||||||
/// Gets the location of the second ':' (if any) in the range for the given
|
|
||||||
/// iteratori definition.
|
|
||||||
SourceLocation getSecondColonLoc(unsigned I) const;
|
|
||||||
|
|
||||||
/// Returns number of iterator definitions.
|
|
||||||
unsigned numOfIterators() const { return NumIterators; }
|
|
||||||
|
|
||||||
static bool classof(const Stmt *T) {
|
|
||||||
return T->getStmtClass() == OMPIteratorExprClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterators
|
|
||||||
child_range children() {
|
|
||||||
Stmt **Begin = reinterpret_cast<Stmt **>(getTrailingObjects<Expr *>());
|
|
||||||
return child_range(
|
|
||||||
Begin, Begin + NumIterators * static_cast<int>(RangeExprOffset::Total));
|
|
||||||
}
|
|
||||||
const_child_range children() const {
|
|
||||||
Stmt *const *Begin =
|
|
||||||
reinterpret_cast<Stmt *const *>(getTrailingObjects<Expr *>());
|
|
||||||
return const_child_range(
|
|
||||||
Begin, Begin + NumIterators * static_cast<int>(RangeExprOffset::Total));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace clang
|
} // end namespace clang
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4372,9 +4372,6 @@ class OMPDependClause final
|
||||||
/// Set colon location.
|
/// Set colon location.
|
||||||
void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
|
void setColonLoc(SourceLocation Loc) { ColonLoc = Loc; }
|
||||||
|
|
||||||
/// Sets optional dependency modifier.
|
|
||||||
void setModifier(Expr *DepModifier);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Creates clause with a list of variables \a VL.
|
/// Creates clause with a list of variables \a VL.
|
||||||
///
|
///
|
||||||
|
@ -4390,7 +4387,7 @@ public:
|
||||||
/// clause.
|
/// clause.
|
||||||
static OMPDependClause *Create(const ASTContext &C, SourceLocation StartLoc,
|
static OMPDependClause *Create(const ASTContext &C, SourceLocation StartLoc,
|
||||||
SourceLocation LParenLoc,
|
SourceLocation LParenLoc,
|
||||||
SourceLocation EndLoc, Expr *DepModifier,
|
SourceLocation EndLoc,
|
||||||
OpenMPDependClauseKind DepKind,
|
OpenMPDependClauseKind DepKind,
|
||||||
SourceLocation DepLoc, SourceLocation ColonLoc,
|
SourceLocation DepLoc, SourceLocation ColonLoc,
|
||||||
ArrayRef<Expr *> VL, unsigned NumLoops);
|
ArrayRef<Expr *> VL, unsigned NumLoops);
|
||||||
|
@ -4407,12 +4404,6 @@ public:
|
||||||
/// Get dependency type.
|
/// Get dependency type.
|
||||||
OpenMPDependClauseKind getDependencyKind() const { return DepKind; }
|
OpenMPDependClauseKind getDependencyKind() const { return DepKind; }
|
||||||
|
|
||||||
/// Return optional depend modifier.
|
|
||||||
Expr *getModifier();
|
|
||||||
const Expr *getModifier() const {
|
|
||||||
return const_cast<OMPDependClause *>(this)->getModifier();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get dependency type location.
|
/// Get dependency type location.
|
||||||
SourceLocation getDependencyLoc() const { return DepLoc; }
|
SourceLocation getDependencyLoc() const { return DepLoc; }
|
||||||
|
|
||||||
|
|
|
@ -2552,7 +2552,6 @@ DEF_TRAVERSE_STMT(AddrLabelExpr, {})
|
||||||
DEF_TRAVERSE_STMT(ArraySubscriptExpr, {})
|
DEF_TRAVERSE_STMT(ArraySubscriptExpr, {})
|
||||||
DEF_TRAVERSE_STMT(OMPArraySectionExpr, {})
|
DEF_TRAVERSE_STMT(OMPArraySectionExpr, {})
|
||||||
DEF_TRAVERSE_STMT(OMPArrayShapingExpr, {})
|
DEF_TRAVERSE_STMT(OMPArrayShapingExpr, {})
|
||||||
DEF_TRAVERSE_STMT(OMPIteratorExpr, {})
|
|
||||||
|
|
||||||
DEF_TRAVERSE_STMT(BlockExpr, {
|
DEF_TRAVERSE_STMT(BlockExpr, {
|
||||||
TRY_TO(TraverseDecl(S->getBlockDecl()));
|
TRY_TO(TraverseDecl(S->getBlockDecl()));
|
||||||
|
|
|
@ -274,7 +274,6 @@ public:
|
||||||
void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node);
|
void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node);
|
||||||
void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node);
|
void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node);
|
||||||
void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node);
|
void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node);
|
||||||
void VisitOMPIteratorExpr(const OMPIteratorExpr *Node);
|
|
||||||
|
|
||||||
void VisitRValueReferenceType(const ReferenceType *T);
|
void VisitRValueReferenceType(const ReferenceType *T);
|
||||||
void VisitArrayType(const ArrayType *T);
|
void VisitArrayType(const ArrayType *T);
|
||||||
|
|
|
@ -1220,10 +1220,6 @@ def err_omp_expected_identifier_for_critical : Error<
|
||||||
"expected identifier specifying the name of the 'omp critical' directive">;
|
"expected identifier specifying the name of the 'omp critical' directive">;
|
||||||
def err_omp_expected_reduction_identifier : Error<
|
def err_omp_expected_reduction_identifier : Error<
|
||||||
"expected identifier or one of the following operators: '+', '-', '*', '&', '|', '^', '&&', or '||'">;
|
"expected identifier or one of the following operators: '+', '-', '*', '&', '|', '^', '&&', or '||'">;
|
||||||
def err_omp_expected_equal_in_iterator : Error<
|
|
||||||
"expected '=' in iterator specifier">;
|
|
||||||
def err_omp_expected_punc_after_iterator : Error<
|
|
||||||
"expected ',' or ')' after iterator specifier">;
|
|
||||||
def err_omp_decl_in_declare_simd_variant : Error<
|
def err_omp_decl_in_declare_simd_variant : Error<
|
||||||
"function declaration is expected after 'declare %select{simd|variant}0' directive">;
|
"function declaration is expected after 'declare %select{simd|variant}0' directive">;
|
||||||
def err_omp_unknown_map_type : Error<
|
def err_omp_unknown_map_type : Error<
|
||||||
|
|
|
@ -9760,14 +9760,6 @@ def note_omp_conversion_here : Note<
|
||||||
def err_omp_ambiguous_conversion : Error<
|
def err_omp_ambiguous_conversion : Error<
|
||||||
"ambiguous conversion from type %0 to an integral or unscoped "
|
"ambiguous conversion from type %0 to an integral or unscoped "
|
||||||
"enumeration type">;
|
"enumeration type">;
|
||||||
def err_omp_iterator_not_integral_or_pointer : Error<
|
|
||||||
"expected integral or pointer type as the iterator-type, not %0">;
|
|
||||||
def err_omp_iterator_constant : Error<
|
|
||||||
"expected non-constant type as the iterator-type, constant %0 is provided">;
|
|
||||||
def err_omp_iterator_step_not_integral : Error<
|
|
||||||
"iterator step expression %0 is not the integral expression">;
|
|
||||||
def err_omp_iterator_step_constant_zero : Error<
|
|
||||||
"iterator step expression %0 evaluates to 0">;
|
|
||||||
def err_omp_required_access : Error<
|
def err_omp_required_access : Error<
|
||||||
"%0 variable must be %1">;
|
"%0 variable must be %1">;
|
||||||
def err_omp_const_variable : Error<
|
def err_omp_const_variable : Error<
|
||||||
|
@ -9961,7 +9953,6 @@ def err_omp_invalid_mapper: Error<
|
||||||
"cannot find a valid user-defined mapper for type %0 with name %1">;
|
"cannot find a valid user-defined mapper for type %0 with name %1">;
|
||||||
def err_omp_array_section_use : Error<"OpenMP array section is not allowed here">;
|
def err_omp_array_section_use : Error<"OpenMP array section is not allowed here">;
|
||||||
def err_omp_array_shaping_use : Error<"OpenMP array shaping operation is not allowed here">;
|
def err_omp_array_shaping_use : Error<"OpenMP array shaping operation is not allowed here">;
|
||||||
def err_omp_iterator_use : Error<"OpenMP iterator is not allowed here">;
|
|
||||||
def err_omp_typecheck_section_value : Error<
|
def err_omp_typecheck_section_value : Error<
|
||||||
"subscripted value is not an array or pointer">;
|
"subscripted value is not an array or pointer">;
|
||||||
def err_omp_typecheck_section_not_integer : Error<
|
def err_omp_typecheck_section_not_integer : Error<
|
||||||
|
@ -10040,10 +10031,6 @@ def err_omp_depend_sink_source_not_allowed : Error<
|
||||||
"'depend(%select{source|sink:vec}0)' clause%select{|s}0 cannot be mixed with 'depend(%select{sink:vec|source}0)' clause%select{s|}0">;
|
"'depend(%select{source|sink:vec}0)' clause%select{|s}0 cannot be mixed with 'depend(%select{sink:vec|source}0)' clause%select{s|}0">;
|
||||||
def err_omp_depend_zero_length_array_section_not_allowed : Error<
|
def err_omp_depend_zero_length_array_section_not_allowed : Error<
|
||||||
"zero-length array section is not allowed in 'depend' clause">;
|
"zero-length array section is not allowed in 'depend' clause">;
|
||||||
def err_omp_depend_sink_source_with_modifier : Error<
|
|
||||||
"depend modifier cannot be used with 'sink' or 'source' depend type">;
|
|
||||||
def err_omp_depend_modifier_not_iterator : Error<
|
|
||||||
"expected iterator specification as depend modifier">;
|
|
||||||
def err_omp_linear_ordered : Error<
|
def err_omp_linear_ordered : Error<
|
||||||
"'linear' clause cannot be specified along with 'ordered' clause with a parameter">;
|
"'linear' clause cannot be specified along with 'ordered' clause with a parameter">;
|
||||||
def err_omp_unexpected_schedule_modifier : Error<
|
def err_omp_unexpected_schedule_modifier : Error<
|
||||||
|
|
|
@ -70,7 +70,6 @@ def OffsetOfExpr : StmtNode<Expr>;
|
||||||
def UnaryExprOrTypeTraitExpr : StmtNode<Expr>;
|
def UnaryExprOrTypeTraitExpr : StmtNode<Expr>;
|
||||||
def ArraySubscriptExpr : StmtNode<Expr>;
|
def ArraySubscriptExpr : StmtNode<Expr>;
|
||||||
def OMPArraySectionExpr : StmtNode<Expr>;
|
def OMPArraySectionExpr : StmtNode<Expr>;
|
||||||
def OMPIteratorExpr : StmtNode<Expr>;
|
|
||||||
def CallExpr : StmtNode<Expr>;
|
def CallExpr : StmtNode<Expr>;
|
||||||
def MemberExpr : StmtNode<Expr>;
|
def MemberExpr : StmtNode<Expr>;
|
||||||
def CastExpr : StmtNode<Expr, 1>;
|
def CastExpr : StmtNode<Expr, 1>;
|
||||||
|
|
|
@ -3086,11 +3086,6 @@ private:
|
||||||
OMPClause *ParseOpenMPVarListClause(OpenMPDirectiveKind DKind,
|
OMPClause *ParseOpenMPVarListClause(OpenMPDirectiveKind DKind,
|
||||||
OpenMPClauseKind Kind, bool ParseOnly);
|
OpenMPClauseKind Kind, bool ParseOnly);
|
||||||
|
|
||||||
/// Parses and creates OpenMP 5.0 iterators expression:
|
|
||||||
/// <iterators> = 'iterator' '(' { [ <iterator-type> ] identifier =
|
|
||||||
/// <range-specification> }+ ')'
|
|
||||||
ExprResult ParseOpenMPIteratorsExpr();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Parses simple expression in parens for single-expression clauses of OpenMP
|
/// Parses simple expression in parens for single-expression clauses of OpenMP
|
||||||
/// constructs.
|
/// constructs.
|
||||||
|
@ -3100,7 +3095,7 @@ public:
|
||||||
|
|
||||||
/// Data used for parsing list of variables in OpenMP clauses.
|
/// Data used for parsing list of variables in OpenMP clauses.
|
||||||
struct OpenMPVarListDataTy {
|
struct OpenMPVarListDataTy {
|
||||||
Expr *DepModOrTailExpr = nullptr;
|
Expr *TailExpr = nullptr;
|
||||||
SourceLocation ColonLoc;
|
SourceLocation ColonLoc;
|
||||||
SourceLocation RLoc;
|
SourceLocation RLoc;
|
||||||
CXXScopeSpec ReductionOrMapperIdScopeSpec;
|
CXXScopeSpec ReductionOrMapperIdScopeSpec;
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include "clang/AST/ExprCXX.h"
|
#include "clang/AST/ExprCXX.h"
|
||||||
#include "clang/AST/ExprConcepts.h"
|
#include "clang/AST/ExprConcepts.h"
|
||||||
#include "clang/AST/ExprObjC.h"
|
#include "clang/AST/ExprObjC.h"
|
||||||
#include "clang/AST/ExprOpenMP.h"
|
|
||||||
#include "clang/AST/ExternalASTSource.h"
|
#include "clang/AST/ExternalASTSource.h"
|
||||||
#include "clang/AST/LocInfoType.h"
|
#include "clang/AST/LocInfoType.h"
|
||||||
#include "clang/AST/MangleNumberingContext.h"
|
#include "clang/AST/MangleNumberingContext.h"
|
||||||
|
@ -4905,21 +4904,6 @@ public:
|
||||||
ArrayRef<Expr *> Dims,
|
ArrayRef<Expr *> Dims,
|
||||||
ArrayRef<SourceRange> Brackets);
|
ArrayRef<SourceRange> Brackets);
|
||||||
|
|
||||||
/// Data structure for iterator expression.
|
|
||||||
struct OMPIteratorData {
|
|
||||||
IdentifierInfo *DeclIdent = nullptr;
|
|
||||||
SourceLocation DeclIdentLoc;
|
|
||||||
ParsedType Type;
|
|
||||||
OMPIteratorExpr::IteratorRange Range;
|
|
||||||
SourceLocation AssignLoc;
|
|
||||||
SourceLocation ColonLoc;
|
|
||||||
SourceLocation SecColonLoc;
|
|
||||||
};
|
|
||||||
|
|
||||||
ExprResult ActOnOMPIteratorExpr(Scope *S, SourceLocation IteratorKwLoc,
|
|
||||||
SourceLocation LLoc, SourceLocation RLoc,
|
|
||||||
ArrayRef<OMPIteratorData> Data);
|
|
||||||
|
|
||||||
// This struct is for use by ActOnMemberAccess to allow
|
// This struct is for use by ActOnMemberAccess to allow
|
||||||
// BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
|
// BuildMemberReferenceExpr to be able to reinvoke ActOnMemberAccess after
|
||||||
// changing the access operator from a '.' to a '->' (to see if that is the
|
// changing the access operator from a '.' to a '->' (to see if that is the
|
||||||
|
@ -10588,7 +10572,7 @@ public:
|
||||||
SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc);
|
SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc);
|
||||||
|
|
||||||
OMPClause *ActOnOpenMPVarListClause(
|
OMPClause *ActOnOpenMPVarListClause(
|
||||||
OpenMPClauseKind Kind, ArrayRef<Expr *> Vars, Expr *DepModOrTailExpr,
|
OpenMPClauseKind Kind, ArrayRef<Expr *> Vars, Expr *TailExpr,
|
||||||
const OMPVarListLocTy &Locs, SourceLocation ColonLoc,
|
const OMPVarListLocTy &Locs, SourceLocation ColonLoc,
|
||||||
CXXScopeSpec &ReductionOrMapperIdScopeSpec,
|
CXXScopeSpec &ReductionOrMapperIdScopeSpec,
|
||||||
DeclarationNameInfo &ReductionOrMapperId, int ExtraModifier,
|
DeclarationNameInfo &ReductionOrMapperId, int ExtraModifier,
|
||||||
|
@ -10686,10 +10670,10 @@ public:
|
||||||
SourceLocation EndLoc);
|
SourceLocation EndLoc);
|
||||||
/// Called on well-formed 'depend' clause.
|
/// Called on well-formed 'depend' clause.
|
||||||
OMPClause *
|
OMPClause *
|
||||||
ActOnOpenMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
|
ActOnOpenMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
|
||||||
SourceLocation DepLoc, SourceLocation ColonLoc,
|
SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
|
||||||
ArrayRef<Expr *> VarList, SourceLocation StartLoc,
|
SourceLocation StartLoc, SourceLocation LParenLoc,
|
||||||
SourceLocation LParenLoc, SourceLocation EndLoc);
|
SourceLocation EndLoc);
|
||||||
/// Called on well-formed 'device' clause.
|
/// Called on well-formed 'device' clause.
|
||||||
OMPClause *ActOnOpenMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
|
OMPClause *ActOnOpenMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
|
||||||
Expr *Device, SourceLocation StartLoc,
|
Expr *Device, SourceLocation StartLoc,
|
||||||
|
|
|
@ -1019,9 +1019,6 @@ namespace serialization {
|
||||||
/// The placeholder type for OpenMP array shaping operation.
|
/// The placeholder type for OpenMP array shaping operation.
|
||||||
PREDEF_TYPE_OMP_ARRAY_SHAPING = 70,
|
PREDEF_TYPE_OMP_ARRAY_SHAPING = 70,
|
||||||
|
|
||||||
/// The placeholder type for OpenMP iterator expression.
|
|
||||||
PREDEF_TYPE_OMP_ITERATOR = 71,
|
|
||||||
|
|
||||||
/// OpenCL image types with auto numeration
|
/// OpenCL image types with auto numeration
|
||||||
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
|
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
|
||||||
PREDEF_TYPE_##Id##_ID,
|
PREDEF_TYPE_##Id##_ID,
|
||||||
|
@ -1875,7 +1872,6 @@ namespace serialization {
|
||||||
STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE,
|
STMT_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD_DIRECTIVE,
|
||||||
EXPR_OMP_ARRAY_SECTION,
|
EXPR_OMP_ARRAY_SECTION,
|
||||||
EXPR_OMP_ARRAY_SHAPING,
|
EXPR_OMP_ARRAY_SHAPING,
|
||||||
EXPR_OMP_ITERATOR,
|
|
||||||
|
|
||||||
// ARC
|
// ARC
|
||||||
EXPR_OBJC_BRIDGED_CAST, // ObjCBridgedCastExpr
|
EXPR_OBJC_BRIDGED_CAST, // ObjCBridgedCastExpr
|
||||||
|
|
|
@ -1389,7 +1389,6 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target,
|
||||||
if (LangOpts.OpenMP) {
|
if (LangOpts.OpenMP) {
|
||||||
InitBuiltinType(OMPArraySectionTy, BuiltinType::OMPArraySection);
|
InitBuiltinType(OMPArraySectionTy, BuiltinType::OMPArraySection);
|
||||||
InitBuiltinType(OMPArrayShapingTy, BuiltinType::OMPArrayShaping);
|
InitBuiltinType(OMPArrayShapingTy, BuiltinType::OMPArrayShaping);
|
||||||
InitBuiltinType(OMPIteratorTy, BuiltinType::OMPIterator);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// C99 6.2.5p11.
|
// C99 6.2.5p11.
|
||||||
|
|
|
@ -372,22 +372,6 @@ ExprDependence clang::computeDependence(OMPArrayShapingExpr *E) {
|
||||||
return D;
|
return D;
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprDependence clang::computeDependence(OMPIteratorExpr *E) {
|
|
||||||
auto D = toExprDependence(E->getType()->getDependence());
|
|
||||||
for (unsigned I = 0, End = E->numOfIterators(); I < End; ++I) {
|
|
||||||
if (auto *VD = cast_or_null<ValueDecl>(E->getIteratorDecl(I)))
|
|
||||||
D |= toExprDependence(VD->getType()->getDependence());
|
|
||||||
OMPIteratorExpr::IteratorRange IR = E->getIteratorRange(I);
|
|
||||||
if (Expr *BE = IR.Begin)
|
|
||||||
D |= BE->getDependence();
|
|
||||||
if (Expr *EE = IR.End)
|
|
||||||
D |= EE->getDependence();
|
|
||||||
if (Expr *SE = IR.Step)
|
|
||||||
D |= SE->getDependence();
|
|
||||||
}
|
|
||||||
return D;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Compute the type-, value-, and instantiation-dependence of a
|
/// Compute the type-, value-, and instantiation-dependence of a
|
||||||
/// declaration reference
|
/// declaration reference
|
||||||
/// based on the declaration being referenced.
|
/// based on the declaration being referenced.
|
||||||
|
|
|
@ -3399,7 +3399,6 @@ bool Expr::HasSideEffects(const ASTContext &Ctx,
|
||||||
case ArraySubscriptExprClass:
|
case ArraySubscriptExprClass:
|
||||||
case OMPArraySectionExprClass:
|
case OMPArraySectionExprClass:
|
||||||
case OMPArrayShapingExprClass:
|
case OMPArrayShapingExprClass:
|
||||||
case OMPIteratorExprClass:
|
|
||||||
case MemberExprClass:
|
case MemberExprClass:
|
||||||
case ConditionalOperatorClass:
|
case ConditionalOperatorClass:
|
||||||
case BinaryConditionalOperatorClass:
|
case BinaryConditionalOperatorClass:
|
||||||
|
@ -4618,118 +4617,3 @@ OMPArrayShapingExpr *OMPArrayShapingExpr::CreateEmpty(const ASTContext &Context,
|
||||||
alignof(OMPArrayShapingExpr));
|
alignof(OMPArrayShapingExpr));
|
||||||
return new (Mem) OMPArrayShapingExpr(EmptyShell(), NumDims);
|
return new (Mem) OMPArrayShapingExpr(EmptyShell(), NumDims);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OMPIteratorExpr::setIteratorDeclaration(unsigned I, Decl *D) {
|
|
||||||
assert(I < NumIterators &&
|
|
||||||
"Idx is greater or equal the number of iterators definitions.");
|
|
||||||
getTrailingObjects<Decl *>()[I] = D;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OMPIteratorExpr::setAssignmentLoc(unsigned I, SourceLocation Loc) {
|
|
||||||
assert(I < NumIterators &&
|
|
||||||
"Idx is greater or equal the number of iterators definitions.");
|
|
||||||
getTrailingObjects<
|
|
||||||
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
|
|
||||||
static_cast<int>(RangeLocOffset::AssignLoc)] = Loc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OMPIteratorExpr::setIteratorRange(unsigned I, Expr *Begin,
|
|
||||||
SourceLocation ColonLoc, Expr *End,
|
|
||||||
SourceLocation SecondColonLoc,
|
|
||||||
Expr *Step) {
|
|
||||||
assert(I < NumIterators &&
|
|
||||||
"Idx is greater or equal the number of iterators definitions.");
|
|
||||||
getTrailingObjects<Expr *>()[I * static_cast<int>(RangeExprOffset::Total) +
|
|
||||||
static_cast<int>(RangeExprOffset::Begin)] =
|
|
||||||
Begin;
|
|
||||||
getTrailingObjects<Expr *>()[I * static_cast<int>(RangeExprOffset::Total) +
|
|
||||||
static_cast<int>(RangeExprOffset::End)] = End;
|
|
||||||
getTrailingObjects<Expr *>()[I * static_cast<int>(RangeExprOffset::Total) +
|
|
||||||
static_cast<int>(RangeExprOffset::Step)] = Step;
|
|
||||||
getTrailingObjects<
|
|
||||||
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
|
|
||||||
static_cast<int>(RangeLocOffset::FirstColonLoc)] =
|
|
||||||
ColonLoc;
|
|
||||||
getTrailingObjects<
|
|
||||||
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
|
|
||||||
static_cast<int>(RangeLocOffset::SecondColonLoc)] =
|
|
||||||
SecondColonLoc;
|
|
||||||
}
|
|
||||||
|
|
||||||
Decl *OMPIteratorExpr::getIteratorDecl(unsigned I) {
|
|
||||||
return getTrailingObjects<Decl *>()[I];
|
|
||||||
}
|
|
||||||
|
|
||||||
OMPIteratorExpr::IteratorRange OMPIteratorExpr::getIteratorRange(unsigned I) {
|
|
||||||
IteratorRange Res;
|
|
||||||
Res.Begin =
|
|
||||||
getTrailingObjects<Expr *>()[I * static_cast<int>(
|
|
||||||
RangeExprOffset::Total) +
|
|
||||||
static_cast<int>(RangeExprOffset::Begin)];
|
|
||||||
Res.End =
|
|
||||||
getTrailingObjects<Expr *>()[I * static_cast<int>(
|
|
||||||
RangeExprOffset::Total) +
|
|
||||||
static_cast<int>(RangeExprOffset::End)];
|
|
||||||
Res.Step =
|
|
||||||
getTrailingObjects<Expr *>()[I * static_cast<int>(
|
|
||||||
RangeExprOffset::Total) +
|
|
||||||
static_cast<int>(RangeExprOffset::Step)];
|
|
||||||
return Res;
|
|
||||||
}
|
|
||||||
|
|
||||||
SourceLocation OMPIteratorExpr::getAssignLoc(unsigned I) const {
|
|
||||||
return getTrailingObjects<
|
|
||||||
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
|
|
||||||
static_cast<int>(RangeLocOffset::AssignLoc)];
|
|
||||||
}
|
|
||||||
|
|
||||||
SourceLocation OMPIteratorExpr::getColonLoc(unsigned I) const {
|
|
||||||
return getTrailingObjects<
|
|
||||||
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
|
|
||||||
static_cast<int>(RangeLocOffset::FirstColonLoc)];
|
|
||||||
}
|
|
||||||
|
|
||||||
SourceLocation OMPIteratorExpr::getSecondColonLoc(unsigned I) const {
|
|
||||||
return getTrailingObjects<
|
|
||||||
SourceLocation>()[I * static_cast<int>(RangeLocOffset::Total) +
|
|
||||||
static_cast<int>(RangeLocOffset::SecondColonLoc)];
|
|
||||||
}
|
|
||||||
|
|
||||||
OMPIteratorExpr::OMPIteratorExpr(
|
|
||||||
QualType ExprTy, SourceLocation IteratorKwLoc, SourceLocation L,
|
|
||||||
SourceLocation R, ArrayRef<OMPIteratorExpr::IteratorDefinition> Data)
|
|
||||||
: Expr(OMPIteratorExprClass, ExprTy, VK_LValue, OK_Ordinary),
|
|
||||||
IteratorKwLoc(IteratorKwLoc), LPLoc(L), RPLoc(R),
|
|
||||||
NumIterators(Data.size()) {
|
|
||||||
for (unsigned I = 0, End = Data.size(); I < End; ++I) {
|
|
||||||
const IteratorDefinition &D = Data[I];
|
|
||||||
setIteratorDeclaration(I, D.IteratorDecl);
|
|
||||||
setIteratorRange(I, D.Range.Begin, D.ColonLoc, D.Range.End,
|
|
||||||
D.SecondColonLoc, D.Range.Step);
|
|
||||||
}
|
|
||||||
setDependence(computeDependence(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
OMPIteratorExpr *
|
|
||||||
OMPIteratorExpr::Create(const ASTContext &Context, QualType T,
|
|
||||||
SourceLocation IteratorKwLoc, SourceLocation L,
|
|
||||||
SourceLocation R,
|
|
||||||
ArrayRef<OMPIteratorExpr::IteratorDefinition> Data) {
|
|
||||||
void *Mem = Context.Allocate(
|
|
||||||
totalSizeToAlloc<Decl *, Expr *, SourceLocation>(
|
|
||||||
Data.size(), Data.size() * static_cast<int>(RangeExprOffset::Total),
|
|
||||||
Data.size() * static_cast<int>(RangeLocOffset::Total)),
|
|
||||||
alignof(OMPIteratorExpr));
|
|
||||||
auto *E = new (Mem) OMPIteratorExpr(T, IteratorKwLoc, L, R, Data);
|
|
||||||
return E;
|
|
||||||
}
|
|
||||||
|
|
||||||
OMPIteratorExpr *OMPIteratorExpr::CreateEmpty(const ASTContext &Context,
|
|
||||||
unsigned NumIterators) {
|
|
||||||
void *Mem = Context.Allocate(
|
|
||||||
totalSizeToAlloc<Decl *, Expr *, SourceLocation>(
|
|
||||||
NumIterators, NumIterators * static_cast<int>(RangeExprOffset::Total),
|
|
||||||
NumIterators * static_cast<int>(RangeLocOffset::Total)),
|
|
||||||
alignof(OMPIteratorExpr));
|
|
||||||
return new (Mem) OMPIteratorExpr(EmptyShell(), NumIterators);
|
|
||||||
}
|
|
||||||
|
|
|
@ -141,7 +141,6 @@ static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E) {
|
||||||
case Expr::MSPropertySubscriptExprClass:
|
case Expr::MSPropertySubscriptExprClass:
|
||||||
case Expr::OMPArraySectionExprClass:
|
case Expr::OMPArraySectionExprClass:
|
||||||
case Expr::OMPArrayShapingExprClass:
|
case Expr::OMPArrayShapingExprClass:
|
||||||
case Expr::OMPIteratorExprClass:
|
|
||||||
return Cl::CL_LValue;
|
return Cl::CL_LValue;
|
||||||
|
|
||||||
// C99 6.5.2.5p5 says that compound literals are lvalues.
|
// C99 6.5.2.5p5 says that compound literals are lvalues.
|
||||||
|
|
|
@ -14181,7 +14181,6 @@ static ICEDiag CheckICE(const Expr* E, const ASTContext &Ctx) {
|
||||||
case Expr::ArraySubscriptExprClass:
|
case Expr::ArraySubscriptExprClass:
|
||||||
case Expr::OMPArraySectionExprClass:
|
case Expr::OMPArraySectionExprClass:
|
||||||
case Expr::OMPArrayShapingExprClass:
|
case Expr::OMPArrayShapingExprClass:
|
||||||
case Expr::OMPIteratorExprClass:
|
|
||||||
case Expr::MemberExprClass:
|
case Expr::MemberExprClass:
|
||||||
case Expr::CompoundAssignOperatorClass:
|
case Expr::CompoundAssignOperatorClass:
|
||||||
case Expr::CompoundLiteralExprClass:
|
case Expr::CompoundLiteralExprClass:
|
||||||
|
|
|
@ -3715,7 +3715,6 @@ recurse:
|
||||||
case Expr::RecoveryExprClass:
|
case Expr::RecoveryExprClass:
|
||||||
case Expr::OMPArraySectionExprClass:
|
case Expr::OMPArraySectionExprClass:
|
||||||
case Expr::OMPArrayShapingExprClass:
|
case Expr::OMPArrayShapingExprClass:
|
||||||
case Expr::OMPIteratorExprClass:
|
|
||||||
case Expr::CXXInheritedCtorInitExprClass:
|
case Expr::CXXInheritedCtorInitExprClass:
|
||||||
llvm_unreachable("unexpected statement kind");
|
llvm_unreachable("unexpected statement kind");
|
||||||
|
|
||||||
|
|
|
@ -484,7 +484,6 @@ NSAPI::getNSNumberFactoryMethodKind(QualType T) const {
|
||||||
case BuiltinType::BuiltinFn:
|
case BuiltinType::BuiltinFn:
|
||||||
case BuiltinType::OMPArraySection:
|
case BuiltinType::OMPArraySection:
|
||||||
case BuiltinType::OMPArrayShaping:
|
case BuiltinType::OMPArrayShaping:
|
||||||
case BuiltinType::OMPIterator:
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -900,19 +900,16 @@ OMPDepobjClause *OMPDepobjClause::CreateEmpty(const ASTContext &C) {
|
||||||
OMPDependClause *
|
OMPDependClause *
|
||||||
OMPDependClause::Create(const ASTContext &C, SourceLocation StartLoc,
|
OMPDependClause::Create(const ASTContext &C, SourceLocation StartLoc,
|
||||||
SourceLocation LParenLoc, SourceLocation EndLoc,
|
SourceLocation LParenLoc, SourceLocation EndLoc,
|
||||||
Expr *DepModifier, OpenMPDependClauseKind DepKind,
|
OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
|
||||||
SourceLocation DepLoc, SourceLocation ColonLoc,
|
SourceLocation ColonLoc, ArrayRef<Expr *> VL,
|
||||||
ArrayRef<Expr *> VL, unsigned NumLoops) {
|
unsigned NumLoops) {
|
||||||
void *Mem = C.Allocate(
|
void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(VL.size() + NumLoops));
|
||||||
totalSizeToAlloc<Expr *>(VL.size() + /*depend-modifier*/ 1 + NumLoops),
|
|
||||||
alignof(OMPDependClause));
|
|
||||||
OMPDependClause *Clause = new (Mem)
|
OMPDependClause *Clause = new (Mem)
|
||||||
OMPDependClause(StartLoc, LParenLoc, EndLoc, VL.size(), NumLoops);
|
OMPDependClause(StartLoc, LParenLoc, EndLoc, VL.size(), NumLoops);
|
||||||
Clause->setVarRefs(VL);
|
Clause->setVarRefs(VL);
|
||||||
Clause->setDependencyKind(DepKind);
|
Clause->setDependencyKind(DepKind);
|
||||||
Clause->setDependencyLoc(DepLoc);
|
Clause->setDependencyLoc(DepLoc);
|
||||||
Clause->setColonLoc(ColonLoc);
|
Clause->setColonLoc(ColonLoc);
|
||||||
Clause->setModifier(DepModifier);
|
|
||||||
for (unsigned I = 0 ; I < NumLoops; ++I)
|
for (unsigned I = 0 ; I < NumLoops; ++I)
|
||||||
Clause->setLoopData(I, nullptr);
|
Clause->setLoopData(I, nullptr);
|
||||||
return Clause;
|
return Clause;
|
||||||
|
@ -920,9 +917,7 @@ OMPDependClause::Create(const ASTContext &C, SourceLocation StartLoc,
|
||||||
|
|
||||||
OMPDependClause *OMPDependClause::CreateEmpty(const ASTContext &C, unsigned N,
|
OMPDependClause *OMPDependClause::CreateEmpty(const ASTContext &C, unsigned N,
|
||||||
unsigned NumLoops) {
|
unsigned NumLoops) {
|
||||||
void *Mem =
|
void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(N + NumLoops));
|
||||||
C.Allocate(totalSizeToAlloc<Expr *>(N + /*depend-modifier*/ 1 + NumLoops),
|
|
||||||
alignof(OMPDependClause));
|
|
||||||
return new (Mem) OMPDependClause(N, NumLoops);
|
return new (Mem) OMPDependClause(N, NumLoops);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -932,7 +927,7 @@ void OMPDependClause::setLoopData(unsigned NumLoop, Expr *Cnt) {
|
||||||
NumLoop < NumLoops &&
|
NumLoop < NumLoops &&
|
||||||
"Expected sink or source depend + loop index must be less number of "
|
"Expected sink or source depend + loop index must be less number of "
|
||||||
"loops.");
|
"loops.");
|
||||||
auto *It = std::next(getVarRefs().end(), NumLoop + 1);
|
auto It = std::next(getVarRefs().end(), NumLoop);
|
||||||
*It = Cnt;
|
*It = Cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -942,7 +937,7 @@ Expr *OMPDependClause::getLoopData(unsigned NumLoop) {
|
||||||
NumLoop < NumLoops &&
|
NumLoop < NumLoops &&
|
||||||
"Expected sink or source depend + loop index must be less number of "
|
"Expected sink or source depend + loop index must be less number of "
|
||||||
"loops.");
|
"loops.");
|
||||||
auto *It = std::next(getVarRefs().end(), NumLoop + 1);
|
auto It = std::next(getVarRefs().end(), NumLoop);
|
||||||
return *It;
|
return *It;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -952,15 +947,10 @@ const Expr *OMPDependClause::getLoopData(unsigned NumLoop) const {
|
||||||
NumLoop < NumLoops &&
|
NumLoop < NumLoops &&
|
||||||
"Expected sink or source depend + loop index must be less number of "
|
"Expected sink or source depend + loop index must be less number of "
|
||||||
"loops.");
|
"loops.");
|
||||||
const auto *It = std::next(getVarRefs().end(), NumLoop + 1);
|
auto It = std::next(getVarRefs().end(), NumLoop);
|
||||||
return *It;
|
return *It;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OMPDependClause::setModifier(Expr *DepModifier) {
|
|
||||||
*getVarRefs().end() = DepModifier;
|
|
||||||
}
|
|
||||||
Expr *OMPDependClause::getModifier() { return *getVarRefs().end(); }
|
|
||||||
|
|
||||||
unsigned OMPClauseMappableExprCommon::getComponentsTotalNumber(
|
unsigned OMPClauseMappableExprCommon::getComponentsTotalNumber(
|
||||||
MappableExprComponentListsRef ComponentLists) {
|
MappableExprComponentListsRef ComponentLists) {
|
||||||
unsigned TotalNum = 0u;
|
unsigned TotalNum = 0u;
|
||||||
|
@ -1737,10 +1727,6 @@ void OMPClausePrinter::VisitOMPDepobjClause(OMPDepobjClause *Node) {
|
||||||
|
|
||||||
void OMPClausePrinter::VisitOMPDependClause(OMPDependClause *Node) {
|
void OMPClausePrinter::VisitOMPDependClause(OMPDependClause *Node) {
|
||||||
OS << "depend(";
|
OS << "depend(";
|
||||||
if (Expr *DepModifier = Node->getModifier()) {
|
|
||||||
DepModifier->printPretty(OS, nullptr, Policy);
|
|
||||||
OS << ", ";
|
|
||||||
}
|
|
||||||
OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(),
|
OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(),
|
||||||
Node->getDependencyKind());
|
Node->getDependencyKind());
|
||||||
if (!Node->varlist_empty()) {
|
if (!Node->varlist_empty()) {
|
||||||
|
|
|
@ -1361,24 +1361,6 @@ void StmtPrinter::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *Node) {
|
||||||
PrintExpr(Node->getBase());
|
PrintExpr(Node->getBase());
|
||||||
}
|
}
|
||||||
|
|
||||||
void StmtPrinter::VisitOMPIteratorExpr(OMPIteratorExpr *Node) {
|
|
||||||
OS << "iterator(";
|
|
||||||
for (unsigned I = 0, E = Node->numOfIterators(); I < E; ++I) {
|
|
||||||
auto *VD = cast<ValueDecl>(Node->getIteratorDecl(I));
|
|
||||||
VD->getType().print(OS, Policy);
|
|
||||||
const OMPIteratorExpr::IteratorRange Range = Node->getIteratorRange(I);
|
|
||||||
OS << " " << VD->getName() << " = ";
|
|
||||||
PrintExpr(Range.Begin);
|
|
||||||
OS << ":";
|
|
||||||
PrintExpr(Range.End);
|
|
||||||
if (Node->getSecondColonLoc(I).isValid())
|
|
||||||
PrintExpr(Range.Step);
|
|
||||||
if (I < E - 1)
|
|
||||||
OS << ", ";
|
|
||||||
}
|
|
||||||
OS << ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
void StmtPrinter::PrintCallArgs(CallExpr *Call) {
|
void StmtPrinter::PrintCallArgs(CallExpr *Call) {
|
||||||
for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) {
|
for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) {
|
||||||
if (isa<CXXDefaultArgExpr>(Call->getArg(i))) {
|
if (isa<CXXDefaultArgExpr>(Call->getArg(i))) {
|
||||||
|
|
|
@ -1198,12 +1198,6 @@ void StmtProfiler::VisitOMPArrayShapingExpr(const OMPArrayShapingExpr *S) {
|
||||||
VisitExpr(S);
|
VisitExpr(S);
|
||||||
}
|
}
|
||||||
|
|
||||||
void StmtProfiler::VisitOMPIteratorExpr(const OMPIteratorExpr *S) {
|
|
||||||
VisitExpr(S);
|
|
||||||
for (unsigned I = 0, E = S->numOfIterators(); I < E; ++I)
|
|
||||||
VisitDecl(S->getIteratorDecl(I));
|
|
||||||
}
|
|
||||||
|
|
||||||
void StmtProfiler::VisitCallExpr(const CallExpr *S) {
|
void StmtProfiler::VisitCallExpr(const CallExpr *S) {
|
||||||
VisitExpr(S);
|
VisitExpr(S);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1086,23 +1086,6 @@ void TextNodeDumper::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node) {
|
||||||
OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
|
OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextNodeDumper::VisitOMPIteratorExpr(const OMPIteratorExpr *Node) {
|
|
||||||
OS << " ";
|
|
||||||
for (unsigned I = 0, E = Node->numOfIterators(); I < E; ++I) {
|
|
||||||
Visit(Node->getIteratorDecl(I));
|
|
||||||
OS << " = ";
|
|
||||||
const OMPIteratorExpr::IteratorRange Range = Node->getIteratorRange(I);
|
|
||||||
OS << " begin ";
|
|
||||||
Visit(Range.Begin);
|
|
||||||
OS << " end ";
|
|
||||||
Visit(Range.End);
|
|
||||||
if (Range.Step) {
|
|
||||||
OS << " step ";
|
|
||||||
Visit(Range.Step);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TextNodeDumper::VisitRValueReferenceType(const ReferenceType *T) {
|
void TextNodeDumper::VisitRValueReferenceType(const ReferenceType *T) {
|
||||||
if (T->isSpelledAsLValue())
|
if (T->isSpelledAsLValue())
|
||||||
OS << " written as lvalue reference";
|
OS << " written as lvalue reference";
|
||||||
|
|
|
@ -2910,8 +2910,6 @@ StringRef BuiltinType::getName(const PrintingPolicy &Policy) const {
|
||||||
return "<OpenMP array section type>";
|
return "<OpenMP array section type>";
|
||||||
case OMPArrayShaping:
|
case OMPArrayShaping:
|
||||||
return "<OpenMP array shaping type>";
|
return "<OpenMP array shaping type>";
|
||||||
case OMPIterator:
|
|
||||||
return "<OpenMP iterator type>";
|
|
||||||
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
|
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
|
||||||
case Id: \
|
case Id: \
|
||||||
return #ExtType;
|
return #ExtType;
|
||||||
|
@ -3919,7 +3917,6 @@ bool Type::canHaveNullability(bool ResultIfUnknown) const {
|
||||||
case BuiltinType::NullPtr:
|
case BuiltinType::NullPtr:
|
||||||
case BuiltinType::OMPArraySection:
|
case BuiltinType::OMPArraySection:
|
||||||
case BuiltinType::OMPArrayShaping:
|
case BuiltinType::OMPArrayShaping:
|
||||||
case BuiltinType::OMPIterator:
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
llvm_unreachable("unknown builtin type");
|
llvm_unreachable("unknown builtin type");
|
||||||
|
|
|
@ -405,7 +405,6 @@ TypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec() const {
|
||||||
case BuiltinType::BuiltinFn:
|
case BuiltinType::BuiltinFn:
|
||||||
case BuiltinType::OMPArraySection:
|
case BuiltinType::OMPArraySection:
|
||||||
case BuiltinType::OMPArrayShaping:
|
case BuiltinType::OMPArrayShaping:
|
||||||
case BuiltinType::OMPIterator:
|
|
||||||
return TST_unspecified;
|
return TST_unspecified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -755,8 +755,7 @@ static bool parseDeclareSimdClauses(
|
||||||
getOpenMPClauseKind(ClauseName), *Vars, Data))
|
getOpenMPClauseKind(ClauseName), *Vars, Data))
|
||||||
IsError = true;
|
IsError = true;
|
||||||
if (CKind == OMPC_aligned) {
|
if (CKind == OMPC_aligned) {
|
||||||
Alignments.append(Aligneds.size() - Alignments.size(),
|
Alignments.append(Aligneds.size() - Alignments.size(), Data.TailExpr);
|
||||||
Data.DepModOrTailExpr);
|
|
||||||
} else if (CKind == OMPC_linear) {
|
} else if (CKind == OMPC_linear) {
|
||||||
assert(0 <= Data.ExtraModifier &&
|
assert(0 <= Data.ExtraModifier &&
|
||||||
Data.ExtraModifier <= OMPC_LINEAR_unknown &&
|
Data.ExtraModifier <= OMPC_LINEAR_unknown &&
|
||||||
|
@ -767,7 +766,7 @@ static bool parseDeclareSimdClauses(
|
||||||
Data.ExtraModifier = OMPC_LINEAR_val;
|
Data.ExtraModifier = OMPC_LINEAR_val;
|
||||||
LinModifiers.append(Linears.size() - LinModifiers.size(),
|
LinModifiers.append(Linears.size() - LinModifiers.size(),
|
||||||
Data.ExtraModifier);
|
Data.ExtraModifier);
|
||||||
Steps.append(Linears.size() - Steps.size(), Data.DepModOrTailExpr);
|
Steps.append(Linears.size() - Steps.size(), Data.TailExpr);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
// TODO: add parsing of other clauses.
|
// TODO: add parsing of other clauses.
|
||||||
|
@ -3055,114 +3054,6 @@ static void parseMapType(Parser &P, Parser::OpenMPVarListDataTy &Data) {
|
||||||
P.ConsumeToken();
|
P.ConsumeToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses simple expression in parens for single-expression clauses of OpenMP
|
|
||||||
/// constructs.
|
|
||||||
/// \param RLoc Returned location of right paren.
|
|
||||||
ExprResult Parser::ParseOpenMPIteratorsExpr() {
|
|
||||||
assert(Tok.is(tok::identifier) && PP.getSpelling(Tok) == "iterator" &&
|
|
||||||
"Expected 'iterator' token.");
|
|
||||||
SourceLocation IteratorKwLoc = ConsumeToken();
|
|
||||||
|
|
||||||
BalancedDelimiterTracker T(*this, tok::l_paren, tok::annot_pragma_openmp_end);
|
|
||||||
if (T.expectAndConsume(diag::err_expected_lparen_after, "iterator"))
|
|
||||||
return ExprError();
|
|
||||||
|
|
||||||
SourceLocation LLoc = T.getOpenLocation();
|
|
||||||
SmallVector<Sema::OMPIteratorData, 4> Data;
|
|
||||||
while (Tok.isNot(tok::r_paren) && Tok.isNot(tok::annot_pragma_openmp_end)) {
|
|
||||||
// Check if the type parsing is required.
|
|
||||||
ParsedType IteratorType;
|
|
||||||
if (Tok.isNot(tok::identifier) || NextToken().isNot(tok::equal)) {
|
|
||||||
// identifier '=' is not found - parse type.
|
|
||||||
TypeResult TR = ParseTypeName();
|
|
||||||
if (TR.isInvalid()) {
|
|
||||||
T.skipToEnd();
|
|
||||||
return ExprError();
|
|
||||||
}
|
|
||||||
IteratorType = TR.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse identifier.
|
|
||||||
IdentifierInfo *II = nullptr;
|
|
||||||
SourceLocation IdLoc;
|
|
||||||
if (Tok.is(tok::identifier)) {
|
|
||||||
II = Tok.getIdentifierInfo();
|
|
||||||
IdLoc = ConsumeToken();
|
|
||||||
} else {
|
|
||||||
Diag(Tok, diag::err_expected_unqualified_id) << 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse '='.
|
|
||||||
SourceLocation AssignLoc;
|
|
||||||
if (Tok.is(tok::equal))
|
|
||||||
AssignLoc = ConsumeToken();
|
|
||||||
else
|
|
||||||
Diag(Tok, diag::err_omp_expected_equal_in_iterator);
|
|
||||||
|
|
||||||
// Parse range-specification - <begin> ':' <end> [ ':' <step> ]
|
|
||||||
ColonProtectionRAIIObject ColonRAII(*this);
|
|
||||||
// Parse <begin>
|
|
||||||
SourceLocation Loc = Tok.getLocation();
|
|
||||||
ExprResult LHS = ParseCastExpression(AnyCastExpr);
|
|
||||||
ExprResult Begin = Actions.CorrectDelayedTyposInExpr(
|
|
||||||
ParseRHSOfBinaryExpression(LHS, prec::Conditional));
|
|
||||||
Begin = Actions.ActOnFinishFullExpr(Begin.get(), Loc,
|
|
||||||
/*DiscardedValue=*/false);
|
|
||||||
// Parse ':'.
|
|
||||||
SourceLocation ColonLoc;
|
|
||||||
if (Tok.is(tok::colon))
|
|
||||||
ColonLoc = ConsumeToken();
|
|
||||||
|
|
||||||
// Parse <end>
|
|
||||||
Loc = Tok.getLocation();
|
|
||||||
LHS = ParseCastExpression(AnyCastExpr);
|
|
||||||
ExprResult End = Actions.CorrectDelayedTyposInExpr(
|
|
||||||
ParseRHSOfBinaryExpression(LHS, prec::Conditional));
|
|
||||||
End = Actions.ActOnFinishFullExpr(End.get(), Loc,
|
|
||||||
/*DiscardedValue=*/false);
|
|
||||||
|
|
||||||
SourceLocation SecColonLoc;
|
|
||||||
ExprResult Step;
|
|
||||||
// Parse optional step.
|
|
||||||
if (Tok.is(tok::colon)) {
|
|
||||||
// Parse ':'
|
|
||||||
ColonLoc = ConsumeToken();
|
|
||||||
// Parse <step>
|
|
||||||
Loc = Tok.getLocation();
|
|
||||||
LHS = ParseCastExpression(AnyCastExpr);
|
|
||||||
Step = Actions.CorrectDelayedTyposInExpr(
|
|
||||||
ParseRHSOfBinaryExpression(LHS, prec::Conditional));
|
|
||||||
Step = Actions.ActOnFinishFullExpr(Step.get(), Loc,
|
|
||||||
/*DiscardedValue=*/false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse ',' or ')'
|
|
||||||
if (Tok.isNot(tok::comma) && Tok.isNot(tok::r_paren))
|
|
||||||
Diag(Tok, diag::err_omp_expected_punc_after_iterator);
|
|
||||||
if (Tok.is(tok::comma))
|
|
||||||
ConsumeToken();
|
|
||||||
|
|
||||||
Sema::OMPIteratorData &D = Data.emplace_back();
|
|
||||||
D.DeclIdent = II;
|
|
||||||
D.DeclIdentLoc = IdLoc;
|
|
||||||
D.Type = IteratorType;
|
|
||||||
D.AssignLoc = AssignLoc;
|
|
||||||
D.ColonLoc = ColonLoc;
|
|
||||||
D.SecColonLoc = SecColonLoc;
|
|
||||||
D.Range.Begin = Begin.get();
|
|
||||||
D.Range.End = End.get();
|
|
||||||
D.Range.Step = Step.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse ')'.
|
|
||||||
SourceLocation RLoc = Tok.getLocation();
|
|
||||||
if (!T.consumeClose())
|
|
||||||
RLoc = T.getCloseLocation();
|
|
||||||
|
|
||||||
return Actions.ActOnOMPIteratorExpr(getCurScope(), IteratorKwLoc, LLoc, RLoc,
|
|
||||||
Data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Parses clauses with list.
|
/// Parses clauses with list.
|
||||||
bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
|
bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
|
||||||
OpenMPClauseKind Kind,
|
OpenMPClauseKind Kind,
|
||||||
|
@ -3178,7 +3069,6 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
|
||||||
getOpenMPClauseName(Kind)))
|
getOpenMPClauseName(Kind)))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
bool DependWithIterator = false;
|
|
||||||
bool NeedRParenForLinear = false;
|
bool NeedRParenForLinear = false;
|
||||||
BalancedDelimiterTracker LinearT(*this, tok::l_paren,
|
BalancedDelimiterTracker LinearT(*this, tok::l_paren,
|
||||||
tok::annot_pragma_openmp_end);
|
tok::annot_pragma_openmp_end);
|
||||||
|
@ -3216,22 +3106,6 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
|
||||||
Data.ReductionOrMapperId =
|
Data.ReductionOrMapperId =
|
||||||
Actions.GetNameFromUnqualifiedId(UnqualifiedReductionId);
|
Actions.GetNameFromUnqualifiedId(UnqualifiedReductionId);
|
||||||
} else if (Kind == OMPC_depend) {
|
} else if (Kind == OMPC_depend) {
|
||||||
if (getLangOpts().OpenMP >= 50) {
|
|
||||||
if (Tok.is(tok::identifier) && PP.getSpelling(Tok) == "iterator") {
|
|
||||||
// Handle optional dependence modifier.
|
|
||||||
// iterator(iterators-definition)
|
|
||||||
// where iterators-definition is iterator-specifier [,
|
|
||||||
// iterators-definition ]
|
|
||||||
// where iterator-specifier is [ iterator-type ] identifier =
|
|
||||||
// range-specification
|
|
||||||
DependWithIterator = true;
|
|
||||||
EnterScope(Scope::OpenMPDirectiveScope | Scope::DeclScope);
|
|
||||||
ExprResult IteratorRes = ParseOpenMPIteratorsExpr();
|
|
||||||
Data.DepModOrTailExpr = IteratorRes.get();
|
|
||||||
// Parse ','
|
|
||||||
ExpectAndConsume(tok::comma);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Handle dependency type for depend clause.
|
// Handle dependency type for depend clause.
|
||||||
ColonProtectionRAIIObject ColonRAII(*this);
|
ColonProtectionRAIIObject ColonRAII(*this);
|
||||||
Data.ExtraModifier = getOpenMPSimpleClauseType(
|
Data.ExtraModifier = getOpenMPSimpleClauseType(
|
||||||
|
@ -3353,7 +3227,7 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
|
||||||
/*DiscardedValue=*/false);
|
/*DiscardedValue=*/false);
|
||||||
if (Tail.isUsable()) {
|
if (Tail.isUsable()) {
|
||||||
if (Tok.is(tok::colon)) {
|
if (Tok.is(tok::colon)) {
|
||||||
Data.DepModOrTailExpr = Tail.get();
|
Data.TailExpr = Tail.get();
|
||||||
Data.ColonLoc = ConsumeToken();
|
Data.ColonLoc = ConsumeToken();
|
||||||
TPA.Commit();
|
TPA.Commit();
|
||||||
} else {
|
} else {
|
||||||
|
@ -3379,7 +3253,6 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
|
||||||
const bool MayHaveTail = (Kind == OMPC_linear || Kind == OMPC_aligned);
|
const bool MayHaveTail = (Kind == OMPC_linear || Kind == OMPC_aligned);
|
||||||
while (IsComma || (Tok.isNot(tok::r_paren) && Tok.isNot(tok::colon) &&
|
while (IsComma || (Tok.isNot(tok::r_paren) && Tok.isNot(tok::colon) &&
|
||||||
Tok.isNot(tok::annot_pragma_openmp_end))) {
|
Tok.isNot(tok::annot_pragma_openmp_end))) {
|
||||||
ParseScope OMPListScope(this, Scope::OpenMPDirectiveScope);
|
|
||||||
ColonProtectionRAIIObject ColonRAII(*this, MayHaveTail);
|
ColonProtectionRAIIObject ColonRAII(*this, MayHaveTail);
|
||||||
// Parse variable
|
// Parse variable
|
||||||
ExprResult VarExpr =
|
ExprResult VarExpr =
|
||||||
|
@ -3416,7 +3289,7 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
|
||||||
Tail =
|
Tail =
|
||||||
Actions.ActOnFinishFullExpr(Tail.get(), ELoc, /*DiscardedValue*/ false);
|
Actions.ActOnFinishFullExpr(Tail.get(), ELoc, /*DiscardedValue*/ false);
|
||||||
if (Tail.isUsable())
|
if (Tail.isUsable())
|
||||||
Data.DepModOrTailExpr = Tail.get();
|
Data.TailExpr = Tail.get();
|
||||||
else
|
else
|
||||||
SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
|
SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
|
||||||
StopBeforeMatch);
|
StopBeforeMatch);
|
||||||
|
@ -3426,11 +3299,8 @@ bool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind,
|
||||||
Data.RLoc = Tok.getLocation();
|
Data.RLoc = Tok.getLocation();
|
||||||
if (!T.consumeClose())
|
if (!T.consumeClose())
|
||||||
Data.RLoc = T.getCloseLocation();
|
Data.RLoc = T.getCloseLocation();
|
||||||
// Exit from scope when the iterator is used in depend clause.
|
|
||||||
if (DependWithIterator)
|
|
||||||
ExitScope();
|
|
||||||
return (Kind != OMPC_depend && Kind != OMPC_map && Vars.empty()) ||
|
return (Kind != OMPC_depend && Kind != OMPC_map && Vars.empty()) ||
|
||||||
(MustHaveTail && !Data.DepModOrTailExpr) || InvalidReductionId ||
|
(MustHaveTail && !Data.TailExpr) || InvalidReductionId ||
|
||||||
IsInvalidMapperModifier;
|
IsInvalidMapperModifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3502,7 +3372,7 @@ OMPClause *Parser::ParseOpenMPVarListClause(OpenMPDirectiveKind DKind,
|
||||||
return nullptr;
|
return nullptr;
|
||||||
OMPVarListLocTy Locs(Loc, LOpen, Data.RLoc);
|
OMPVarListLocTy Locs(Loc, LOpen, Data.RLoc);
|
||||||
return Actions.ActOnOpenMPVarListClause(
|
return Actions.ActOnOpenMPVarListClause(
|
||||||
Kind, Vars, Data.DepModOrTailExpr, Locs, Data.ColonLoc,
|
Kind, Vars, Data.TailExpr, Locs, Data.ColonLoc,
|
||||||
Data.ReductionOrMapperIdScopeSpec, Data.ReductionOrMapperId,
|
Data.ReductionOrMapperIdScopeSpec, Data.ReductionOrMapperId,
|
||||||
Data.ExtraModifier, Data.MapTypeModifiers, Data.MapTypeModifiersLoc,
|
Data.ExtraModifier, Data.MapTypeModifiers, Data.MapTypeModifiersLoc,
|
||||||
Data.IsMapTypeImplicit, Data.ExtraModifierLoc);
|
Data.IsMapTypeImplicit, Data.ExtraModifierLoc);
|
||||||
|
|
|
@ -1300,7 +1300,6 @@ CanThrowResult Sema::canThrow(const Stmt *S) {
|
||||||
case Expr::ArraySubscriptExprClass:
|
case Expr::ArraySubscriptExprClass:
|
||||||
case Expr::OMPArraySectionExprClass:
|
case Expr::OMPArraySectionExprClass:
|
||||||
case Expr::OMPArrayShapingExprClass:
|
case Expr::OMPArrayShapingExprClass:
|
||||||
case Expr::OMPIteratorExprClass:
|
|
||||||
case Expr::BinaryOperatorClass:
|
case Expr::BinaryOperatorClass:
|
||||||
case Expr::DependentCoawaitExprClass:
|
case Expr::DependentCoawaitExprClass:
|
||||||
case Expr::CompoundAssignOperatorClass:
|
case Expr::CompoundAssignOperatorClass:
|
||||||
|
|
|
@ -4873,131 +4873,6 @@ ExprResult Sema::ActOnOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
|
||||||
LParenLoc, RParenLoc, NewDims, Brackets);
|
LParenLoc, RParenLoc, NewDims, Brackets);
|
||||||
}
|
}
|
||||||
|
|
||||||
ExprResult Sema::ActOnOMPIteratorExpr(Scope *S, SourceLocation IteratorKwLoc,
|
|
||||||
SourceLocation LLoc, SourceLocation RLoc,
|
|
||||||
ArrayRef<OMPIteratorData> Data) {
|
|
||||||
SmallVector<OMPIteratorExpr::IteratorDefinition, 4> ID;
|
|
||||||
bool IsCorrect = true;
|
|
||||||
for (const OMPIteratorData &D : Data) {
|
|
||||||
TypeSourceInfo *TInfo = nullptr;
|
|
||||||
SourceLocation StartLoc;
|
|
||||||
QualType DeclTy;
|
|
||||||
if (!D.Type.getAsOpaquePtr()) {
|
|
||||||
// OpenMP 5.0, 2.1.6 Iterators
|
|
||||||
// In an iterator-specifier, if the iterator-type is not specified then
|
|
||||||
// the type of that iterator is of int type.
|
|
||||||
DeclTy = Context.IntTy;
|
|
||||||
StartLoc = D.DeclIdentLoc;
|
|
||||||
} else {
|
|
||||||
DeclTy = GetTypeFromParser(D.Type, &TInfo);
|
|
||||||
StartLoc = TInfo->getTypeLoc().getBeginLoc();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsDeclTyDependent = DeclTy->isDependentType() ||
|
|
||||||
DeclTy->containsUnexpandedParameterPack() ||
|
|
||||||
DeclTy->isInstantiationDependentType();
|
|
||||||
if (!IsDeclTyDependent) {
|
|
||||||
if (!DeclTy->isIntegralType(Context) && !DeclTy->isAnyPointerType()) {
|
|
||||||
// OpenMP 5.0, 2.1.6 Iterators, Restrictions, C/C++
|
|
||||||
// The iterator-type must be an integral or pointer type.
|
|
||||||
Diag(StartLoc, diag::err_omp_iterator_not_integral_or_pointer)
|
|
||||||
<< DeclTy;
|
|
||||||
IsCorrect = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (DeclTy.isConstant(Context)) {
|
|
||||||
// OpenMP 5.0, 2.1.6 Iterators, Restrictions, C/C++
|
|
||||||
// The iterator-type must not be const qualified.
|
|
||||||
Diag(StartLoc, diag::err_omp_iterator_not_integral_or_pointer)
|
|
||||||
<< DeclTy;
|
|
||||||
IsCorrect = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterator declaration.
|
|
||||||
assert(D.DeclIdent && "Identifier expected.");
|
|
||||||
// Always try to create iterator declarator to avoid extra error messages
|
|
||||||
// about unknown declarations use.
|
|
||||||
auto *VD = VarDecl::Create(Context, CurContext, StartLoc, D.DeclIdentLoc,
|
|
||||||
D.DeclIdent, DeclTy, TInfo, SC_None);
|
|
||||||
VD->setImplicit();
|
|
||||||
if (S) {
|
|
||||||
// Check for conflicting previous declaration.
|
|
||||||
DeclarationNameInfo NameInfo(VD->getDeclName(), D.DeclIdentLoc);
|
|
||||||
LookupResult Previous(*this, NameInfo, LookupOrdinaryName,
|
|
||||||
ForVisibleRedeclaration);
|
|
||||||
Previous.suppressDiagnostics();
|
|
||||||
LookupName(Previous, S);
|
|
||||||
|
|
||||||
FilterLookupForScope(Previous, CurContext, S, /*ConsiderLinkage=*/false,
|
|
||||||
/*AllowInlineNamespace=*/false);
|
|
||||||
if (!Previous.empty()) {
|
|
||||||
NamedDecl *Old = Previous.getRepresentativeDecl();
|
|
||||||
Diag(D.DeclIdentLoc, diag::err_redefinition) << VD->getDeclName();
|
|
||||||
Diag(Old->getLocation(), diag::note_previous_definition);
|
|
||||||
} else {
|
|
||||||
PushOnScopeChains(VD, S);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
CurContext->addDecl(VD);
|
|
||||||
}
|
|
||||||
Expr *Begin = D.Range.Begin;
|
|
||||||
if (!IsDeclTyDependent && Begin && !Begin->isTypeDependent()) {
|
|
||||||
ExprResult BeginRes =
|
|
||||||
PerformImplicitConversion(Begin, DeclTy, AA_Converting);
|
|
||||||
Begin = BeginRes.get();
|
|
||||||
}
|
|
||||||
Expr *End = D.Range.End;
|
|
||||||
if (!IsDeclTyDependent && End && !End->isTypeDependent()) {
|
|
||||||
ExprResult EndRes = PerformImplicitConversion(End, DeclTy, AA_Converting);
|
|
||||||
End = EndRes.get();
|
|
||||||
}
|
|
||||||
Expr *Step = D.Range.Step;
|
|
||||||
if (!IsDeclTyDependent && Step && !Step->isTypeDependent()) {
|
|
||||||
if (!Step->getType()->isIntegralType(Context)) {
|
|
||||||
Diag(Step->getExprLoc(), diag::err_omp_iterator_step_not_integral)
|
|
||||||
<< Step << Step->getSourceRange();
|
|
||||||
IsCorrect = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
llvm::APSInt Result;
|
|
||||||
bool IsConstant = Step->isIntegerConstantExpr(Result, Context);
|
|
||||||
// OpenMP 5.0, 2.1.6 Iterators, Restrictions
|
|
||||||
// If the step expression of a range-specification equals zero, the
|
|
||||||
// behavior is unspecified.
|
|
||||||
if (IsConstant && Result.isNullValue()) {
|
|
||||||
Diag(Step->getExprLoc(), diag::err_omp_iterator_step_constant_zero)
|
|
||||||
<< Step << Step->getSourceRange();
|
|
||||||
IsCorrect = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!Begin || !End || !IsCorrect) {
|
|
||||||
IsCorrect = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
OMPIteratorExpr::IteratorDefinition &IDElem = ID.emplace_back();
|
|
||||||
IDElem.IteratorDecl = VD;
|
|
||||||
IDElem.AssignmentLoc = D.AssignLoc;
|
|
||||||
IDElem.Range.Begin = Begin;
|
|
||||||
IDElem.Range.End = End;
|
|
||||||
IDElem.Range.Step = Step;
|
|
||||||
IDElem.ColonLoc = D.ColonLoc;
|
|
||||||
IDElem.SecondColonLoc = D.SecColonLoc;
|
|
||||||
}
|
|
||||||
if (!IsCorrect) {
|
|
||||||
// Invalidate all created iterator declarations if error is found.
|
|
||||||
for (const OMPIteratorExpr::IteratorDefinition &D : ID) {
|
|
||||||
if (Decl *ID = D.IteratorDecl)
|
|
||||||
ID->setInvalidDecl();
|
|
||||||
}
|
|
||||||
return ExprError();
|
|
||||||
}
|
|
||||||
return OMPIteratorExpr::Create(Context, Context.OMPIteratorTy, IteratorKwLoc,
|
|
||||||
LLoc, RLoc, ID);
|
|
||||||
}
|
|
||||||
|
|
||||||
ExprResult
|
ExprResult
|
||||||
Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
|
Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc,
|
||||||
Expr *Idx, SourceLocation RLoc) {
|
Expr *Idx, SourceLocation RLoc) {
|
||||||
|
@ -5759,7 +5634,6 @@ static bool isPlaceholderToRemoveAsArg(QualType type) {
|
||||||
case BuiltinType::BuiltinFn:
|
case BuiltinType::BuiltinFn:
|
||||||
case BuiltinType::OMPArraySection:
|
case BuiltinType::OMPArraySection:
|
||||||
case BuiltinType::OMPArrayShaping:
|
case BuiltinType::OMPArrayShaping:
|
||||||
case BuiltinType::OMPIterator:
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18639,9 +18513,6 @@ ExprResult Sema::CheckPlaceholderExpr(Expr *E) {
|
||||||
case BuiltinType::OMPArrayShaping:
|
case BuiltinType::OMPArrayShaping:
|
||||||
return ExprError(Diag(E->getBeginLoc(), diag::err_omp_array_shaping_use));
|
return ExprError(Diag(E->getBeginLoc(), diag::err_omp_array_shaping_use));
|
||||||
|
|
||||||
case BuiltinType::OMPIterator:
|
|
||||||
return ExprError(Diag(E->getBeginLoc(), diag::err_omp_iterator_use));
|
|
||||||
|
|
||||||
// Everything else should be impossible.
|
// Everything else should be impossible.
|
||||||
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
|
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
|
||||||
case BuiltinType::Id:
|
case BuiltinType::Id:
|
||||||
|
|
|
@ -13053,7 +13053,7 @@ OMPClause *Sema::ActOnOpenMPDestroyClause(SourceLocation StartLoc,
|
||||||
}
|
}
|
||||||
|
|
||||||
OMPClause *Sema::ActOnOpenMPVarListClause(
|
OMPClause *Sema::ActOnOpenMPVarListClause(
|
||||||
OpenMPClauseKind Kind, ArrayRef<Expr *> VarList, Expr *DepModOrTailExpr,
|
OpenMPClauseKind Kind, ArrayRef<Expr *> VarList, Expr *TailExpr,
|
||||||
const OMPVarListLocTy &Locs, SourceLocation ColonLoc,
|
const OMPVarListLocTy &Locs, SourceLocation ColonLoc,
|
||||||
CXXScopeSpec &ReductionOrMapperIdScopeSpec,
|
CXXScopeSpec &ReductionOrMapperIdScopeSpec,
|
||||||
DeclarationNameInfo &ReductionOrMapperId, int ExtraModifier,
|
DeclarationNameInfo &ReductionOrMapperId, int ExtraModifier,
|
||||||
|
@ -13103,13 +13103,13 @@ OMPClause *Sema::ActOnOpenMPVarListClause(
|
||||||
assert(0 <= ExtraModifier && ExtraModifier <= OMPC_LINEAR_unknown &&
|
assert(0 <= ExtraModifier && ExtraModifier <= OMPC_LINEAR_unknown &&
|
||||||
"Unexpected linear modifier.");
|
"Unexpected linear modifier.");
|
||||||
Res = ActOnOpenMPLinearClause(
|
Res = ActOnOpenMPLinearClause(
|
||||||
VarList, DepModOrTailExpr, StartLoc, LParenLoc,
|
VarList, TailExpr, StartLoc, LParenLoc,
|
||||||
static_cast<OpenMPLinearClauseKind>(ExtraModifier), ExtraModifierLoc,
|
static_cast<OpenMPLinearClauseKind>(ExtraModifier), ExtraModifierLoc,
|
||||||
ColonLoc, EndLoc);
|
ColonLoc, EndLoc);
|
||||||
break;
|
break;
|
||||||
case OMPC_aligned:
|
case OMPC_aligned:
|
||||||
Res = ActOnOpenMPAlignedClause(VarList, DepModOrTailExpr, StartLoc,
|
Res = ActOnOpenMPAlignedClause(VarList, TailExpr, StartLoc, LParenLoc,
|
||||||
LParenLoc, ColonLoc, EndLoc);
|
ColonLoc, EndLoc);
|
||||||
break;
|
break;
|
||||||
case OMPC_copyin:
|
case OMPC_copyin:
|
||||||
Res = ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, EndLoc);
|
Res = ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, EndLoc);
|
||||||
|
@ -13124,8 +13124,8 @@ OMPClause *Sema::ActOnOpenMPVarListClause(
|
||||||
assert(0 <= ExtraModifier && ExtraModifier <= OMPC_DEPEND_unknown &&
|
assert(0 <= ExtraModifier && ExtraModifier <= OMPC_DEPEND_unknown &&
|
||||||
"Unexpected depend modifier.");
|
"Unexpected depend modifier.");
|
||||||
Res = ActOnOpenMPDependClause(
|
Res = ActOnOpenMPDependClause(
|
||||||
DepModOrTailExpr, static_cast<OpenMPDependClauseKind>(ExtraModifier),
|
static_cast<OpenMPDependClauseKind>(ExtraModifier), ExtraModifierLoc,
|
||||||
ExtraModifierLoc, ColonLoc, VarList, StartLoc, LParenLoc, EndLoc);
|
ColonLoc, VarList, StartLoc, LParenLoc, EndLoc);
|
||||||
break;
|
break;
|
||||||
case OMPC_map:
|
case OMPC_map:
|
||||||
assert(0 <= ExtraModifier && ExtraModifier <= OMPC_MAP_unknown &&
|
assert(0 <= ExtraModifier && ExtraModifier <= OMPC_MAP_unknown &&
|
||||||
|
@ -13150,8 +13150,8 @@ OMPClause *Sema::ActOnOpenMPVarListClause(
|
||||||
Res = ActOnOpenMPIsDevicePtrClause(VarList, Locs);
|
Res = ActOnOpenMPIsDevicePtrClause(VarList, Locs);
|
||||||
break;
|
break;
|
||||||
case OMPC_allocate:
|
case OMPC_allocate:
|
||||||
Res = ActOnOpenMPAllocateClause(DepModOrTailExpr, VarList, StartLoc,
|
Res = ActOnOpenMPAllocateClause(TailExpr, VarList, StartLoc, LParenLoc,
|
||||||
LParenLoc, ColonLoc, EndLoc);
|
ColonLoc, EndLoc);
|
||||||
break;
|
break;
|
||||||
case OMPC_nontemporal:
|
case OMPC_nontemporal:
|
||||||
Res = ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, EndLoc);
|
Res = ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, EndLoc);
|
||||||
|
@ -15642,7 +15642,7 @@ OMPClause *Sema::ActOnOpenMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
|
||||||
}
|
}
|
||||||
|
|
||||||
OMPClause *
|
OMPClause *
|
||||||
Sema::ActOnOpenMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
|
Sema::ActOnOpenMPDependClause(OpenMPDependClauseKind DepKind,
|
||||||
SourceLocation DepLoc, SourceLocation ColonLoc,
|
SourceLocation DepLoc, SourceLocation ColonLoc,
|
||||||
ArrayRef<Expr *> VarList, SourceLocation StartLoc,
|
ArrayRef<Expr *> VarList, SourceLocation StartLoc,
|
||||||
SourceLocation LParenLoc, SourceLocation EndLoc) {
|
SourceLocation LParenLoc, SourceLocation EndLoc) {
|
||||||
|
@ -15664,26 +15664,12 @@ Sema::ActOnOpenMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
|
||||||
Except.push_back(OMPC_DEPEND_sink);
|
Except.push_back(OMPC_DEPEND_sink);
|
||||||
if (LangOpts.OpenMP < 50 || DSAStack->getCurrentDirective() == OMPD_depobj)
|
if (LangOpts.OpenMP < 50 || DSAStack->getCurrentDirective() == OMPD_depobj)
|
||||||
Except.push_back(OMPC_DEPEND_depobj);
|
Except.push_back(OMPC_DEPEND_depobj);
|
||||||
std::string Expected = (LangOpts.OpenMP >= 50 && !DepModifier)
|
|
||||||
? "depend modifier(iterator) or "
|
|
||||||
: "";
|
|
||||||
Diag(DepLoc, diag::err_omp_unexpected_clause_value)
|
Diag(DepLoc, diag::err_omp_unexpected_clause_value)
|
||||||
<< Expected + getListOfPossibleValues(OMPC_depend, /*First=*/0,
|
<< getListOfPossibleValues(OMPC_depend, /*First=*/0,
|
||||||
/*Last=*/OMPC_DEPEND_unknown,
|
/*Last=*/OMPC_DEPEND_unknown, Except)
|
||||||
Except)
|
|
||||||
<< getOpenMPClauseName(OMPC_depend);
|
<< getOpenMPClauseName(OMPC_depend);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
if (DepModifier &&
|
|
||||||
(DepKind == OMPC_DEPEND_source || DepKind == OMPC_DEPEND_sink)) {
|
|
||||||
Diag(DepModifier->getExprLoc(),
|
|
||||||
diag::err_omp_depend_sink_source_with_modifier);
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
if (DepModifier &&
|
|
||||||
!DepModifier->getType()->isSpecificBuiltinType(BuiltinType::OMPIterator))
|
|
||||||
Diag(DepModifier->getExprLoc(), diag::err_omp_depend_modifier_not_iterator);
|
|
||||||
|
|
||||||
SmallVector<Expr *, 8> Vars;
|
SmallVector<Expr *, 8> Vars;
|
||||||
DSAStackTy::OperatorOffsetTy OpsOffs;
|
DSAStackTy::OperatorOffsetTy OpsOffs;
|
||||||
llvm::APSInt DepCounter(/*BitWidth=*/32);
|
llvm::APSInt DepCounter(/*BitWidth=*/32);
|
||||||
|
@ -15892,8 +15878,8 @@ Sema::ActOnOpenMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
auto *C = OMPDependClause::Create(Context, StartLoc, LParenLoc, EndLoc,
|
auto *C = OMPDependClause::Create(Context, StartLoc, LParenLoc, EndLoc,
|
||||||
DepModifier, DepKind, DepLoc, ColonLoc,
|
DepKind, DepLoc, ColonLoc, Vars,
|
||||||
Vars, TotalDepCount.getZExtValue());
|
TotalDepCount.getZExtValue());
|
||||||
if ((DepKind == OMPC_DEPEND_sink || DepKind == OMPC_DEPEND_source) &&
|
if ((DepKind == OMPC_DEPEND_sink || DepKind == OMPC_DEPEND_source) &&
|
||||||
DSAStack->isParentOrderedRegion())
|
DSAStack->isParentOrderedRegion())
|
||||||
DSAStack->addDoacrossDependClause(C, OpsOffs);
|
DSAStack->addDoacrossDependClause(C, OpsOffs);
|
||||||
|
|
|
@ -1842,13 +1842,12 @@ public:
|
||||||
/// By default, performs semantic analysis to build the new OpenMP clause.
|
/// By default, performs semantic analysis to build the new OpenMP clause.
|
||||||
/// Subclasses may override this routine to provide different behavior.
|
/// Subclasses may override this routine to provide different behavior.
|
||||||
OMPClause *
|
OMPClause *
|
||||||
RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
|
RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
|
||||||
SourceLocation DepLoc, SourceLocation ColonLoc,
|
SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
|
||||||
ArrayRef<Expr *> VarList, SourceLocation StartLoc,
|
SourceLocation StartLoc, SourceLocation LParenLoc,
|
||||||
SourceLocation LParenLoc, SourceLocation EndLoc) {
|
SourceLocation EndLoc) {
|
||||||
return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
|
return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
|
||||||
ColonLoc, VarList, StartLoc,
|
StartLoc, LParenLoc, EndLoc);
|
||||||
LParenLoc, EndLoc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Build a new OpenMP 'device' clause.
|
/// Build a new OpenMP 'device' clause.
|
||||||
|
@ -2392,17 +2391,6 @@ public:
|
||||||
BracketsRanges);
|
BracketsRanges);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Build a new iterator expression.
|
|
||||||
///
|
|
||||||
/// By default, performs semantic analysis to build the new expression.
|
|
||||||
/// Subclasses may override this routine to provide different behavior.
|
|
||||||
ExprResult RebuildOMPIteratorExpr(
|
|
||||||
SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
|
|
||||||
ArrayRef<Sema::OMPIteratorData> Data) {
|
|
||||||
return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
|
|
||||||
LLoc, RLoc, Data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Build a new call expression.
|
/// Build a new call expression.
|
||||||
///
|
///
|
||||||
/// By default, performs semantic analysis to build the new expression.
|
/// By default, performs semantic analysis to build the new expression.
|
||||||
|
@ -9303,13 +9291,6 @@ template <typename Derived>
|
||||||
OMPClause *
|
OMPClause *
|
||||||
TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
|
TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
|
||||||
llvm::SmallVector<Expr *, 16> Vars;
|
llvm::SmallVector<Expr *, 16> Vars;
|
||||||
Expr *DepModifier = C->getModifier();
|
|
||||||
if (DepModifier) {
|
|
||||||
ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
|
|
||||||
if (DepModRes.isInvalid())
|
|
||||||
return nullptr;
|
|
||||||
DepModifier = DepModRes.get();
|
|
||||||
}
|
|
||||||
Vars.reserve(C->varlist_size());
|
Vars.reserve(C->varlist_size());
|
||||||
for (auto *VE : C->varlists()) {
|
for (auto *VE : C->varlists()) {
|
||||||
ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
|
ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
|
||||||
|
@ -9318,9 +9299,8 @@ TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
|
||||||
Vars.push_back(EVar.get());
|
Vars.push_back(EVar.get());
|
||||||
}
|
}
|
||||||
return getDerived().RebuildOMPDependClause(
|
return getDerived().RebuildOMPDependClause(
|
||||||
DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
|
C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
|
||||||
C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
|
C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
|
||||||
C->getEndLoc());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Derived>
|
template <typename Derived>
|
||||||
|
@ -10074,65 +10054,6 @@ TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
|
||||||
E->getBracketsRanges());
|
E->getBracketsRanges());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Derived>
|
|
||||||
ExprResult
|
|
||||||
TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
|
|
||||||
unsigned NumIterators = E->numOfIterators();
|
|
||||||
SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
|
|
||||||
|
|
||||||
bool ErrorFound = false;
|
|
||||||
bool NeedToRebuild = getDerived().AlwaysRebuild();
|
|
||||||
for (unsigned I = 0; I < NumIterators; ++I) {
|
|
||||||
auto *D = cast<VarDecl>(E->getIteratorDecl(I));
|
|
||||||
Data[I].DeclIdent = D->getIdentifier();
|
|
||||||
Data[I].DeclIdentLoc = D->getLocation();
|
|
||||||
if (D->getLocation() == D->getBeginLoc()) {
|
|
||||||
assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
|
|
||||||
"Implicit type must be int.");
|
|
||||||
} else {
|
|
||||||
TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
|
|
||||||
QualType DeclTy = getDerived().TransformType(D->getType());
|
|
||||||
Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
|
|
||||||
}
|
|
||||||
OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
|
|
||||||
ExprResult Begin = getDerived().TransformExpr(Range.Begin);
|
|
||||||
ExprResult End = getDerived().TransformExpr(Range.End);
|
|
||||||
ExprResult Step = getDerived().TransformExpr(Range.Step);
|
|
||||||
ErrorFound = ErrorFound ||
|
|
||||||
!(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
|
|
||||||
!Data[I].Type.get().isNull())) ||
|
|
||||||
Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
|
|
||||||
if (ErrorFound)
|
|
||||||
continue;
|
|
||||||
Data[I].Range.Begin = Begin.get();
|
|
||||||
Data[I].Range.End = End.get();
|
|
||||||
Data[I].Range.Step = Step.get();
|
|
||||||
Data[I].AssignLoc = E->getAssignLoc(I);
|
|
||||||
Data[I].ColonLoc = E->getColonLoc(I);
|
|
||||||
Data[I].SecColonLoc = E->getSecondColonLoc(I);
|
|
||||||
NeedToRebuild =
|
|
||||||
NeedToRebuild ||
|
|
||||||
(D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
|
|
||||||
D->getType().getTypePtrOrNull()) ||
|
|
||||||
Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
|
|
||||||
Range.Step != Data[I].Range.Step;
|
|
||||||
}
|
|
||||||
if (ErrorFound)
|
|
||||||
return ExprError();
|
|
||||||
if (!NeedToRebuild)
|
|
||||||
return E;
|
|
||||||
|
|
||||||
ExprResult Res = getDerived().RebuildOMPIteratorExpr(
|
|
||||||
E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
|
|
||||||
if (!Res.isUsable())
|
|
||||||
return Res;
|
|
||||||
auto *IE = cast<OMPIteratorExpr>(Res.get());
|
|
||||||
for (unsigned I = 0; I < NumIterators; ++I)
|
|
||||||
getDerived().transformedLocalDecl(E->getIteratorDecl(I),
|
|
||||||
IE->getIteratorDecl(I));
|
|
||||||
return Res;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
ExprResult
|
ExprResult
|
||||||
TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
|
TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
|
||||||
|
|
|
@ -246,9 +246,6 @@ serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
|
||||||
case BuiltinType::OMPArrayShaping:
|
case BuiltinType::OMPArrayShaping:
|
||||||
ID = PREDEF_TYPE_OMP_ARRAY_SHAPING;
|
ID = PREDEF_TYPE_OMP_ARRAY_SHAPING;
|
||||||
break;
|
break;
|
||||||
case BuiltinType::OMPIterator:
|
|
||||||
ID = PREDEF_TYPE_OMP_ITERATOR;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TypeIdx(ID);
|
return TypeIdx(ID);
|
||||||
|
|
|
@ -6960,9 +6960,6 @@ QualType ASTReader::GetType(TypeID ID) {
|
||||||
case PREDEF_TYPE_OMP_ARRAY_SHAPING:
|
case PREDEF_TYPE_OMP_ARRAY_SHAPING:
|
||||||
T = Context.OMPArraySectionTy;
|
T = Context.OMPArraySectionTy;
|
||||||
break;
|
break;
|
||||||
case PREDEF_TYPE_OMP_ITERATOR:
|
|
||||||
T = Context.OMPIteratorTy;
|
|
||||||
break;
|
|
||||||
#define SVE_TYPE(Name, Id, SingletonId) \
|
#define SVE_TYPE(Name, Id, SingletonId) \
|
||||||
case PREDEF_TYPE_##Id##_ID: \
|
case PREDEF_TYPE_##Id##_ID: \
|
||||||
T = Context.SingletonId; \
|
T = Context.SingletonId; \
|
||||||
|
@ -12310,7 +12307,6 @@ void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) {
|
||||||
|
|
||||||
void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
|
void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) {
|
||||||
C->setLParenLoc(Record.readSourceLocation());
|
C->setLParenLoc(Record.readSourceLocation());
|
||||||
C->setModifier(Record.readSubExpr());
|
|
||||||
C->setDependencyKind(
|
C->setDependencyKind(
|
||||||
static_cast<OpenMPDependClauseKind>(Record.readInt()));
|
static_cast<OpenMPDependClauseKind>(Record.readInt()));
|
||||||
C->setDependencyLoc(Record.readSourceLocation());
|
C->setDependencyLoc(Record.readSourceLocation());
|
||||||
|
|
|
@ -927,24 +927,6 @@ void ASTStmtReader::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
|
||||||
E->setRParenLoc(readSourceLocation());
|
E->setRParenLoc(readSourceLocation());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTStmtReader::VisitOMPIteratorExpr(OMPIteratorExpr *E) {
|
|
||||||
VisitExpr(E);
|
|
||||||
unsigned NumIterators = Record.readInt();
|
|
||||||
E->setIteratorKwLoc(readSourceLocation());
|
|
||||||
E->setLParenLoc(readSourceLocation());
|
|
||||||
E->setRParenLoc(readSourceLocation());
|
|
||||||
for (unsigned I = 0; I < NumIterators; ++I) {
|
|
||||||
E->setIteratorDeclaration(I, Record.readDeclRef());
|
|
||||||
E->setAssignmentLoc(I, readSourceLocation());
|
|
||||||
Expr *Begin = Record.readSubExpr();
|
|
||||||
Expr *End = Record.readSubExpr();
|
|
||||||
Expr *Step = Record.readSubExpr();
|
|
||||||
SourceLocation ColonLoc = readSourceLocation();
|
|
||||||
SourceLocation SecColonLoc = readSourceLocation();
|
|
||||||
E->setIteratorRange(I, Begin, ColonLoc, End, SecColonLoc, Step);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASTStmtReader::VisitCallExpr(CallExpr *E) {
|
void ASTStmtReader::VisitCallExpr(CallExpr *E) {
|
||||||
VisitExpr(E);
|
VisitExpr(E);
|
||||||
unsigned NumArgs = Record.readInt();
|
unsigned NumArgs = Record.readInt();
|
||||||
|
@ -2905,11 +2887,6 @@ Stmt *ASTReader::ReadStmtFromStream(ModuleFile &F) {
|
||||||
Context, Record[ASTStmtReader::NumExprFields]);
|
Context, Record[ASTStmtReader::NumExprFields]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case EXPR_OMP_ITERATOR:
|
|
||||||
S = OMPIteratorExpr::CreateEmpty(Context,
|
|
||||||
Record[ASTStmtReader::NumExprFields]);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EXPR_CALL:
|
case EXPR_CALL:
|
||||||
S = CallExpr::CreateEmpty(
|
S = CallExpr::CreateEmpty(
|
||||||
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty);
|
Context, /*NumArgs=*/Record[ASTStmtReader::NumExprFields], Empty);
|
||||||
|
|
|
@ -6379,7 +6379,6 @@ void OMPClauseWriter::VisitOMPDependClause(OMPDependClause *C) {
|
||||||
Record.push_back(C->varlist_size());
|
Record.push_back(C->varlist_size());
|
||||||
Record.push_back(C->getNumLoops());
|
Record.push_back(C->getNumLoops());
|
||||||
Record.AddSourceLocation(C->getLParenLoc());
|
Record.AddSourceLocation(C->getLParenLoc());
|
||||||
Record.AddStmt(C->getModifier());
|
|
||||||
Record.push_back(C->getDependencyKind());
|
Record.push_back(C->getDependencyKind());
|
||||||
Record.AddSourceLocation(C->getDependencyLoc());
|
Record.AddSourceLocation(C->getDependencyLoc());
|
||||||
Record.AddSourceLocation(C->getColonLoc());
|
Record.AddSourceLocation(C->getColonLoc());
|
||||||
|
|
|
@ -787,25 +787,6 @@ void ASTStmtWriter::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
|
||||||
Code = serialization::EXPR_OMP_ARRAY_SHAPING;
|
Code = serialization::EXPR_OMP_ARRAY_SHAPING;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTStmtWriter::VisitOMPIteratorExpr(OMPIteratorExpr *E) {
|
|
||||||
VisitExpr(E);
|
|
||||||
Record.push_back(E->numOfIterators());
|
|
||||||
Record.AddSourceLocation(E->getIteratorKwLoc());
|
|
||||||
Record.AddSourceLocation(E->getLParenLoc());
|
|
||||||
Record.AddSourceLocation(E->getRParenLoc());
|
|
||||||
for (unsigned I = 0, End = E->numOfIterators(); I < End; ++I) {
|
|
||||||
Record.AddDeclRef(E->getIteratorDecl(I));
|
|
||||||
Record.AddSourceLocation(E->getAssignLoc(I));
|
|
||||||
OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
|
|
||||||
Record.AddStmt(Range.Begin);
|
|
||||||
Record.AddStmt(Range.End);
|
|
||||||
Record.AddStmt(Range.Step);
|
|
||||||
Record.AddSourceLocation(E->getColonLoc(I));
|
|
||||||
Record.AddSourceLocation(E->getSecondColonLoc(I));
|
|
||||||
}
|
|
||||||
Code = serialization::EXPR_OMP_ITERATOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASTStmtWriter::VisitCallExpr(CallExpr *E) {
|
void ASTStmtWriter::VisitCallExpr(CallExpr *E) {
|
||||||
VisitExpr(E);
|
VisitExpr(E);
|
||||||
Record.push_back(E->getNumArgs());
|
Record.push_back(E->getNumArgs());
|
||||||
|
|
|
@ -352,7 +352,6 @@ static bool isIdenticalStmt(const ASTContext &Ctx, const Stmt *Stmt1,
|
||||||
case Stmt::ArraySubscriptExprClass:
|
case Stmt::ArraySubscriptExprClass:
|
||||||
case Stmt::OMPArraySectionExprClass:
|
case Stmt::OMPArraySectionExprClass:
|
||||||
case Stmt::OMPArrayShapingExprClass:
|
case Stmt::OMPArrayShapingExprClass:
|
||||||
case Stmt::OMPIteratorExprClass:
|
|
||||||
case Stmt::ImplicitCastExprClass:
|
case Stmt::ImplicitCastExprClass:
|
||||||
case Stmt::ParenExprClass:
|
case Stmt::ParenExprClass:
|
||||||
case Stmt::BreakStmtClass:
|
case Stmt::BreakStmtClass:
|
||||||
|
|
|
@ -1414,7 +1414,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
||||||
case Stmt::CXXNullPtrLiteralExprClass:
|
case Stmt::CXXNullPtrLiteralExprClass:
|
||||||
case Stmt::OMPArraySectionExprClass:
|
case Stmt::OMPArraySectionExprClass:
|
||||||
case Stmt::OMPArrayShapingExprClass:
|
case Stmt::OMPArrayShapingExprClass:
|
||||||
case Stmt::OMPIteratorExprClass:
|
|
||||||
case Stmt::TypeTraitExprClass: {
|
case Stmt::TypeTraitExprClass: {
|
||||||
Bldr.takeNodes(Pred);
|
Bldr.takeNodes(Pred);
|
||||||
ExplodedNodeSet preVisit;
|
ExplodedNodeSet preVisit;
|
||||||
|
|
|
@ -142,7 +142,7 @@ label1 : {
|
||||||
#pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
|
#pragma omp parallel depobj(argc) // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
|
||||||
;
|
;
|
||||||
#pragma omp depobj(x) seq_cst // expected-error {{unexpected OpenMP clause 'seq_cst' in directive '#pragma omp depobj'}}
|
#pragma omp depobj(x) seq_cst // expected-error {{unexpected OpenMP clause 'seq_cst' in directive '#pragma omp depobj'}}
|
||||||
#pragma omp depobj(x) depend(source: x) // expected-error {{expected depend modifier(iterator) or 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}}
|
#pragma omp depobj(x) depend(source: x) // expected-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}}
|
||||||
#pragma omp depobj(x) update // expected-error {{expected '(' after 'update'}}
|
#pragma omp depobj(x) update // expected-error {{expected '(' after 'update'}}
|
||||||
#pragma omp depobj(x) update( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
|
#pragma omp depobj(x) update( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
|
||||||
#pragma omp depobj(x) update(sink // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
|
#pragma omp depobj(x) update(sink // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'update'}}
|
||||||
|
|
|
@ -26,7 +26,7 @@ struct S1 {
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class S7 : public T {
|
class S7 : public T {
|
||||||
protected:
|
protected:
|
||||||
T a, b, c[10], d[10];
|
T a, b;
|
||||||
S7() : a(0) {}
|
S7() : a(0) {}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -34,7 +34,7 @@ public:
|
||||||
omp_depend_t x;
|
omp_depend_t x;
|
||||||
omp_event_handle_t evt;
|
omp_event_handle_t evt;
|
||||||
#pragma omp taskgroup allocate(b) task_reduction(+:b)
|
#pragma omp taskgroup allocate(b) task_reduction(+:b)
|
||||||
#pragma omp task private(a) private(this->a) private(T::a) in_reduction(+:this->b) allocate(b) depend(depobj:x) detach(evt) depend(iterator(i=0:10:1, T *k = &a:&b), in: c[i], d[(int)(k-&a)])
|
#pragma omp task private(a) private(this->a) private(T::a) in_reduction(+:this->b) allocate(b) depend(depobj:x) detach(evt)
|
||||||
for (int k = 0; k < a.a; ++k)
|
for (int k = 0; k < a.a; ++k)
|
||||||
++this->a.a;
|
++this->a.a;
|
||||||
}
|
}
|
||||||
|
@ -47,9 +47,9 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
// CHECK: #pragma omp taskgroup allocate(this->b) task_reduction(+: this->b)
|
// CHECK: #pragma omp taskgroup allocate(this->b) task_reduction(+: this->b)
|
||||||
// CHECK: #pragma omp task private(this->a) private(this->a) private(T::a) in_reduction(+: this->b) allocate(this->b) depend(depobj : x) detach(evt) depend(iterator(int i = 0:10, T * k = &this->a:&this->b), in : this->c[i],this->d[(int)(k - &this->a)]){{$}}
|
// CHECK: #pragma omp task private(this->a) private(this->a) private(T::a) in_reduction(+: this->b) allocate(this->b) depend(depobj : x) detach(evt){{$}}
|
||||||
// CHECK: #pragma omp task private(this->a) private(this->a)
|
// CHECK: #pragma omp task private(this->a) private(this->a)
|
||||||
// CHECK: #pragma omp task private(this->a) private(this->a) private(this->S1::a) in_reduction(+: this->b) allocate(this->b) depend(depobj : x) detach(evt) depend(iterator(int i = 0:10, S1 * k = &this->a:&this->b), in : this->c[i],this->d[(int)(k - &this->a)])
|
// CHECK: #pragma omp task private(this->a) private(this->a) private(this->S1::a)
|
||||||
|
|
||||||
class S8 : public S7<S1> {
|
class S8 : public S7<S1> {
|
||||||
S8() {}
|
S8() {}
|
||||||
|
@ -176,10 +176,10 @@ int main(int argc, char **argv) {
|
||||||
// CHECK-NEXT: foo();
|
// CHECK-NEXT: foo();
|
||||||
#pragma omp taskgroup task_reduction(min: arr1)
|
#pragma omp taskgroup task_reduction(min: arr1)
|
||||||
#pragma omp parallel reduction(+:arr1)
|
#pragma omp parallel reduction(+:arr1)
|
||||||
#pragma omp task in_reduction(min: arr1) depend(iterator(i=0:argc, unsigned j=argc:0:a), out: argv[i][j])
|
#pragma omp task in_reduction(min: arr1)
|
||||||
// CHECK-NEXT: #pragma omp taskgroup task_reduction(min: arr1)
|
// CHECK-NEXT: #pragma omp taskgroup task_reduction(min: arr1)
|
||||||
// CHECK-NEXT: #pragma omp parallel reduction(+: arr1)
|
// CHECK-NEXT: #pragma omp parallel reduction(+: arr1)
|
||||||
// CHECK-NEXT: #pragma omp task in_reduction(min: arr1) depend(iterator(int i = 0:argc, unsigned int j = argc:0), out : argv[i][j])
|
// CHECK-NEXT: #pragma omp task in_reduction(min: arr1)
|
||||||
foo();
|
foo();
|
||||||
// CHECK-NEXT: foo();
|
// CHECK-NEXT: foo();
|
||||||
// CHECK-NEXT: #pragma omp task in_reduction(+: arr1)
|
// CHECK-NEXT: #pragma omp task in_reduction(+: arr1)
|
||||||
|
|
|
@ -28,11 +28,11 @@ int main(int argc, char **argv, char *env[]) {
|
||||||
|
|
||||||
#pragma omp task depend(in : arr[0])
|
#pragma omp task depend(in : arr[0])
|
||||||
#pragma omp task depend // expected-error {{expected '(' after 'depend'}}
|
#pragma omp task depend // expected-error {{expected '(' after 'depend'}}
|
||||||
#pragma omp task depend ( // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-warning {{missing ':' after dependency type - ignoring}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
#pragma omp task depend ( // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-warning {{missing ':' after dependency type - ignoring}} omp50-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
||||||
#pragma omp task depend () // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} expected-warning {{missing ':' after dependency type - ignoring}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
#pragma omp task depend () // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} expected-warning {{missing ':' after dependency type - ignoring}} omp50-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
||||||
#pragma omp task depend (argc // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
#pragma omp task depend (argc // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} omp50-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
||||||
#pragma omp task depend (source : argc) // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
#pragma omp task depend (source : argc) // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} omp50-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
||||||
#pragma omp task depend (source) // expected-error {{expected expression}} expected-warning {{missing ':' after dependency type - ignoring}} omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
#pragma omp task depend (source) // expected-error {{expected expression}} expected-warning {{missing ':' after dependency type - ignoring}} omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} omp50-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
||||||
#pragma omp task depend (in : argc)) // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
|
#pragma omp task depend (in : argc)) // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
|
||||||
#pragma omp task depend (out: ) // expected-error {{expected expression}}
|
#pragma omp task depend (out: ) // expected-error {{expected expression}}
|
||||||
#pragma omp task depend (inout : foobool(argc)), depend (in, argc) // omp50-error {{expected addressable lvalue expression, array element, array section or array shaping expression}} omp45-error {{expected addressable lvalue expression, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
|
#pragma omp task depend (inout : foobool(argc)), depend (in, argc) // omp50-error {{expected addressable lvalue expression, array element, array section or array shaping expression}} omp45-error {{expected addressable lvalue expression, array element or array section}} expected-warning {{missing ':' after dependency type - ignoring}} expected-error {{expected expression}}
|
||||||
|
@ -70,19 +70,7 @@ int main(int argc, char **argv, char *env[]) {
|
||||||
#pragma omp task depend(in : ([a])a) // omp45-error {{expected body of lambda expression}} omp50-error {{expected expression with a pointer to a complete type as a base of an array shaping operation}}
|
#pragma omp task depend(in : ([a])a) // omp45-error {{expected body of lambda expression}} omp50-error {{expected expression with a pointer to a complete type as a base of an array shaping operation}}
|
||||||
#pragma omp task depend(in : ([a])argc) // omp45-error {{expected body of lambda expression}} omp50-error {{expected expression with a pointer to a complete type as a base of an array shaping operation}}
|
#pragma omp task depend(in : ([a])argc) // omp45-error {{expected body of lambda expression}} omp50-error {{expected expression with a pointer to a complete type as a base of an array shaping operation}}
|
||||||
#pragma omp task depend(in : ([-1][0])argv) // omp45-error {{expected variable name or 'this' in lambda capture list}} omp45-error {{expected ')'}} omp45-note {{to match this '('}} omp50-error {{array shaping dimension is evaluated to a non-positive value -1}} omp50-error {{array shaping dimension is evaluated to a non-positive value 0}}
|
#pragma omp task depend(in : ([-1][0])argv) // omp45-error {{expected variable name or 'this' in lambda capture list}} omp45-error {{expected ')'}} omp45-note {{to match this '('}} omp50-error {{array shaping dimension is evaluated to a non-positive value -1}} omp50-error {{array shaping dimension is evaluated to a non-positive value 0}}
|
||||||
#pragma omp task depend(iterator // expected-error {{expected ')'}} omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} expected-warning {{missing ':' after dependency type - ignoring}} expected-note {{to match this '('}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}} omp50-error {{expected '(' after 'iterator'}} omp50-error {{expected ','}}
|
|
||||||
#pragma omp task depend(iterator():argc) // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} omp50-error {{expected ','}} omp50-error {{expected 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}}
|
|
||||||
#pragma omp task depend(iterator(argc // expected-error {{expected ')'}} omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} expected-warning {{missing ':' after dependency type - ignoring}} expected-note {{to match this '('}} omp50-error {{unknown type name 'argc'}} omp50-error {{expected ')'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}} omp50-error {{expected ','}} omp50-note {{to match this '('}}
|
|
||||||
#pragma omp task depend(iterator(unsigned argc: // expected-error {{expected ')'}} omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} expected-warning {{missing ':' after dependency type - ignoring}} expected-note {{to match this '('}} omp50-error {{expected '=' in iterator specifier}} omp50-error 2 {{expected expression}} omp50-error {{expected ',' or ')' after iterator specifier}} omp50-error {{expected ')'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}} omp50-error {{expected ','}} omp50-note {{to match this '('}}
|
|
||||||
#pragma omp task depend(iterator(unsigned argc = // expected-error {{expected ')'}} omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} expected-warning {{missing ':' after dependency type - ignoring}} expected-note {{to match this '('}} omp50-error 2 {{expected expression}} omp50-error {{expected ',' or ')' after iterator specifier}} omp50-error {{expected ')'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}} omp50-error {{expected ','}} omp50-note {{to match this '('}}
|
|
||||||
#pragma omp task depend(iterator(vector argc = 0:2):argc) // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} omp50-error {{expected integral or pointer type as the iterator-type, not 'vector'}} omp50-error {{expected depend modifier(iterator) or 'in', 'out', 'inout', 'mutexinoutset' or 'depobj' in OpenMP clause 'depend'}} omp50-error {{expected ','}}
|
|
||||||
#pragma omp task depend(iterator(vector *argc = nullptr:nullptr+2:0), in:argc) // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} omp50-error {{invalid operands to binary expression ('nullptr_t' and 'int')}} omp50-error {{iterator step expression 0 evaluates to 0}}
|
|
||||||
#pragma omp task depend(iterator(vector *argc = 0:vector():argc), in:argc) // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} omp50-error {{converting 'vector' to incompatible type 'vector *'}}
|
|
||||||
foo();
|
foo();
|
||||||
#pragma omp task depend(iterator(unsigned argc = 0:10), in : argc) // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}}
|
|
||||||
argc = 0;
|
|
||||||
#pragma omp task depend(iterator(i = 0:10, i = 0:10), in : argv[i]) // omp45-error {{expected 'in', 'out', 'inout' or 'mutexinoutset' in OpenMP clause 'depend'}} omp45-error {{use of undeclared identifier 'i'}} omp50-error {{redefinition of 'i'}} omp50-note {{previous definition is here}}
|
|
||||||
i = 0; // expected-error {{use of undeclared identifier 'i'}}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5185,8 +5185,6 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
|
||||||
return cxstring::createRef("OMPArraySectionExpr");
|
return cxstring::createRef("OMPArraySectionExpr");
|
||||||
case CXCursor_OMPArrayShapingExpr:
|
case CXCursor_OMPArrayShapingExpr:
|
||||||
return cxstring::createRef("OMPArrayShapingExpr");
|
return cxstring::createRef("OMPArrayShapingExpr");
|
||||||
case CXCursor_OMPIteratorExpr:
|
|
||||||
return cxstring::createRef("OMPIteratorExpr");
|
|
||||||
case CXCursor_BinaryOperator:
|
case CXCursor_BinaryOperator:
|
||||||
return cxstring::createRef("BinaryOperator");
|
return cxstring::createRef("BinaryOperator");
|
||||||
case CXCursor_CompoundAssignOperator:
|
case CXCursor_CompoundAssignOperator:
|
||||||
|
|
|
@ -427,10 +427,6 @@ CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent,
|
||||||
K = CXCursor_OMPArrayShapingExpr;
|
K = CXCursor_OMPArrayShapingExpr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Stmt::OMPIteratorExprClass:
|
|
||||||
K = CXCursor_OMPIteratorExpr;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Stmt::BinaryOperatorClass:
|
case Stmt::BinaryOperatorClass:
|
||||||
K = CXCursor_BinaryOperator;
|
K = CXCursor_BinaryOperator;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue