Index: lib/Sema/Sema.cpp =================================================================== --- lib/Sema/Sema.cpp +++ lib/Sema/Sema.cpp @@ -1503,8 +1503,12 @@ const llvm::function_ref IsKnownEmitted) { // Nothing to do if we already know that FD is emitted. if (IsKnownEmitted(S, OrigCallee)) { - assert(!S.DeviceCallGraph.count(OrigCallee)); - return; + // CUDA/HIP and OpenMP both put functions in DeviceCallGraph. A function + // not sure to be emitted by one language may be found sure to be emitted + // by another language. In that case, we will iterate the call graph and + // mark all the callees. Otherwise, do nothing. + if (!S.DeviceCallGraph.count(OrigCallee)) + return; } // We've just discovered that OrigCallee is known-emitted. Walk our call @@ -1520,8 +1524,6 @@ Seen.insert(OrigCallee); while (!Worklist.empty()) { CallInfo C = Worklist.pop_back_val(); - assert(!IsKnownEmitted(S, C.Callee) && - "Worklist should not contain known-emitted functions."); S.DeviceKnownEmittedFns[C.Callee] = {C.Caller, C.Loc}; emitDeferredDiags(S, C.Callee, C.Caller); Index: test/SemaCUDA/openmp-static-func.cu =================================================================== --- /dev/null +++ test/SemaCUDA/openmp-static-func.cu @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only \ +// RUN: -verify -fopenmp %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only \ +// RUN: -verify -fopenmp -x hip %s +// expected-no-diagnostics + +// Tests there is no assertion in Sema::markKnownEmitted when fopenmp is used +// with CUDA/HIP host compilation. + +static void f() {} + +static void g() { f(); } + +static void h() { g(); }