[flang] Better check for variables in DATA
authorpeter klausler <pklausler@nvidia.com>
Tue, 14 Jan 2020 19:11:15 +0000 (11:11 -0800)
committerpeter klausler <pklausler@nvidia.com>
Tue, 14 Jan 2020 19:11:15 +0000 (11:11 -0800)
Original-commit: flang-compiler/f18@92e20baaa89fd20cd724bb4414e84670843cc442
Reviewed-on: https://github.com/flang-compiler/f18/pull/926
Tree-same-pre-rewrite: false

flang/lib/semantics/resolve-names.cc
flang/lib/semantics/symbol.h
flang/runtime/CMakeLists.txt
flang/test/semantics/block-data01.f90
flang/test/semantics/symbol09.f90

index 2254be2..05d0c30 100644 (file)
@@ -4617,11 +4617,13 @@ bool ConstructVisitor::Pre(const parser::DataStmtObject &x) {
       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
               }
             }
           },
index 389a994..b37e560 100644 (file)
@@ -458,7 +458,7 @@ public:
       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,
index 99713cc..fbac112 100644 (file)
@@ -6,6 +6,10 @@
 #
 #===------------------------------------------------------------------------===#
 
+# 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
index 86071f9..4295e11 100644 (file)
@@ -13,4 +13,7 @@ block data foo
   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
index 0b285da..9c8ab20 100644 (file)
@@ -135,7 +135,7 @@ subroutine s8
  !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