Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -1597,7 +1597,8 @@ bool Sema::isUsualDeallocationFunction(const CXXMethodDecl *Method) { // [CUDA] Ignore this function, if we can't call it. - const FunctionDecl *Caller = dyn_cast(CurContext); + const FunctionDecl *Caller = + dyn_cast(getCurFunctionDecl(/*AllowLambda=*/true)); if (getLangOpts().CUDA) { auto CallPreference = IdentifyCUDAPreference(Caller, Method); // If it's not callable at all, it's not the right function. @@ -1691,7 +1692,8 @@ // In CUDA, determine how much we'd like / dislike to call this. if (S.getLangOpts().CUDA) - if (auto *Caller = dyn_cast(S.CurContext)) + if (auto *Caller = dyn_cast( + S.getCurFunctionDecl(/*AllowLambda=*/true))) CUDAPref = S.IdentifyCUDAPreference(Caller, FD); } @@ -2830,7 +2832,9 @@ } if (getLangOpts().CUDA) - EraseUnwantedCUDAMatches(dyn_cast(CurContext), Matches); + EraseUnwantedCUDAMatches( + dyn_cast(getCurFunctionDecl(/*AllowLambda=*/true)), + Matches); } else { // C++1y [expr.new]p22: // For a non-placement allocation function, the normal deallocation Index: clang/test/SemaCUDA/openmp-parallel.cu =================================================================== --- clang/test/SemaCUDA/openmp-parallel.cu +++ clang/test/SemaCUDA/openmp-parallel.cu @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fopenmp -fsyntax-only -verify %s +// RUN: %clang_cc1 -fopenmp -fexceptions -fsyntax-only -verify %s #include "Inputs/cuda.h" @@ -7,13 +8,17 @@ int main() { #pragma omp parallel - for (int i = 0; i < 100; i++) + for (int i = 0; i < 100; i++) { foo(1); // expected-error {{no matching function for call to 'foo'}} - + new int; + } + auto Lambda = []() { #pragma omp parallel - for (int i = 0; i < 100; i++) + for (int i = 0; i < 100; i++) { foo(1); // expected-error {{reference to __device__ function 'foo' in __host__ __device__ function}} - }; + new int; + } + }; Lambda(); // expected-note {{called by 'main'}} }