From 822dd156ad30bc719fd454213c1a82b044e78c73 Mon Sep 17 00:00:00 2001 From: Sunil Kuravinakop Date: Mon, 27 Oct 2025 11:20:55 -0500 Subject: [PATCH 1/7] 1) In the default clause, changing check for allocatable type in variable category. 2) Adding a new test case clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp 3) Taking care of new comments in https://github.com/llvm/llvm-project/pull/157063 --- clang/lib/Sema/SemaOpenMP.cpp | 25 +++- ...allel_default_variableCategory_codegen.cpp | 117 ++++++++++++++++++ 2 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 5b5b1b685e153..f677be7f02583 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1314,6 +1314,22 @@ static std::string getOpenMPClauseNameForDiag(OpenMPClauseKind C) { return getOpenMPClauseName(C).str(); } +bool isAllocatableType(QualType QT) { + if (QT->isPointerType()) + return true; + QT = QT.getCanonicalType().getUnqualifiedType(); + if (const CXXRecordDecl *RD = QT->getAsCXXRecordDecl()) { + if (isa(RD)) { + std::string QName = RD->getQualifiedNameAsString(); + return (QName == "std::vector" || QName == "vector" || + QName == "std::unique_ptr" || QName == "unique_ptr" || + QName == "std::shared_ptr" || QName == "shared_ptr" || + QName == "llvm::SmallVector" || QName == "SmallVector"); + } + } + return false; +} + DSAStackTy::DSAVarData DSAStackTy::getDSA(const_iterator &Iter, ValueDecl *D) const { D = getCanonicalDecl(D); @@ -1370,20 +1386,19 @@ DSAStackTy::DSAVarData DSAStackTy::getDSA(const_iterator &Iter, DefaultDataSharingAttributes IterDA = Iter->DefaultAttr; switch (Iter->DefaultVCAttr) { case DSA_VC_aggregate: - if (!VD->getType()->isAggregateType()) + if (!D->getType()->isAggregateType()) IterDA = DSA_none; break; case DSA_VC_allocatable: - if (!(VD->getType()->isPointerType() || - VD->getType()->isVariableArrayType())) + if (!isAllocatableType(D->getType())) IterDA = DSA_none; break; case DSA_VC_pointer: - if (!VD->getType()->isPointerType()) + if (!D->getType()->isPointerType()) IterDA = DSA_none; break; case DSA_VC_scalar: - if (!VD->getType()->isScalarType()) + if (!D->getType()->isScalarType()) IterDA = DSA_none; break; case DSA_VC_all: diff --git a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp new file mode 100644 index 0000000000000..b0674158f57e5 --- /dev/null +++ b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp @@ -0,0 +1,117 @@ +// RUN: %clangxx -DOMP60 -Xclang -verify -Wno-vla -fopenmp -fopenmp-version=60 -x c++ -S -emit-llvm %s -o - | FileCheck --check-prefixes=OMP60 %s +// expected-no-diagnostics +#ifndef HEADER +#define HEADER + +#include + +int global; +#define VECTOR_SIZE 4 +int main (int argc, char **argv) { + int i,n; + int x; + + n = VECTOR_SIZE; + + #pragma omp parallel masked firstprivate(x) num_threads(2) + { + int *xPtr = nullptr; + // scalar + #pragma omp task default(shared:scalar) + { + xPtr = &x; + } + #pragma omp taskwait + + // pointer + #pragma omp task default(shared:pointer) shared(x) + { + xPtr = &x; + } + #pragma omp taskwait + } + + int *aggregate[VECTOR_SIZE] = {0,0,0,0}; + std::vector arr(VECTOR_SIZE,0); + + #pragma omp parallel masked num_threads(2) + { + // aggregate + #pragma omp task default(shared:aggregate) + for(i=0;i Date: Wed, 5 Nov 2025 23:41:30 -0600 Subject: [PATCH 2/7] 1) Correcting the expected output of llvm IR in clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp. 2) Taking care of the feedback (from Alexey) in SemaOpenMP.cpp. --- clang/lib/Sema/SemaOpenMP.cpp | 29 ++++++++++++------- ...allel_default_variableCategory_codegen.cpp | 2 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index c0ca5fda3b8eb..42430905538ad 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1314,19 +1314,28 @@ static std::string getOpenMPClauseNameForDiag(OpenMPClauseKind C) { return getOpenMPClauseName(C).str(); } -bool isAllocatableType(QualType QT) { +static bool isAllocatableType(QualType QT) { if (QT->isPointerType()) return true; + QT = QT.getCanonicalType().getUnqualifiedType(); - if (const CXXRecordDecl *RD = QT->getAsCXXRecordDecl()) { - if (isa(RD)) { - std::string QName = RD->getQualifiedNameAsString(); - return (QName == "std::vector" || QName == "vector" || - QName == "std::unique_ptr" || QName == "unique_ptr" || - QName == "std::shared_ptr" || QName == "shared_ptr" || - QName == "llvm::SmallVector" || QName == "SmallVector"); - } - } + if (const auto *RD = QT->getAsCXXRecordDecl()) + if (const auto *Spec = dyn_cast(RD)) + if (const auto *CTD = Spec->getSpecializedTemplate()) + if (const auto *NS = + dyn_cast_or_null(CTD->getDeclContext())) { + StringRef Name = CTD->getIdentifier()->getName(); + + if (NS->isStdNamespace()) + if (Name == "vector" || Name == "unique_ptr" || + Name == "shared_ptr" || Name == "array") + return true; + + if (NS->getIdentifier()->getName() == "llvm") + if (Name == "SmallVector") + return true; + } + return false; } diff --git a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp index b0674158f57e5..e1af3be4f7140 100644 --- a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp +++ b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp @@ -87,7 +87,7 @@ int main (int argc, char **argv) { // // OMP60: define {{.*}}main.omp_outlined{{.*}} // OMP60-NEXT: entry: -// OMP60-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 +// OMP60: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 // OMP60-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 // OMP60: [[I_ADDR:%.*]] = alloca{{.*}} // OMP60-NEXT: [[N_ADDR:%.*]] = alloca{{.*}} From 99310f54b0e03a013642fedc61c233ab81008c24 Mon Sep 17 00:00:00 2001 From: Sunil Kuravinakop Date: Thu, 6 Nov 2025 13:16:59 -0600 Subject: [PATCH 3/7] Removing unnecessary variable in the CHECK: for clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp --- ...rallel_default_variableCategory_codegen.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp index e1af3be4f7140..09dc10d48b86f 100644 --- a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp +++ b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp @@ -75,26 +75,22 @@ int main (int argc, char **argv) { // OMP60-LABEL: define {{.*}}main.omp_outlined{{.*}} // OMP60-NEXT: entry: -// OMP60-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 -// OMP60-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 -// OMP60: [[X_ADDR:%.*]] = alloca{{.*}} -// OMP60: [[xPTR:%.*]] = alloca{{.*}} -// OMP60: store ptr null, ptr [[xPTR]]{{.*}} -// OMP60: store ptr [[xPTR]]{{.*}} -// OMP60: store ptr [[X_ADDR]]{{.*}} +// OMP60: %x.addr = alloca{{.*}} +// OMP60: %xPtr = alloca +// OMP60: store ptr null, ptr %xPtr{{.*}} +// OMP60: store ptr %xPtr{{.*}} +// OMP60: store ptr %x.addr{{.*}} // OMP60-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} // OMP60: ret void // // OMP60: define {{.*}}main.omp_outlined{{.*}} // OMP60-NEXT: entry: -// OMP60: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8 -// OMP60-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8 -// OMP60: [[I_ADDR:%.*]] = alloca{{.*}} +// OMP60: %i.addr = alloca{{.*}} // OMP60-NEXT: [[N_ADDR:%.*]] = alloca{{.*}} // OMP60-NEXT: [[AGGREGATE_ADDR:%.*]] = alloca{{.*}} // OMP60-NEXT: [[X_ADDR:%.*]] = alloca{{.*}} // OMP60-NEXT: [[ARR_ADDR:%.*]] = alloca{{.*}} -// OMP60: [[TMP0:%.*]] = load{{.*}}[[I_ADDR]] +// OMP60: [[TMP0:%.*]] = load{{.*}}%i.addr // OMP60-NEXT: [[TMP1:%.*]] = load{{.*}}[[N_ADDR]] // OMP60-NEXT: [[TMP2:%.*]] = load{{.*}}[[AGGREGATE_ADDR]] // OMP60-NEXT: [[TMP3:%.*]] = load{{.*}}[[X_ADDR]] From ee86fd0234a4a923fb8c3c5783a73efae378ab93 Mon Sep 17 00:00:00 2001 From: Sunil Kuravinakop Date: Fri, 7 Nov 2025 04:14:30 -0600 Subject: [PATCH 4/7] Changes to avoid failure on Windows. --- ...allel_default_variableCategory_codegen.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp index 09dc10d48b86f..56542429e578a 100644 --- a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp +++ b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp @@ -76,7 +76,7 @@ int main (int argc, char **argv) { // OMP60-LABEL: define {{.*}}main.omp_outlined{{.*}} // OMP60-NEXT: entry: // OMP60: %x.addr = alloca{{.*}} -// OMP60: %xPtr = alloca +// OMP60: %xPtr = alloca{{.*}} // OMP60: store ptr null, ptr %xPtr{{.*}} // OMP60: store ptr %xPtr{{.*}} // OMP60: store ptr %x.addr{{.*}} @@ -86,15 +86,15 @@ int main (int argc, char **argv) { // OMP60: define {{.*}}main.omp_outlined{{.*}} // OMP60-NEXT: entry: // OMP60: %i.addr = alloca{{.*}} -// OMP60-NEXT: [[N_ADDR:%.*]] = alloca{{.*}} -// OMP60-NEXT: [[AGGREGATE_ADDR:%.*]] = alloca{{.*}} -// OMP60-NEXT: [[X_ADDR:%.*]] = alloca{{.*}} -// OMP60-NEXT: [[ARR_ADDR:%.*]] = alloca{{.*}} -// OMP60: [[TMP0:%.*]] = load{{.*}}%i.addr -// OMP60-NEXT: [[TMP1:%.*]] = load{{.*}}[[N_ADDR]] -// OMP60-NEXT: [[TMP2:%.*]] = load{{.*}}[[AGGREGATE_ADDR]] -// OMP60-NEXT: [[TMP3:%.*]] = load{{.*}}[[X_ADDR]] -// OMP60-NEXT: [[TMP4:%.*]] = load{{.*}}[[ARR_ADDR]] +// OMP60-NEXT: %n.addr = alloca{{.*}} +// OMP60-NEXT: %aggregate.addr = alloca{{.*}} +// OMP60-NEXT: %x.addr = alloca{{.*}} +// OMP60-NEXT: %arr.addr = alloca{{.*}} +// OMP60: [[TMP0:%.*]] = load{{.*}}%i.addr{{.*}} +// OMP60-NEXT: [[TMP1:%.*]] = load{{.*}}%n.addr{{.*}} +// OMP60-NEXT: [[TMP2:%.*]] = load{{.*}}%aggregate.addr{{.*}} +// OMP60-NEXT: [[TMP3:%.*]] = load{{.*}}%x.addr{{.*}} +// OMP60-NEXT: [[TMP4:%.*]] = load{{.*}}%arr.addr{{.*}} // OMP60: store ptr [[TMP2]]{{.*}} // OMP60-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} // OMP60: store ptr [[TMP2]]{{.*}} From d4ee726f51d4d3b1f02c85ff614231bef3d53907 Mon Sep 17 00:00:00 2001 From: Sunil Kuravinakop Date: Tue, 11 Nov 2025 03:52:46 -0600 Subject: [PATCH 5/7] Taking care of llvm-lit failure on windows. --- ...allel_default_variableCategory_codegen.cpp | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp index 56542429e578a..ba5d79a8eb233 100644 --- a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp +++ b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp @@ -1,4 +1,4 @@ -// RUN: %clangxx -DOMP60 -Xclang -verify -Wno-vla -fopenmp -fopenmp-version=60 -x c++ -S -emit-llvm %s -o - | FileCheck --check-prefixes=OMP60 %s +// RUN: %clangxx -Xclang -verify -Wno-vla -fopenmp -fopenmp-version=60 -x c++ -S -emit-llvm %s -o - | FileCheck %s // expected-no-diagnostics #ifndef HEADER #define HEADER @@ -73,41 +73,41 @@ int main (int argc, char **argv) { #endif -// OMP60-LABEL: define {{.*}}main.omp_outlined{{.*}} -// OMP60-NEXT: entry: -// OMP60: %x.addr = alloca{{.*}} -// OMP60: %xPtr = alloca{{.*}} -// OMP60: store ptr null, ptr %xPtr{{.*}} -// OMP60: store ptr %xPtr{{.*}} -// OMP60: store ptr %x.addr{{.*}} -// OMP60-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} -// OMP60: ret void +// CHECK-LABEL: define {{.*}}main.omp_outlined{{.*}} +// CHECK-NEXT: entry: +// CHECK: %x.addr = alloca{{.*}} +// CHECK: %xPtr = alloca{{.*}} +// CHECK: store ptr null, ptr %xPtr{{.*}} +// CHECK: store ptr %xPtr{{.*}} +// CHECK: store ptr %x.addr{{.*}} +// CHECK-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} +// CHECK: ret void // -// OMP60: define {{.*}}main.omp_outlined{{.*}} -// OMP60-NEXT: entry: -// OMP60: %i.addr = alloca{{.*}} -// OMP60-NEXT: %n.addr = alloca{{.*}} -// OMP60-NEXT: %aggregate.addr = alloca{{.*}} -// OMP60-NEXT: %x.addr = alloca{{.*}} -// OMP60-NEXT: %arr.addr = alloca{{.*}} -// OMP60: [[TMP0:%.*]] = load{{.*}}%i.addr{{.*}} -// OMP60-NEXT: [[TMP1:%.*]] = load{{.*}}%n.addr{{.*}} -// OMP60-NEXT: [[TMP2:%.*]] = load{{.*}}%aggregate.addr{{.*}} -// OMP60-NEXT: [[TMP3:%.*]] = load{{.*}}%x.addr{{.*}} -// OMP60-NEXT: [[TMP4:%.*]] = load{{.*}}%arr.addr{{.*}} -// OMP60: store ptr [[TMP2]]{{.*}} -// OMP60-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} -// OMP60: store ptr [[TMP2]]{{.*}} -// OMP60: store ptr [[TMP3]]{{.*}} -// OMP60-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} -// OMP60: store ptr [[TMP4]]{{.*}} -// OMP60-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} -// OMP60: store ptr [[TMP4]]{{.*}} -// OMP60: store ptr [[TMP3]]{{.*}} -// OMP60-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} -// OMP60: store ptr [[TMP0]]{{.*}} -// OMP60: store ptr [[TMP1]]{{.*}} -// OMP60: store ptr [[TMP2]]{{.*}} -// OMP60: store ptr [[TMP3]]{{.*}} -// OMP60-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} -// OMP60: ret void +// CHECK: define {{.*}}main.omp_outlined{{.*}} +// CHECK-NEXT: entry: +// CHECK-DAG: %i.addr = alloca{{.*}} +// CHECK-DAG: %n.addr = alloca{{.*}} +// CHECK-DAG: %aggregate.addr = alloca{{.*}} +// CHECK-DAG: %x.addr = alloca{{.*}} +// CHECK-DAG: %arr.addr = alloca{{.*}} +// CHECK: [[TMP0:%.*]] = load{{.*}}%i.addr{{.*}} +// CHECK-NEXT: [[TMP1:%.*]] = load{{.*}}%n.addr{{.*}} +// CHECK-NEXT: [[TMP2:%.*]] = load{{.*}}%aggregate.addr{{.*}} +// CHECK-NEXT: [[TMP3:%.*]] = load{{.*}}%x.addr{{.*}} +// CHECK-NEXT: [[TMP4:%.*]] = load{{.*}}%arr.addr{{.*}} +// CHECK: store ptr [[TMP2]]{{.*}} +// CHECK-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} +// CHECK: store ptr [[TMP2]]{{.*}} +// CHECK: store ptr [[TMP3]]{{.*}} +// CHECK-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} +// CHECK: store ptr [[TMP4]]{{.*}} +// CHECK-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} +// CHECK: store ptr [[TMP4]]{{.*}} +// CHECK: store ptr [[TMP3]]{{.*}} +// CHECK-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} +// CHECK: store ptr [[TMP0]]{{.*}} +// CHECK: store ptr [[TMP1]]{{.*}} +// CHECK: store ptr [[TMP2]]{{.*}} +// CHECK: store ptr [[TMP3]]{{.*}} +// CHECK-NEXT: {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}} +// CHECK: ret void From 528fd62bf8cf324ca834a82d0c0a81bb57de7b21 Mon Sep 17 00:00:00 2001 From: Sunil Kuravinakop Date: Thu, 13 Nov 2025 02:41:19 -0600 Subject: [PATCH 6/7] Removing handling of "allocatable". I do not find a way to handle it at present. --- clang/lib/Sema/SemaOpenMP.cpp | 29 ------------------- ...allel_default_variableCategory_codegen.cpp | 21 -------------- 2 files changed, 50 deletions(-) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index ba6dd12579d90..07d15aff0b33d 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1314,31 +1314,6 @@ static std::string getOpenMPClauseNameForDiag(OpenMPClauseKind C) { return getOpenMPClauseName(C).str(); } -static bool isAllocatableType(QualType QT) { - if (QT->isPointerType()) - return true; - - QT = QT.getCanonicalType().getUnqualifiedType(); - if (const auto *RD = QT->getAsCXXRecordDecl()) - if (const auto *Spec = dyn_cast(RD)) - if (const auto *CTD = Spec->getSpecializedTemplate()) - if (const auto *NS = - dyn_cast_or_null(CTD->getDeclContext())) { - StringRef Name = CTD->getIdentifier()->getName(); - - if (NS->isStdNamespace()) - if (Name == "vector" || Name == "unique_ptr" || - Name == "shared_ptr" || Name == "array") - return true; - - if (NS->getIdentifier()->getName() == "llvm") - if (Name == "SmallVector") - return true; - } - - return false; -} - DSAStackTy::DSAVarData DSAStackTy::getDSA(const_iterator &Iter, ValueDecl *D) const { D = getCanonicalDecl(D); @@ -1398,10 +1373,6 @@ DSAStackTy::DSAVarData DSAStackTy::getDSA(const_iterator &Iter, if (!D->getType()->isAggregateType()) IterDA = DSA_none; break; - case DSA_VC_allocatable: - if (!isAllocatableType(D->getType())) - IterDA = DSA_none; - break; case DSA_VC_pointer: if (!D->getType()->isPointerType()) IterDA = DSA_none; diff --git a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp index ba5d79a8eb233..f7dc74c503537 100644 --- a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp +++ b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp @@ -32,7 +32,6 @@ int main (int argc, char **argv) { } int *aggregate[VECTOR_SIZE] = {0,0,0,0}; - std::vector arr(VECTOR_SIZE,0); #pragma omp parallel masked num_threads(2) { @@ -49,19 +48,6 @@ int main (int argc, char **argv) { } #pragma omp taskwait - // allocatable - #pragma omp task default(shared:allocatable) - for(i=0;i Date: Thu, 13 Nov 2025 03:06:32 -0600 Subject: [PATCH 7/7] Avoiding compilation error with Ninja. --- clang/lib/Sema/SemaOpenMP.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 07d15aff0b33d..b1a02f79feab2 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1373,6 +1373,10 @@ DSAStackTy::DSAVarData DSAStackTy::getDSA(const_iterator &Iter, if (!D->getType()->isAggregateType()) IterDA = DSA_none; break; + case DSA_VC_allocatable: + // TBD: DSA_VC_allocatable + IterDA = DSA_none; + break; case DSA_VC_pointer: if (!D->getType()->isPointerType()) IterDA = DSA_none;