diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 05561af3fe62b..ac688a69d7fb6 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -763,7 +763,8 @@ static void threadPrivatizeVars(lower::AbstractConverter &converter, commonSyms.insert(common); } symThreadprivateValue = lower::genCommonBlockMember( - converter, currentLocation, *sym, commonThreadprivateValue); + converter, currentLocation, sym->GetUltimate(), + commonThreadprivateValue); } else { symThreadprivateValue = genThreadprivateOp(*sym); } diff --git a/flang/test/Lower/OpenMP/threadprivate-common-block-pointer.f90 b/flang/test/Lower/OpenMP/threadprivate-common-block-pointer.f90 new file mode 100644 index 0000000000000..730d810dc4f2e --- /dev/null +++ b/flang/test/Lower/OpenMP/threadprivate-common-block-pointer.f90 @@ -0,0 +1,31 @@ +! Simple test for lowering of OpenMP Threadprivate Directive with a pointer var +! from a common block. + +!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s +!RUN: bbc -hlfir -emit-hlfir -fopenmp %s -o - | FileCheck %s + +! Regression test for a compiler crash + +module mmm +integer,pointer::nam1 +common /com1/nam1,nam2 +!$omp threadprivate(/com1/) +end +use mmm +!$omp parallel copyin(nam1) +!$omp end parallel +end + + +! CHECK-LABEL: fir.global common @com1_(dense<0> : vector<28xi8>) {alignment = 8 : i64} : !fir.array<28xi8> + +! CHECK-LABEL: func.func @_QQmain() { +! CHECK: %[[VAL_0:.*]] = fir.address_of(@com1_) : !fir.ref> +! CHECK: omp.parallel { +! CHECK: %[[VAL_17:.*]] = omp.threadprivate %[[VAL_0]] : !fir.ref> -> !fir.ref> +! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (!fir.ref>) -> !fir.ref> +! CHECK: %[[VAL_19:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_18]], %[[VAL_19]] : (!fir.ref>, index) -> !fir.ref +! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.ref) -> !fir.ref>> +! CHECK: %[[VAL_22:.*]]:2 = hlfir.declare %[[VAL_21]] {fortran_attrs = #{{.*}}, uniq_name = "_QMmmmEnam1"} : (!fir.ref>>) -> (!fir.ref>>, !fir.ref>>) +