forked from OSchip/llvm-project
[OpenMP] Fix C-only clang assert on parsing use_allocator clause of target directive
The parser code assumes building with C++ compiler and asserts when using clang (not clang++) on C file. I made the code dependent on input language. This shows up for amdgpu target. Reviewed By: ABataev Differential Revision: https://reviews.llvm.org/D103899
This commit is contained in:
parent
863184dd69
commit
44f197e94b
|
@ -2708,7 +2708,8 @@ OMPClause *Parser::ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind) {
|
|||
return nullptr;
|
||||
SmallVector<Sema::UsesAllocatorsData, 4> Data;
|
||||
do {
|
||||
ExprResult Allocator = ParseCXXIdExpression();
|
||||
ExprResult Allocator =
|
||||
getLangOpts().CPlusPlus ? ParseCXXIdExpression() : ParseExpression();
|
||||
if (Allocator.isInvalid()) {
|
||||
SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
|
||||
StopBeforeMatch);
|
||||
|
@ -2720,7 +2721,8 @@ OMPClause *Parser::ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind) {
|
|||
BalancedDelimiterTracker T(*this, tok::l_paren,
|
||||
tok::annot_pragma_openmp_end);
|
||||
T.consumeOpen();
|
||||
ExprResult AllocatorTraits = ParseCXXIdExpression();
|
||||
ExprResult AllocatorTraits =
|
||||
getLangOpts().CPlusPlus ? ParseCXXIdExpression() : ParseExpression();
|
||||
T.consumeClose();
|
||||
if (AllocatorTraits.isInvalid()) {
|
||||
SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
// Test host codegen.
|
||||
// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu
|
||||
|
||||
// expected-no-diagnostics
|
||||
#ifndef HEADER
|
||||
#define HEADER
|
||||
|
||||
enum omp_allocator_handle_t {
|
||||
omp_null_allocator = 0,
|
||||
omp_default_mem_alloc = 1,
|
||||
omp_large_cap_mem_alloc = 2,
|
||||
omp_const_mem_alloc = 3,
|
||||
omp_high_bw_mem_alloc = 4,
|
||||
omp_low_lat_mem_alloc = 5,
|
||||
omp_cgroup_mem_alloc = 6,
|
||||
omp_pteam_mem_alloc = 7,
|
||||
omp_thread_mem_alloc = 8,
|
||||
KMP_ALLOCATOR_MAX_HANDLE = __UINTPTR_MAX__
|
||||
};
|
||||
|
||||
// CHECK: define {{.*}}[[FIE:@.+]]()
|
||||
void fie() {
|
||||
int x;
|
||||
#pragma omp target uses_allocators(omp_null_allocator) allocate(omp_null_allocator: x) firstprivate(x)
|
||||
{}
|
||||
#pragma omp target uses_allocators(omp_default_mem_alloc) allocate(omp_default_mem_alloc: x) firstprivate(x)
|
||||
{}
|
||||
#pragma omp target uses_allocators(omp_large_cap_mem_alloc) allocate(omp_large_cap_mem_alloc: x) firstprivate(x)
|
||||
{}
|
||||
#pragma omp target uses_allocators(omp_const_mem_alloc) allocate(omp_const_mem_alloc: x) firstprivate(x)
|
||||
{}
|
||||
#pragma omp target uses_allocators(omp_high_bw_mem_alloc) allocate(omp_high_bw_mem_alloc: x) firstprivate(x)
|
||||
{}
|
||||
#pragma omp target uses_allocators(omp_low_lat_mem_alloc) allocate(omp_low_lat_mem_alloc: x) firstprivate(x)
|
||||
{}
|
||||
#pragma omp target uses_allocators(omp_cgroup_mem_alloc) allocate(omp_cgroup_mem_alloc: x) firstprivate(x)
|
||||
{}
|
||||
#pragma omp target uses_allocators(omp_pteam_mem_alloc) allocate(omp_pteam_mem_alloc: x) firstprivate(x)
|
||||
{}
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue