[flang-commits] [flang] a1ac5a5 - [flang] Allow OpenMP declarations before type declarations (#112414)

via flang-commits flang-commits at lists.llvm.org
Thu Oct 17 07:32:25 PDT 2024


Author: Leandro Lupori
Date: 2024-10-17T11:32:21-03:00
New Revision: a1ac5a57ae13d22d20c6ac71fbbccbd9f87b0a72

URL: https://github.com/llvm/llvm-project/commit/a1ac5a57ae13d22d20c6ac71fbbccbd9f87b0a72
DIFF: https://github.com/llvm/llvm-project/commit/a1ac5a57ae13d22d20c6ac71fbbccbd9f87b0a72.diff

LOG: [flang] Allow OpenMP declarations before type declarations (#112414)

Skip resolving implicit types for OpenMP declarative directives, to
allow them to appear before type declarations, which is supported
by several compilers. This was discussed in

https://discourse.llvm.org/t/rfc-openmp-should-type-declaration-be-allowed-after-threadprivate/81345.

This fixes the semantic errors of
https://github.com/llvm/llvm-project/issues/106021.

Added: 
    flang/test/Semantics/OpenMP/declarative-directive01.f90
    flang/test/Semantics/OpenMP/declarative-directive02.f90

Modified: 
    flang/lib/Semantics/resolve-names.cpp
    flang/test/Semantics/OpenMP/declare-target06.f90

Removed: 
    flang/test/Semantics/OpenMP/declarative-directive.f90


################################################################################
diff  --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index f1ce0b415ebe9c..2fa5b75e073b63 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -720,6 +720,7 @@ class ScopeHandler : public ImplicitRulesVisitor {
 
   bool inSpecificationPart_{false};
   bool deferImplicitTyping_{false};
+  bool skipImplicitTyping_{false};
   bool inEquivalenceStmt_{false};
 
   // Some information is collected from a specification part for deferred
@@ -758,6 +759,10 @@ class ScopeHandler : public ImplicitRulesVisitor {
     }
   }
 
+  void SkipImplicitTyping(bool skip) {
+    deferImplicitTyping_ = skipImplicitTyping_ = skip;
+  }
+
 private:
   Scope *currScope_{nullptr};
   FuncResultStack funcResultStack_{*this};
@@ -1506,6 +1511,25 @@ class OmpVisitor : public virtual DeclarationVisitor {
   void Post(const parser::OmpEndCriticalDirective &) {
     messageHandler().set_currStmtSource(std::nullopt);
   }
+  bool Pre(const parser::OpenMPThreadprivate &) {
+    SkipImplicitTyping(true);
+    return true;
+  }
+  void Post(const parser::OpenMPThreadprivate &) { SkipImplicitTyping(false); }
+  bool Pre(const parser::OpenMPDeclareTargetConstruct &) {
+    SkipImplicitTyping(true);
+    return true;
+  }
+  void Post(const parser::OpenMPDeclareTargetConstruct &) {
+    SkipImplicitTyping(false);
+  }
+  bool Pre(const parser::OpenMPDeclarativeAllocate &) {
+    SkipImplicitTyping(true);
+    return true;
+  }
+  void Post(const parser::OpenMPDeclarativeAllocate &) {
+    SkipImplicitTyping(false);
+  }
 };
 
 bool OmpVisitor::NeedsScope(const parser::OpenMPBlockConstruct &x) {
@@ -2557,8 +2581,10 @@ void ScopeHandler::ApplyImplicitRules(
     return;
   }
   if (const DeclTypeSpec * type{GetImplicitType(symbol)}) {
-    symbol.set(Symbol::Flag::Implicit);
-    symbol.SetType(*type);
+    if (!skipImplicitTyping_) {
+      symbol.set(Symbol::Flag::Implicit);
+      symbol.SetType(*type);
+    }
     return;
   }
   if (symbol.has<ProcEntityDetails>() && !symbol.attrs().test(Attr::EXTERNAL)) {

diff  --git a/flang/test/Semantics/OpenMP/declarative-directive.f90 b/flang/test/Semantics/OpenMP/declarative-directive01.f90
similarity index 100%
rename from flang/test/Semantics/OpenMP/declarative-directive.f90
rename to flang/test/Semantics/OpenMP/declarative-directive01.f90

diff  --git a/flang/test/Semantics/OpenMP/declarative-directive02.f90 b/flang/test/Semantics/OpenMP/declarative-directive02.f90
new file mode 100644
index 00000000000000..dcde963689eb0d
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/declarative-directive02.f90
@@ -0,0 +1,56 @@
+! RUN: %flang -fsyntax-only -fopenmp %s 2>&1
+
+! Check that OpenMP declarative directives can be used with objects that have
+! an incomplete type.
+
+subroutine test_decl
+  ! OMPv5.2 5.2 threadprivate
+  ! OMPv5.2 6.5 allocate
+  implicit none
+  save :: x1, y1
+  !$omp threadprivate(x1)
+  !$omp allocate(y1)
+  integer :: x1, y1
+
+  ! OMPv5.2 7.7 declare-simd
+  external :: simd_func
+  !$omp declare simd(simd_func)
+  logical :: simd_func
+
+  ! OMPv5.2 7.8.1 declare-target
+  allocatable :: j
+  !$omp declare target(j)
+  save :: j
+  real(kind=8) :: j(:)
+
+  ! OMPv5.2 5.5.11 declare-reduction - crashes
+  !external :: my_add_red
+  !!$omp declare reduction(my_add_red : integer : my_add_red(omp_out, omp_in)) &
+  !!$omp&  initializer(omp_priv=0)
+  !integer :: my_add_red
+end subroutine
+
+subroutine test_decl2
+  save x1, y1
+  !$omp threadprivate(x1)
+  !$omp allocate(y1)
+  integer :: x1, y1
+
+  ! implicit decl
+  !$omp threadprivate(x2)
+  !$omp allocate(y2)
+  save x2, y2
+end subroutine
+
+module m1
+  ! implicit decl
+  !$omp threadprivate(x, y, z)
+  integer :: y
+  real :: z
+
+contains
+  subroutine sub
+    !$omp parallel copyin(x, y, z)
+    !$omp end parallel
+  end subroutine
+end module

diff  --git a/flang/test/Semantics/OpenMP/declare-target06.f90 b/flang/test/Semantics/OpenMP/declare-target06.f90
index 9abcfcecb681ab..7df0a73123094b 100644
--- a/flang/test/Semantics/OpenMP/declare-target06.f90
+++ b/flang/test/Semantics/OpenMP/declare-target06.f90
@@ -6,21 +6,16 @@
 
 module test_0
     implicit none
-!ERROR: The given DECLARE TARGET directive clause has an invalid argument
 !ERROR: No explicit type declared for 'no_implicit_materialization_1'
 !$omp declare target(no_implicit_materialization_1)
 
-!ERROR: The given DECLARE TARGET directive clause has an invalid argument
 !ERROR: No explicit type declared for 'no_implicit_materialization_2'
 !$omp declare target link(no_implicit_materialization_2)
 
-!ERROR: The given DECLARE TARGET directive clause has an invalid argument
 !WARNING: The usage of TO clause on DECLARE TARGET directive has been deprecated. Use ENTER clause instead.
 !ERROR: No explicit type declared for 'no_implicit_materialization_3'
 !$omp declare target to(no_implicit_materialization_3)
 
-!ERROR: The given DECLARE TARGET directive clause has an invalid argument
-!ERROR: No explicit type declared for 'no_implicit_materialization_3'
 !$omp declare target enter(no_implicit_materialization_3)
 
 INTEGER :: data_int = 10


        


More information about the flang-commits mailing list