diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2019-09-26 20:04:15 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2019-09-26 20:04:15 +0000 |
commit | 1202614d16e894f244e9f9afd391b1445c7a96c4 (patch) | |
tree | f788c9a8afbc7511d29e466048436022aca1d165 | |
parent | 3b808fb330dd4e2c8bf54e88e0a820e835c278b5 (diff) | |
download | bcm5719-llvm-1202614d16e894f244e9f9afd391b1445c7a96c4.tar.gz bcm5719-llvm-1202614d16e894f244e9f9afd391b1445c7a96c4.zip |
[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
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 7 | ||||
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 12 | ||||
-rw-r--r-- | clang/test/OpenMP/declare_variant_ast_print.cpp | 4 | ||||
-rw-r--r-- | clang/test/OpenMP/declare_variant_messages.c | 5 | ||||
-rw-r--r-- | clang/test/OpenMP/declare_variant_messages.cpp | 7 |
5 files changed, 22 insertions, 13 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 08fe50c4363..c2cef944b6e 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9452,9 +9452,12 @@ def warn_omp_declare_target_after_first_use : Warning< InGroup<OpenMPTarget>; def err_omp_declare_variant_incompat_attributes : Error< "'#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 " - "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< "function with '#pragma omp declare variant' must have a prototype">; def note_omp_declare_variant_specified_here : Note< diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 0403f11f6b7..17586c90bd1 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -4931,11 +4931,15 @@ Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, } // Allow #pragma omp declare variant only if the function is not used. - if (FD->isUsed(false)) { - Diag(SR.getBegin(), diag::err_omp_declare_variant_after_used) + if (FD->isUsed(false)) + 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(); - return None; - } // The VariantRef must point to function. if (!VariantRef) { diff --git a/clang/test/OpenMP/declare_variant_ast_print.cpp b/clang/test/OpenMP/declare_variant_ast_print.cpp index a8dba5611a4..a8c18f68228 100644 --- a/clang/test/OpenMP/declare_variant_ast_print.cpp +++ b/clang/test/OpenMP/declare_variant_ast_print.cpp @@ -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 diff --git a/clang/test/OpenMP/declare_variant_messages.c b/clang/test/OpenMP/declare_variant_messages.c index 4a1357c3fd8..ce4956ae6fb 100644 --- a/clang/test/OpenMP/declare_variant_messages.c +++ b/clang/test/OpenMP/declare_variant_messages.c @@ -76,9 +76,12 @@ int bar() { 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={}) 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); // expected-error@+1 {{function with '#pragma omp declare variant' has a different calling convention}} diff --git a/clang/test/OpenMP/declare_variant_messages.cpp b/clang/test/OpenMP/declare_variant_messages.cpp index bd01270b078..0c322463a7f 100644 --- a/clang/test/OpenMP/declare_variant_messages.cpp +++ b/clang/test/OpenMP/declare_variant_messages.cpp @@ -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 *)'}} #pragma omp declare variant(barbar <int>) match(xxx = {}) template <> -void h(int *hp, int *hp2, int *hq, int *lin) { - h((float *)hp, (float *)hp2, (float *)hq, (float *)lin); -} +void h(int *hp, int *hp2, int *hq, int *lin); int after_use_variant(void); int after_use(); @@ -112,7 +110,7 @@ int bar() { 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 = {}) int after_use(void); @@ -174,6 +172,7 @@ auto fn_deduced_variant() { return 0; } int fn_deduced(); 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 = {}) auto fn_deduced1() { return 0; } |