FLANG
data-to-inits.h
1//===-- lib/Semantics/data-to-inits.h -------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef FORTRAN_SEMANTICS_DATA_TO_INITS_H_
10#define FORTRAN_SEMANTICS_DATA_TO_INITS_H_
11
12#include "flang/Common/interval.h"
13#include "flang/Evaluate/fold-designator.h"
14#include "flang/Evaluate/initial-image.h"
15#include "flang/Support/default-kinds.h"
16#include <list>
17#include <map>
18
19namespace Fortran::parser {
20struct DataStmtSet;
21struct DataStmtValue;
22} // namespace Fortran::parser
23namespace Fortran::evaluate {
25}
26namespace Fortran::semantics {
27
28class Symbol;
29
30struct SymbolDataInitialization {
32 struct Item {
33 Item(Range r, bool isD) : range{r}, isDuplicate{isD} {}
34 bool operator<(const Item &that) const { return range < that.range; }
35 Range range;
36 bool isDuplicate;
37 };
38 explicit SymbolDataInitialization(std::size_t bytes) : image{bytes} {}
40
41 void NoteInitializedRange(Range range, bool isDuplicate = false) {
42 if (!initializationItems.empty()) {
43 auto &last{initializationItems.back()};
44 if (last.isDuplicate == isDuplicate &&
45 last.range.AnnexIfPredecessor(range)) {
46 return;
47 }
48 }
49 if (!range.empty()) {
50 initializationItems.emplace_back(range, isDuplicate);
51 }
52 }
53 void NoteInitializedRange(common::ConstantSubscript offset, std::size_t size,
54 bool isDuplicate = false) {
55 NoteInitializedRange(Range{offset, size}, isDuplicate);
56 }
57 void NoteInitializedRange(
58 evaluate::OffsetSymbol offsetSymbol, bool isDuplicate = false) {
59 NoteInitializedRange(
60 offsetSymbol.offset(), offsetSymbol.size(), isDuplicate);
61 }
62
63 evaluate::InitialImage image;
64 std::list<Item> initializationItems;
65};
66
67using DataInitializations = std::map<const Symbol *, SymbolDataInitialization>;
68
69// Matches DATA statement variables with their values and checks
70// compatibility.
71void AccumulateDataInitializations(DataInitializations &,
72 evaluate::ExpressionAnalyzer &, const parser::DataStmtSet &);
73
74// For legacy DATA-style initialization extension: integer n(2)/1,2/
75void AccumulateDataInitializations(DataInitializations &,
76 evaluate::ExpressionAnalyzer &, const Symbol &,
77 const std::list<common::Indirection<parser::DataStmtValue>> &);
78
79void ConvertToInitializers(DataInitializations &,
80 evaluate::ExpressionAnalyzer &, bool forDerivedTypes = true);
81
82} // namespace Fortran::semantics
83#endif // FORTRAN_SEMANTICS_DATA_TO_INITS_H_
Definition interval.h:22
Definition expression.h:103
Definition symbol.h:809
Definition call.h:34
Definition check-expression.h:19
Definition parse-tree.h:1517
Definition parse-tree.h:1483