summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeCompletion/lambdas.cpp
diff options
context:
space:
mode:
authorIlya Biryukov <ibiryukov@google.com>2019-05-23 07:45:35 +0000
committerIlya Biryukov <ibiryukov@google.com>2019-05-23 07:45:35 +0000
commit3a2f0e466b58e48f83a3849c3c96d57b82427f30 (patch)
treee8ddcbd9d4cb85aaadb33095d8ca85621be76569 /clang/test/CodeCompletion/lambdas.cpp
parent4a7da98bd9283e2e6aa635031d2f131493c8ad1a (diff)
downloadbcm5719-llvm-3a2f0e466b58e48f83a3849c3c96d57b82427f30.tar.gz
bcm5719-llvm-3a2f0e466b58e48f83a3849c3c96d57b82427f30.zip
[CodeComplete] Complete a lambda when preferred type is a function
Summary: Uses a heuristic to detect std::function and friends. Reviewers: kadircet Reviewed By: kadircet Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D62238 llvm-svn: 361461
Diffstat (limited to 'clang/test/CodeCompletion/lambdas.cpp')
-rw-r--r--clang/test/CodeCompletion/lambdas.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/clang/test/CodeCompletion/lambdas.cpp b/clang/test/CodeCompletion/lambdas.cpp
new file mode 100644
index 00000000000..3467cec0e3b
--- /dev/null
+++ b/clang/test/CodeCompletion/lambdas.cpp
@@ -0,0 +1,53 @@
+template <class T>
+struct function {
+};
+
+
+void test() {
+ void (*x)(int, double) = nullptr;
+
+ function<void(int, double)> y = {};
+ // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:7:28 %s -o - | FileCheck -check-prefix=CHECK-1 %s
+ // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:9:35 %s -o - | FileCheck -check-prefix=CHECK-1 %s
+ // CHECK-1: COMPLETION: Pattern : [<#=#>](int <#parameter#>, double <#parameter#>){<#body#>}
+
+ // == Placeholders for suffix types must be placed properly.
+ function<void(void(*)(int))> z = {};
+ // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:15:36 %s -o - | FileCheck -check-prefix=CHECK-2 %s
+ // CHECK-2: COMPLETION: Pattern : [<#=#>](void (* <#parameter#>)(int)){<#body#>}
+
+ // == No need for a parameter list if function has no parameters.
+ function<void()> a = {};
+ // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:20:24 %s -o - | FileCheck -check-prefix=CHECK-3 %s
+ // CHECK-3: COMPLETION: Pattern : [<#=#>]{<#body#>}
+}
+
+template <class T, class Allocator = int>
+struct vector {};
+
+void test2() {
+ // == Try to preserve types as written.
+ function<void(vector<int>)> a = {};
+
+ using function_typedef = function<void(vector<int>)>;
+ function_typedef b = {};
+ // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:30:35 %s -o - | FileCheck -check-prefix=CHECK-4 %s
+ // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:33:24 %s -o - | FileCheck -check-prefix=CHECK-4 %s
+ // CHECK-4: COMPLETION: Pattern : [<#=#>](vector<int> <#parameter#>){<#body#>}
+}
+
+// Check another common function wrapper name.
+template <class T> struct unique_function {};
+
+void test3() {
+ unique_function<void()> a = {};
+ // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:43:31 %s -o - | FileCheck -check-prefix=CHECK-5 %s
+ // CHECK-5: COMPLETION: Pattern : [<#=#>]{<#body#>}
+}
+
+template <class T, class U> struct weird_function {};
+void test4() {
+ weird_function<void(), int> b = {};
+ // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:50:35 %s -o - | FileCheck -check-prefix=CHECK-6 %s
+ // CHECK-6-NOT: COMPLETION: Pattern : [<#=
+}
OpenPOWER on IntegriCloud