diff --git a/flang/lib/Semantics/compute-offsets.cpp b/flang/lib/Semantics/compute-offsets.cpp index 6d4fce2f00a6d..1c48d33549a2e 100644 --- a/flang/lib/Semantics/compute-offsets.cpp +++ b/flang/lib/Semantics/compute-offsets.cpp @@ -239,7 +239,9 @@ void ComputeOffsetsHelper::DoCommonBlock(Symbol &commonBlock) { std::size_t minAlignment{0}; UnorderedSymbolSet previous; for (auto object : details.objects()) { - Symbol &symbol{*object}; + // Allow for host association when the common block is + // OpenMP firstprivate. + Symbol &symbol{object->GetUltimate()}; auto errorSite{ commonBlock.name().empty() ? symbol.name() : commonBlock.name()}; if (std::size_t padding{DoSymbol(symbol.GetUltimate())}) { diff --git a/flang/lib/Semantics/symbol.cpp b/flang/lib/Semantics/symbol.cpp index 2259cfcf23ece..a6b402c48d4ff 100644 --- a/flang/lib/Semantics/symbol.cpp +++ b/flang/lib/Semantics/symbol.cpp @@ -611,7 +611,7 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &os, const Details &details) { sep = ','; } }, - [](const HostAssocDetails &) {}, + [&os](const HostAssocDetails &x) { os << " => " << x.symbol(); }, [&](const ProcBindingDetails &x) { os << " => " << x.symbol().name(); DumpOptional(os, "passName", x.passName()); diff --git a/flang/test/Semantics/cuf-device-procedures01.cuf b/flang/test/Semantics/cuf-device-procedures01.cuf index 92ee02bb3c64d..d8883860f46b2 100644 --- a/flang/test/Semantics/cuf-device-procedures01.cuf +++ b/flang/test/Semantics/cuf-device-procedures01.cuf @@ -40,5 +40,5 @@ subroutine host() end subroutine ! CHECK-LABEL: Subprogram scope: host -! CHECK: atomicadd, EXTERNAL: HostAssoc{{$}} -! CHECK: syncthreads, EXTERNAL: HostAssoc{{$}} +! CHECK: atomicadd, EXTERNAL: HostAssoc => atomicadd, EXTERNAL (Function, Implicit): ProcEntity REAL(4){{$}} +! CHECK: syncthreads, EXTERNAL: HostAssoc => syncthreads, EXTERNAL (Subroutine): ProcEntity{{$}} diff --git a/flang/test/Semantics/offsets05.f90 b/flang/test/Semantics/offsets05.f90 new file mode 100644 index 0000000000000..d88fe788576fd --- /dev/null +++ b/flang/test/Semantics/offsets05.f90 @@ -0,0 +1,20 @@ +!RUN: %flang_fc1 -fdebug-dump-symbols -fopenmp %s | FileCheck %s + +subroutine sub + common /block/ a + equivalence (b,c), (d,e), (a,f) +!$omp parallel firstprivate(/block/) +!$omp end parallel +end subroutine + +!CHECK: a (Implicit, InCommonBlock) size=4 offset=0: ObjectEntity type: REAL(4) +!CHECK: b (Implicit) size=4 offset=0: ObjectEntity type: REAL(4) +!CHECK: c (Implicit) size=4 offset=0: ObjectEntity type: REAL(4) +!CHECK: d (Implicit) size=4 offset=4: ObjectEntity type: REAL(4) +!CHECK: e (Implicit) size=4 offset=4: ObjectEntity type: REAL(4) +!CHECK: f (Implicit) size=4 offset=0: ObjectEntity type: REAL(4) +!CHECK: sub (Subroutine): HostAssoc => sub (Subroutine): Subprogram () +!CHECK: Equivalence Sets: (b,c) (d,e) (a,f) +!CHECK: block size=4 offset=0: CommonBlockDetails alignment=4: a +!CHECK: OtherConstruct scope: +!CHECK: a (OmpFirstPrivate, OmpExplicit): HostAssoc => a (Implicit, InCommonBlock) size=4 offset=0: ObjectEntity type: REAL(4)