aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaCUDA.cpp
diff options
context:
space:
mode:
authorJustin Lebar <jlebar@google.com>2016-09-30 17:14:53 +0000
committerJustin Lebar <jlebar@google.com>2016-09-30 17:14:53 +0000
commit7ca116cacfcf3d33bb0a17a76bd8495557e2b6fb (patch)
tree37d68d77ad3ef7397af18af9687700f7468556b6 /clang/lib/Sema/SemaCUDA.cpp
parent0fad0ba6a9b0e4900a6e247831c83f665bde2a6b (diff)
downloadllvm-7ca116cacfcf3d33bb0a17a76bd8495557e2b6fb.zip
llvm-7ca116cacfcf3d33bb0a17a76bd8495557e2b6fb.tar.gz
llvm-7ca116cacfcf3d33bb0a17a76bd8495557e2b6fb.tar.bz2
[CUDA] Make lambdas inherit __host__ and __device__ attributes from the scope in which they're created.
Summary: NVCC compat. Fixes bug 30567. Reviewers: tra Subscribers: cfe-commits, rnk Differential Revision: https://reviews.llvm.org/D25105 llvm-svn: 282880
Diffstat (limited to 'clang/lib/Sema/SemaCUDA.cpp')
-rw-r--r--clang/lib/Sema/SemaCUDA.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaCUDA.cpp b/clang/lib/Sema/SemaCUDA.cpp
index c75bdc7..293baa5 100644
--- a/clang/lib/Sema/SemaCUDA.cpp
+++ b/clang/lib/Sema/SemaCUDA.cpp
@@ -559,3 +559,22 @@ bool Sema::CheckCUDAVLA(SourceLocation Loc) {
}
return true;
}
+
+void Sema::CUDASetLambdaAttrs(CXXMethodDecl *Method) {
+ if (Method->hasAttr<CUDAHostAttr>() || Method->hasAttr<CUDADeviceAttr>())
+ return;
+ FunctionDecl *CurFn = dyn_cast<FunctionDecl>(CurContext);
+ if (!CurFn)
+ return;
+ CUDAFunctionTarget Target = IdentifyCUDATarget(CurFn);
+ if (Target == CFT_Global || Target == CFT_Device) {
+ Method->addAttr(CUDADeviceAttr::CreateImplicit(Context));
+ } else if (Target == CFT_HostDevice) {
+ Method->addAttr(CUDADeviceAttr::CreateImplicit(Context));
+ Method->addAttr(CUDAHostAttr::CreateImplicit(Context));
+ }
+
+ // TODO: nvcc doesn't allow you to specify __host__ or __device__ attributes
+ // on lambdas in all contexts -- we should emit a compatibility warning where
+ // we're more permissive.
+}