Author: abataev Date: Thu Sep 26 13:04:15 2019 New Revision: 373010 URL: http://llvm.org/viewvc/llvm-project?rev=373010&view=rev Log: [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. Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/test/OpenMP/declare_variant_ast_print.cpp cfe/trunk/test/OpenMP/declare_variant_messages.c cfe/trunk/test/OpenMP/declare_variant_messages.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=373010&r1=373009&r2=373010&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Sep 26 13:04:15 2019 @@ -9452,9 +9452,12 @@ def warn_omp_declare_target_after_first_ 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< Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=373010&r1=373009&r2=373010&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Thu Sep 26 13:04:15 2019 @@ -4931,11 +4931,15 @@ Sema::checkOpenMPDeclareVariantFunction( } // 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) { Modified: cfe/trunk/test/OpenMP/declare_variant_ast_print.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_variant_ast_print.cpp?rev=373010&r1=373009&r2=373010&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/declare_variant_ast_print.cpp (original) +++ cfe/trunk/test/OpenMP/declare_variant_ast_print.cpp Thu Sep 26 13:04:15 2019 @@ -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 Modified: cfe/trunk/test/OpenMP/declare_variant_messages.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_variant_messages.c?rev=373010&r1=373009&r2=373010&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/declare_variant_messages.c (original) +++ cfe/trunk/test/OpenMP/declare_variant_messages.c Thu Sep 26 13:04:15 2019 @@ -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}} Modified: cfe/trunk/test/OpenMP/declare_variant_messages.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/declare_variant_messages.cpp?rev=373010&r1=373009&r2=373010&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/declare_variant_messages.cpp (original) +++ cfe/trunk/test/OpenMP/declare_variant_messages.cpp Thu Sep 26 13:04:15 2019 @@ -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; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits