From: Alexey Bataev Date: Thu, 26 Sep 2019 20:04:15 +0000 (+0000) Subject: [OPENMP50]Emit warnings if the functions was defined/used before marked X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=61dcf5fc3bef286fed83d3d699d979abe1cb4fc4;p=clang [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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@373010 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 08fe50c436..c2cef944b6 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -9452,9 +9452,12 @@ def warn_omp_declare_target_after_first_use : Warning< InGroup; 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; +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; 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/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index 0403f11f6b..17586c90bd 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/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/test/OpenMP/declare_variant_ast_print.cpp b/test/OpenMP/declare_variant_ast_print.cpp index a8dba5611a..a8c18f6822 100644 --- a/test/OpenMP/declare_variant_ast_print.cpp +++ b/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/test/OpenMP/declare_variant_messages.c b/test/OpenMP/declare_variant_messages.c index 4a1357c3fd..ce4956ae6f 100644 --- a/test/OpenMP/declare_variant_messages.c +++ b/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/test/OpenMP/declare_variant_messages.cpp b/test/OpenMP/declare_variant_messages.cpp index bd01270b07..0c322463a7 100644 --- a/test/OpenMP/declare_variant_messages.cpp +++ b/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 '' is incompatible with type 'void (*)(int *, int *, int *, int *)'}} #pragma omp declare variant(barbar ) 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; }