This adds another puzzle piece for the support of OpenMP DECLARE REDUCTION functionality. This adds support for operators with derived types, as well as declaring multiple different types with the same name or operator. A new detail class for UserReductionDetials is introduced to hold the list of types supported for a given reduction declaration. Tests for parsing and symbol generation added. Declare reduction is still not supported to lowering, it will generate a "Not yet implemented" fatal error. Fixes #141306 Fixes #97241 Fixes #92832 Fixes #66453 --------- Co-authored-by: Mats Petersson <mats.petersson@arm.com>
69 lines
2.3 KiB
C++
69 lines
2.3 KiB
C++
//===-- lib/Semantics/assignment.h ------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef FORTRAN_SEMANTICS_ASSIGNMENT_H_
|
|
#define FORTRAN_SEMANTICS_ASSIGNMENT_H_
|
|
|
|
#include "flang/Common/indirection.h"
|
|
#include "flang/Evaluate/expression.h"
|
|
#include "flang/Semantics/semantics.h"
|
|
|
|
namespace Fortran::parser {
|
|
class ContextualMessages;
|
|
struct AssignmentStmt;
|
|
struct EndWhereStmt;
|
|
struct MaskedElsewhereStmt;
|
|
struct PointerAssignmentStmt;
|
|
struct WhereConstructStmt;
|
|
struct WhereStmt;
|
|
} // namespace Fortran::parser
|
|
|
|
namespace Fortran::semantics {
|
|
|
|
class AssignmentContext;
|
|
class Scope;
|
|
class Symbol;
|
|
|
|
// Applies checks from C1594(5-6) on copying pointers in pure subprograms
|
|
bool CheckCopyabilityInPureScope(parser::ContextualMessages &,
|
|
const evaluate::Expr<evaluate::SomeType> &, const Scope &);
|
|
|
|
class AssignmentChecker : public virtual BaseChecker {
|
|
public:
|
|
explicit AssignmentChecker(SemanticsContext &);
|
|
~AssignmentChecker();
|
|
void Enter(const parser::OpenMPDeclareReductionConstruct &x);
|
|
void Enter(const parser::AssignmentStmt &);
|
|
void Enter(const parser::PointerAssignmentStmt &);
|
|
void Enter(const parser::WhereStmt &);
|
|
void Leave(const parser::WhereStmt &);
|
|
void Enter(const parser::WhereConstructStmt &);
|
|
void Leave(const parser::EndWhereStmt &);
|
|
void Enter(const parser::MaskedElsewhereStmt &);
|
|
void Leave(const parser::MaskedElsewhereStmt &);
|
|
void Enter(const parser::CUFKernelDoConstruct &);
|
|
void Leave(const parser::CUFKernelDoConstruct &);
|
|
void Enter(const parser::OpenACCBlockConstruct &);
|
|
void Leave(const parser::OpenACCBlockConstruct &);
|
|
void Enter(const parser::OpenACCCombinedConstruct &);
|
|
void Leave(const parser::OpenACCCombinedConstruct &);
|
|
void Enter(const parser::OpenACCLoopConstruct &);
|
|
void Leave(const parser::OpenACCLoopConstruct &);
|
|
|
|
SemanticsContext &context();
|
|
|
|
private:
|
|
common::Indirection<AssignmentContext> context_;
|
|
};
|
|
|
|
} // namespace Fortran::semantics
|
|
|
|
extern template class Fortran::common::Indirection<
|
|
Fortran::semantics::AssignmentContext>;
|
|
#endif // FORTRAN_SEMANTICS_ASSIGNMENT_H_
|