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/default-kinds.h"
13 #include "flang/Common/interval.h"
14 #include "flang/Evaluate/initial-image.h"
15 #include <list>
16 #include <map>
17 
18 namespace Fortran::parser {
19 struct DataStmtSet;
20 struct DataStmtValue;
21 }
22 namespace Fortran::evaluate {
23 class ExpressionAnalyzer;
24 }
25 namespace Fortran::semantics {
26 
27 class Symbol;
28 
29 struct SymbolDataInitialization {
30   using Range = common::Interval<common::ConstantSubscript>;
SymbolDataInitializationSymbolDataInitialization31   explicit SymbolDataInitialization(std::size_t bytes) : image{bytes} {}
32   SymbolDataInitialization(SymbolDataInitialization &&) = default;
33   evaluate::InitialImage image;
34   std::list<Range> initializedRanges;
35 };
36 
37 using DataInitializations = std::map<const Symbol *, SymbolDataInitialization>;
38 
39 // Matches DATA statement variables with their values and checks
40 // compatibility.
41 void AccumulateDataInitializations(DataInitializations &,
42     evaluate::ExpressionAnalyzer &, const parser::DataStmtSet &);
43 
44 // For legacy DATA-style initialization extension: integer n(2)/1,2/
45 void AccumulateDataInitializations(DataInitializations &,
46     evaluate::ExpressionAnalyzer &, const Symbol &,
47     const std::list<common::Indirection<parser::DataStmtValue>> &);
48 
49 void ConvertToInitializers(
50     DataInitializations &, evaluate::ExpressionAnalyzer &);
51 
52 } // namespace Fortran::semantics
53 #endif // FORTRAN_SEMANTICS_DATA_TO_INITS_H_
54