forked from OSchip/llvm-project
[OPENMP50]Emit warnings if the functions was defined/used before marked
declare variant. We can use the original function if it was used/emitted already. So, just use warnings for these cases, not errors. llvm-svn: 373010
This commit is contained in:
parent
3b808fb330
commit
1202614d16
|
@ -9452,9 +9452,12 @@ def warn_omp_declare_target_after_first_use : Warning<
|
||||||
InGroup<OpenMPTarget>;
|
InGroup<OpenMPTarget>;
|
||||||
def err_omp_declare_variant_incompat_attributes : Error<
|
def err_omp_declare_variant_incompat_attributes : Error<
|
||||||
"'#pragma omp declare variant' is not compatible with any target-specific attributes">;
|
"'#pragma omp declare variant' is not compatible with any target-specific attributes">;
|
||||||
def err_omp_declare_variant_after_used : Error<
|
def warn_omp_declare_variant_after_used : Warning<
|
||||||
"'#pragma omp declare variant' cannot be applied for function after first "
|
"'#pragma omp declare variant' cannot be applied for function after first "
|
||||||
"usage">;
|
"usage; the original function might be used">, InGroup<SourceUsesOpenMP>;
|
||||||
|
def warn_omp_declare_variant_after_emitted : Warning<
|
||||||
|
"'#pragma omp declare variant' cannot be applied to the function that was defined already;"
|
||||||
|
" the original function might be used">, InGroup<SourceUsesOpenMP>;
|
||||||
def err_omp_declare_variant_noproto : Error<
|
def err_omp_declare_variant_noproto : Error<
|
||||||
"function with '#pragma omp declare variant' must have a prototype">;
|
"function with '#pragma omp declare variant' must have a prototype">;
|
||||||
def note_omp_declare_variant_specified_here : Note<
|
def note_omp_declare_variant_specified_here : Note<
|
||||||
|
|
|
@ -4931,11 +4931,15 @@ Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allow #pragma omp declare variant only if the function is not used.
|
// Allow #pragma omp declare variant only if the function is not used.
|
||||||
if (FD->isUsed(false)) {
|
if (FD->isUsed(false))
|
||||||
Diag(SR.getBegin(), diag::err_omp_declare_variant_after_used)
|
Diag(SR.getBegin(), diag::warn_omp_declare_variant_after_used)
|
||||||
|
<< FD->getLocation();
|
||||||
|
|
||||||
|
// Check if the function was emitted already.
|
||||||
|
if ((LangOpts.EmitAllDecls && FD->isDefined()) ||
|
||||||
|
Context.DeclMustBeEmitted(FD))
|
||||||
|
Diag(SR.getBegin(), diag::warn_omp_declare_variant_after_emitted)
|
||||||
<< FD->getLocation();
|
<< FD->getLocation();
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The VariantRef must point to function.
|
// The VariantRef must point to function.
|
||||||
if (!VariantRef) {
|
if (!VariantRef) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - | FileCheck %s
|
// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - -Wno-source-uses-openmp | FileCheck %s
|
||||||
|
|
||||||
// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - | FileCheck %s
|
// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -std=c++14 -fexceptions -fcxx-exceptions %s -ast-print -o - -Wno-source-uses-openmp | FileCheck %s
|
||||||
|
|
||||||
// expected-no-diagnostics
|
// expected-no-diagnostics
|
||||||
|
|
||||||
|
|
|
@ -76,9 +76,12 @@ int bar() {
|
||||||
return after_use();
|
return after_use();
|
||||||
}
|
}
|
||||||
|
|
||||||
// expected-error@+1 {{'#pragma omp declare variant' cannot be applied for function after first usage}}
|
// expected-warning@+1 {{'#pragma omp declare variant' cannot be applied for function after first usage; the original function might be used}}
|
||||||
#pragma omp declare variant(after_use_variant) match(xxx={})
|
#pragma omp declare variant(after_use_variant) match(xxx={})
|
||||||
int after_use(void);
|
int after_use(void);
|
||||||
|
// expected-warning@+1 {{#pragma omp declare variant' cannot be applied to the function that was defined already; the original function might be used}}
|
||||||
|
#pragma omp declare variant(after_use_variant) match(xxx={})
|
||||||
|
int defined(void) { return 0; }
|
||||||
|
|
||||||
int diff_cc_variant(void);
|
int diff_cc_variant(void);
|
||||||
// expected-error@+1 {{function with '#pragma omp declare variant' has a different calling convention}}
|
// expected-error@+1 {{function with '#pragma omp declare variant' has a different calling convention}}
|
||||||
|
|
|
@ -102,9 +102,7 @@ void h(C *hp, C *hp2, C *hq, C *lin) {
|
||||||
// expected-error@+1 {{variant in '#pragma omp declare variant' with type '<overloaded function type>' is incompatible with type 'void (*)(int *, int *, int *, int *)'}}
|
// expected-error@+1 {{variant in '#pragma omp declare variant' with type '<overloaded function type>' is incompatible with type 'void (*)(int *, int *, int *, int *)'}}
|
||||||
#pragma omp declare variant(barbar <int>) match(xxx = {})
|
#pragma omp declare variant(barbar <int>) match(xxx = {})
|
||||||
template <>
|
template <>
|
||||||
void h(int *hp, int *hp2, int *hq, int *lin) {
|
void h(int *hp, int *hp2, int *hq, int *lin);
|
||||||
h((float *)hp, (float *)hp2, (float *)hq, (float *)lin);
|
|
||||||
}
|
|
||||||
|
|
||||||
int after_use_variant(void);
|
int after_use_variant(void);
|
||||||
int after_use();
|
int after_use();
|
||||||
|
@ -112,7 +110,7 @@ int bar() {
|
||||||
return after_use();
|
return after_use();
|
||||||
}
|
}
|
||||||
|
|
||||||
// expected-error@+1 {{'#pragma omp declare variant' cannot be applied for function after first usage}}
|
// expected-warning@+1 {{'#pragma omp declare variant' cannot be applied for function after first usage; the original function might be used}}
|
||||||
#pragma omp declare variant(after_use_variant) match(xxx = {})
|
#pragma omp declare variant(after_use_variant) match(xxx = {})
|
||||||
int after_use(void);
|
int after_use(void);
|
||||||
|
|
||||||
|
@ -174,6 +172,7 @@ auto fn_deduced_variant() { return 0; }
|
||||||
int fn_deduced();
|
int fn_deduced();
|
||||||
|
|
||||||
int fn_deduced_variant1();
|
int fn_deduced_variant1();
|
||||||
|
// expected-warning@+1 {{'#pragma omp declare variant' cannot be applied to the function that was defined already; the original function might be used}}
|
||||||
#pragma omp declare variant(fn_deduced_variant1) match(xxx = {})
|
#pragma omp declare variant(fn_deduced_variant1) match(xxx = {})
|
||||||
auto fn_deduced1() { return 0; }
|
auto fn_deduced1() { return 0; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue