common::visitors{
[&](const Indirection<parser::Variable> &y) {
Walk(y.value());
- if (const auto *expr{y.value().typedExpr.get()}) {
- if (Symbol *
- symbol{
- const_cast<Symbol *>(evaluate::GetFirstSymbol(*expr))}) {
- symbol->set(Symbol::Flag::InDataStmt);
+ if (auto expr{AnalyzeExpr(context(), y)}) {
+ if (auto dataRef{evaluate::ExtractDataRef(*expr)}) {
+ const_cast<Symbol &>(dataRef->GetFirstSymbol())
+ .set(Symbol::Flag::InDataStmt);
+ // TODO check C875-C881 here?
+ } else {
+ // TODO C875 error: variable is not a designator
}
}
},
LocalityLocal, // named in LOCAL locality-spec
LocalityLocalInit, // named in LOCAL_INIT locality-spec
LocalityShared, // named in SHARED locality-spec
- InDataStmt, // appears in a DATA statement
+ InDataStmt, // initialized in a DATA statement
// OpenMP data-sharing attribute
OmpShared, OmpPrivate, OmpLinear, OmpFirstPrivate, OmpLastPrivate,
#
#===------------------------------------------------------------------------===#
+# Allow an unresolved external reference to the entry point of the
+# Fortran main PROGRAM from main.cc.
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -u __FortranProgram")
+
add_library(FortranRuntime
ISO_Fortran_binding.cc
derived-type.cc
real :: inBlankCommon
data inBlankCommon / 1.0 /
common inBlankCommon
+ !ERROR: An initialized variable in BLOCK DATA must be in a COMMON block
+ integer :: inDataButNotCommon
+ data inDataButNotCommon / 1 /
end block data
!DEF: /s8/ImpliedDos1/i (Implicit) ObjectEntity INTEGER(4)
!REF: /s8/z
!DEF: /s8/ImpliedDos2/i (Implicit) ObjectEntity INTEGER(4)
- !DEF: /s8/x (Implicit) ObjectEntity REAL(4)
+ !DEF: /s8/x (Implicit, InDataStmt) ObjectEntity REAL(4)
!REF: /s8/one
data (y(i),i=1,10),(z(i),i=1,10),x/21*one/
end subroutine