From: Alexey Bataev Date: Mon, 30 Sep 2019 18:24:35 +0000 (+0000) Subject: [OPENMP50]Do not emit warning for the function with the currently X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=051067842e97a124c09bf53d98e4ffa28ba078f5;p=clang [OPENMP50]Do not emit warning for the function with the currently defined body. If the function is currently defined, we should not emit a warning that it might be emitted already because it was not really emitted. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@373243 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index f2dc66e383..b3a2ed62a7 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -4936,8 +4936,9 @@ Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, << FD->getLocation(); // Check if the function was emitted already. - if ((LangOpts.EmitAllDecls && FD->isDefined()) || - Context.DeclMustBeEmitted(FD)) + const FunctionDecl *Definition; + if (!FD->isThisDeclarationADefinition() && FD->isDefined(Definition) && + (LangOpts.EmitAllDecls || Context.DeclMustBeEmitted(Definition))) Diag(SR.getBegin(), diag::warn_omp_declare_variant_after_emitted) << FD->getLocation(); diff --git a/test/OpenMP/declare_variant_messages.c b/test/OpenMP/declare_variant_messages.c index ce4956ae6f..0eeaae0523 100644 --- a/test/OpenMP/declare_variant_messages.c +++ b/test/OpenMP/declare_variant_messages.c @@ -79,9 +79,13 @@ int bar() { // 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 defined1(void) { return 0; } +// 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 defined1(void); + 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 0c322463a7..ca61c53b0f 100644 --- a/test/OpenMP/declare_variant_messages.cpp +++ b/test/OpenMP/declare_variant_messages.cpp @@ -172,10 +172,14 @@ 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; } +auto fn_deduced3() { return 0; } +// 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_deduced3(); + auto fn_deduced_variant2() { return 0; } // expected-error@+1 {{variant in '#pragma omp declare variant' with type 'int ()' is incompatible with type 'float (*)()'}} #pragma omp declare variant(fn_deduced_variant2) match(xxx = {})