--- /dev/null
+//===-- Lower/Coarray.h -- image related lowering ---------------*- 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_LOWER_COARRAY_H
+#define FORTRAN_LOWER_COARRAY_H
+
+#include "flang/Lower/AbstractConverter.h"
+#include "flang/Lower/Support/BoxValue.h"
+
+namespace Fortran {
+
+namespace parser {
+struct ChangeTeamConstruct;
+struct ChangeTeamStmt;
+struct EndChangeTeamStmt;
+struct FormTeamStmt;
+} // namespace parser
+
+namespace evaluate {
+class CoarrayRef;
+} // namespace evaluate
+
+namespace lower {
+
+class SymMap;
+
+namespace pft {
+struct Evaluation;
+} // namespace pft
+
+//===----------------------------------------------------------------------===//
+// TEAM constructs
+//===----------------------------------------------------------------------===//
+
+void genChangeTeamConstruct(AbstractConverter &, pft::Evaluation &eval,
+ const parser::ChangeTeamConstruct &);
+void genChangeTeamStmt(AbstractConverter &, pft::Evaluation &eval,
+ const parser::ChangeTeamStmt &);
+void genEndChangeTeamStmt(AbstractConverter &, pft::Evaluation &eval,
+ const parser::EndChangeTeamStmt &);
+void genFormTeamStatement(AbstractConverter &, pft::Evaluation &eval,
+ const parser::FormTeamStmt &);
+
+//===----------------------------------------------------------------------===//
+// COARRAY expressions
+//===----------------------------------------------------------------------===//
+
+/// Coarray expression lowering helper. A coarray expression is expected to be
+/// lowered into runtime support calls. For example, expressions may use a
+/// message-passing runtime to access another image's data.
+class CoarrayExprHelper {
+public:
+ explicit CoarrayExprHelper(AbstractConverter &converter, mlir::Location loc,
+ SymMap &syms)
+ : converter{converter}, symMap{syms}, loc{loc} {}
+ CoarrayExprHelper(const CoarrayExprHelper &) = delete;
+
+ /// Generate the address of a co-array expression.
+ fir::ExtendedValue genAddr(const evaluate::CoarrayRef &expr);
+
+ /// Generate the value of a co-array expression.
+ fir::ExtendedValue genValue(const evaluate::CoarrayRef &expr);
+
+private:
+ AbstractConverter &converter;
+ SymMap &symMap;
+ mlir::Location loc;
+};
+
+} // namespace lower
+} // namespace Fortran
+
+#endif // FORTRAN_LOWER_COARRAY_H
--- /dev/null
+//===-- Coarray.cpp -------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// Implementation of the lowering of image related constructs and expressions.
+/// Fortran images can form teams, communicate via coarrays, etc.
+///
+//===----------------------------------------------------------------------===//
+
+#include "flang/Lower/Coarray.h"
+#include "SymbolMap.h"
+#include "flang/Lower/AbstractConverter.h"
+#include "flang/Lower/FIRBuilder.h"
+#include "flang/Parser/parse-tree.h"
+#include "flang/Semantics/expression.h"
+
+#undef TODO
+#define TODO(MSG) \
+ { \
+ mlir::emitError(converter.getCurrentLocation(), "not yet implemented") \
+ << MSG; \
+ exit(1); \
+ }
+
+//===----------------------------------------------------------------------===//
+// TEAM statements and constructs
+//===----------------------------------------------------------------------===//
+
+void Fortran::lower::genChangeTeamConstruct(
+ Fortran::lower::AbstractConverter &converter,
+ Fortran::lower::pft::Evaluation &,
+ const Fortran::parser::ChangeTeamConstruct &) {
+ TODO("CHANGE TEAM construct");
+}
+
+void Fortran::lower::genChangeTeamStmt(
+ Fortran::lower::AbstractConverter &converter,
+ Fortran::lower::pft::Evaluation &,
+ const Fortran::parser::ChangeTeamStmt &) {
+ TODO("CHANGE TEAM stmt");
+}
+
+void Fortran::lower::genEndChangeTeamStmt(
+ Fortran::lower::AbstractConverter &converter,
+ Fortran::lower::pft::Evaluation &,
+ const Fortran::parser::EndChangeTeamStmt &) {
+ TODO("END CHANGE TEAM");
+}
+
+void Fortran::lower::genFormTeamStatement(
+ Fortran::lower::AbstractConverter &converter,
+ Fortran::lower::pft::Evaluation &, const Fortran::parser::FormTeamStmt &) {
+ TODO("FORM TEAM");
+}
+
+//===----------------------------------------------------------------------===//
+// COARRAY expressions
+//===----------------------------------------------------------------------===//
+
+fir::ExtendedValue Fortran::lower::CoarrayExprHelper::genAddr(
+ const Fortran::evaluate::CoarrayRef &expr) {
+ (void)symMap;
+ TODO("co-array address");
+}
+
+fir::ExtendedValue Fortran::lower::CoarrayExprHelper::genValue(
+ const Fortran::evaluate::CoarrayRef &expr) {
+ TODO("co-array value");
+}