summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCUDA
diff options
context:
space:
mode:
authorJustin Lebar <jlebar@google.com>2017-01-05 16:53:38 +0000
committerJustin Lebar <jlebar@google.com>2017-01-05 16:53:38 +0000
commit86c4e63ff97466f4a4fec3ab79f4ae23d6289052 (patch)
tree59e759c0dbfc817a790ef373181d9a7887027a9a /clang/test/SemaCUDA
parentb6626593555ad2542c2d3800befa7c9d193032d1 (diff)
downloadbcm5719-llvm-86c4e63ff97466f4a4fec3ab79f4ae23d6289052.tar.gz
bcm5719-llvm-86c4e63ff97466f4a4fec3ab79f4ae23d6289052.zip
[CUDA] Let NVPTX inherit the host's calling conventions.
Summary: When compiling device code, we may still see host code with explicit calling conventions. NVPTX needs to claim that it supports these CCs, so that (a) we don't raise noisy warnings, and (b) we don't break existing code which relies on the existence of these CCs when specializing templates. (If a CC doesn't exist, clang ignores it, so two template specializations which are different only insofar as one specifies a CC are considered identical and therefore are an error if that CC is not supported.) Reviewers: tra Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D28323 llvm-svn: 291136
Diffstat (limited to 'clang/test/SemaCUDA')
-rw-r--r--clang/test/SemaCUDA/cuda-inherits-calling-conv.cu30
1 files changed, 30 insertions, 0 deletions
diff --git a/clang/test/SemaCUDA/cuda-inherits-calling-conv.cu b/clang/test/SemaCUDA/cuda-inherits-calling-conv.cu
new file mode 100644
index 00000000000..67c438fa621
--- /dev/null
+++ b/clang/test/SemaCUDA/cuda-inherits-calling-conv.cu
@@ -0,0 +1,30 @@
+// RUN: %clang_cc1 -std=c++11 -triple i386-windows-msvc \
+// RUN: -aux-triple nvptx-nvidia-cuda -fsyntax-only -verify %s
+
+// RUN: %clang_cc1 -std=c++11 -triple nvptx-nvidia-cuda \
+// RUN: -aux-triple i386-windows-msvc -fsyntax-only \
+// RUN: -fcuda-is-device -verify %s
+
+// RUN: %clang_cc1 -std=c++11 -triple nvptx-nvidia-cuda \
+// RUN: -aux-triple x86_64-linux-gnu -fsyntax-only \
+// RUN: -fcuda-is-device -verify -verify-ignore-unexpected=note \
+// RUN: -DEXPECT_ERR %s
+
+// CUDA device code should inherit the host's calling conventions.
+
+template <class T>
+struct Foo;
+
+template <class T>
+struct Foo<T()> {};
+
+// On x86_64-linux-gnu, this is a redefinition of the template, because the
+// __fastcall calling convention doesn't exist (and is therefore ignored).
+#ifndef EXPECT_ERR
+// expected-no-diagnostics
+#else
+// expected-error@+4 {{redefinition of 'Foo}}
+// expected-warning@+3 {{calling convention '__fastcall' ignored}}
+#endif
+template <class T>
+struct Foo<T __fastcall()> {};
OpenPOWER on IntegriCloud