Index: clang/lib/Sema/Sema.cpp =================================================================== --- clang/lib/Sema/Sema.cpp +++ clang/lib/Sema/Sema.cpp @@ -811,8 +811,10 @@ // FIXME: We can promote this to an error. The function or variable can't // be defined anywhere else, so the program must necessarily violate the // one definition rule. - S.Diag(VD->getLocation(), diag::warn_undefined_internal) - << isa(VD) << VD; + if (S.getLangOpts().OpenMPIsDevice && + VD->hasAttr()) + S.Diag(VD->getLocation(), diag::warn_undefined_internal) + << isa(VD) << VD; } else if (auto *FD = dyn_cast(VD)) { (void)FD; assert(FD->getMostRecentDecl()->isInlined() && Index: clang/test/OpenMP/declare_variant.cpp =================================================================== --- /dev/null +++ clang/test/OpenMP/declare_variant.cpp @@ -0,0 +1,27 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fopenmp -verify %s + +// expected-no-diagnostics + +namespace { +void bar(); +} + +#pragma omp begin declare variant match(user={condition(1)}) +void bar() { +} +#pragma omp end declare variant + +#pragma omp begin declare variant match(device = {kind(nohost)}) +static void foo() {} +#pragma omp end declare variant + +#pragma omp begin declare variant match(device = {kind(host)}) +static void foo() {} +#pragma omp end declare variant + +int main() { + foo(); + bar(); + + return 0; +}