Author: abataev Date: Fri Mar 22 07:41:39 2019 New Revision: 356752 URL: http://llvm.org/viewvc/llvm-project?rev=356752&view=rev Log: [OPENMP]Emit error message for allocate directive without allocator clause in target region.
According to the OpenMP 5.0, 2.11.3 allocate Directive, Restrictions, allocate directives that appear in a target region must specify an allocator clause unless a requires directive with the dynamic_allocators clause is present in the same compilation unit. Added: cfe/trunk/test/OpenMP/nvptx_allocate_messages.cpp - copied, changed from r356749, cfe/trunk/test/OpenMP/nvptx_allocate_codegen.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/test/OpenMP/nvptx_allocate_codegen.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=356752&r1=356751&r2=356752&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Mar 22 07:41:39 2019 @@ -9152,6 +9152,9 @@ def warn_omp_used_different_allocator : InGroup<OpenMPClauses>; def note_omp_previous_allocator : Note< "previous allocator is specified here">; +def err_expected_allocator_clause : Error<"expected an 'allocator' clause " + "inside of the target region; provide an 'allocator' clause or use 'requires'" + " directive with the 'dynamic_allocators' clause">; } // end of OpenMP category let CategoryName = "Related Result Type Issue" in { Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=356752&r1=356751&r2=356752&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Fri Mar 22 07:41:39 2019 @@ -2243,8 +2243,12 @@ Sema::DeclGroupPtrTy Sema::ActOnOpenMPAl ArrayRef<OMPClause *> Clauses, DeclContext *Owner) { assert(Clauses.size() <= 1 && "Expected at most one clause."); Expr *Allocator = nullptr; - if (!Clauses.empty()) + if (Clauses.empty()) { + if (LangOpts.OpenMPIsDevice) + targetDiag(Loc, diag::err_expected_allocator_clause); + } else { Allocator = cast<OMPAllocatorClause>(Clauses.back())->getAllocator(); + } OMPAllocateDeclAttr::AllocatorTypeTy AllocatorKind = getAllocatorKind(*this, DSAStack, Allocator); SmallVector<Expr *, 8> Vars; Modified: cfe/trunk/test/OpenMP/nvptx_allocate_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/nvptx_allocate_codegen.cpp?rev=356752&r1=356751&r2=356752&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/nvptx_allocate_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/nvptx_allocate_codegen.cpp Fri Mar 22 07:41:39 2019 @@ -64,7 +64,7 @@ int main () { #pragma omp allocate(a) allocator(omp_thread_mem_alloc) a=2; double b = 3; -#pragma omp allocate(b) +#pragma omp allocate(b) allocator(omp_default_mem_alloc) return (foo<int>()); } Copied: cfe/trunk/test/OpenMP/nvptx_allocate_messages.cpp (from r356749, cfe/trunk/test/OpenMP/nvptx_allocate_codegen.cpp) URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/nvptx_allocate_messages.cpp?p2=cfe/trunk/test/OpenMP/nvptx_allocate_messages.cpp&p1=cfe/trunk/test/OpenMP/nvptx_allocate_codegen.cpp&r1=356749&r2=356752&rev=356752&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/nvptx_allocate_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/nvptx_allocate_messages.cpp Fri Mar 22 07:41:39 2019 @@ -1,10 +1,21 @@ // RUN: %clang_cc1 -verify -fopenmp -triple x86_64-apple-darwin10.6.0 -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc -o %t-host.bc %s -// RUN: %clang_cc1 -verify -fopenmp -triple nvptx64-nvidia-cuda -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -o - | FileCheck %s +// RUN: %clang_cc1 -verify -DDEVICE -fopenmp -triple nvptx64-nvidia-cuda -fopenmp-targets=nvptx64-nvidia-cuda -fsyntax-only %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc +#ifndef DEVICE // expected-no-diagnostics +#endif // DEVICE #ifndef HEADER #define HEADER +int bar() { + int res = 0; +#ifdef DEVICE +// expected-error@+2 {{expected an 'allocator' clause inside of the target region; provide an 'allocator' clause or use 'requires' directive with the 'dynamic_allocators' clause}} +#endif // DEVICE +#pragma omp allocate(res) + return 0; +} + #pragma omp declare target typedef void **omp_allocator_handle_t; extern const omp_allocator_handle_t omp_default_mem_alloc; @@ -16,14 +27,6 @@ extern const omp_allocator_handle_t omp_ extern const omp_allocator_handle_t omp_pteam_mem_alloc; extern const omp_allocator_handle_t omp_thread_mem_alloc; -// CHECK-DAG: @{{.+}}St1{{.+}}b{{.+}} = external global i32, -// CHECK-DAG: @a = global i32 0, -// CHECK-DAG: @b = addrspace(4) global i32 0, -// CHECK-DAG: @c = global i32 0, -// CHECK-DAG: @d = global %struct.St1 zeroinitializer, -// CHECK-DAG: @{{.+}}ns{{.+}}a{{.+}} = addrspace(3) global i32 0, -// CHECK-DAG: @{{.+}}main{{.+}}a{{.*}} = internal global i32 0, -// CHECK-DAG: @{{.+}}ST{{.+}}m{{.+}} = external global i32, struct St{ int a; }; @@ -57,20 +60,21 @@ namespace ns{ } #pragma omp allocate(ns::a) allocator(omp_pteam_mem_alloc) -// CHECK-LABEL: @main int main () { - // CHECK: alloca double, static int a; #pragma omp allocate(a) allocator(omp_thread_mem_alloc) a=2; double b = 3; +#ifdef DEVICE +// expected-error@+2 {{expected an 'allocator' clause inside of the target region; provide an 'allocator' clause or use 'requires' directive with the 'dynamic_allocators' clause}} +#endif // DEVICE #pragma omp allocate(b) - return (foo<int>()); +#ifdef DEVICE +// expected-note@+2 {{called by 'main'}} +#endif // DEVICE + return (foo<int>() + bar()); } -// CHECK: define {{.*}}i32 @{{.+}}foo{{.+}}() -// CHECK: alloca i32, - extern template int ST<int>::m; #pragma omp end declare target #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits