1*820e8d86SJan Korous // RUN: %clang_analyze_cc1 -analyzer-checker=webkit.UncountedLambdaCapturesChecker %s 2>&1 | FileCheck %s --strict-whitespace
2*820e8d86SJan Korous #include "mock-types.h"
3*820e8d86SJan Korous 
raw_ptr()4*820e8d86SJan Korous void raw_ptr() {
5*820e8d86SJan Korous   RefCountable* ref_countable = nullptr;
6*820e8d86SJan Korous   auto foo1 = [ref_countable](){};
7*820e8d86SJan Korous   // CHECK: warning: Captured raw-pointer 'ref_countable' to uncounted type is unsafe [webkit.UncountedLambdaCapturesChecker]
8*820e8d86SJan Korous   // CHECK-NEXT:{{^}}  auto foo1 = [ref_countable](){};
9*820e8d86SJan Korous   // CHECK-NEXT:{{^}}               ^
10*820e8d86SJan Korous   auto foo2 = [&ref_countable](){};
11*820e8d86SJan Korous   // CHECK: warning: Captured raw-pointer 'ref_countable' to uncounted type is unsafe [webkit.UncountedLambdaCapturesChecker]
12*820e8d86SJan Korous   auto foo3 = [&](){ ref_countable = nullptr; };
13*820e8d86SJan Korous   // CHECK: warning: Implicitly captured raw-pointer 'ref_countable' to uncounted type is unsafe [webkit.UncountedLambdaCapturesChecker]
14*820e8d86SJan Korous   // CHECK-NEXT:{{^}}  auto foo3 = [&](){ ref_countable = nullptr; };
15*820e8d86SJan Korous   // CHECK-NEXT:{{^}}                     ^
16*820e8d86SJan Korous   auto foo4 = [=](){ (void) ref_countable; };
17*820e8d86SJan Korous   // CHECK: warning: Implicitly captured raw-pointer 'ref_countable' to uncounted type is unsafe [webkit.UncountedLambdaCapturesChecker]
18*820e8d86SJan Korous }
19*820e8d86SJan Korous 
references()20*820e8d86SJan Korous void references() {
21*820e8d86SJan Korous   RefCountable automatic;
22*820e8d86SJan Korous   RefCountable& ref_countable_ref = automatic;
23*820e8d86SJan Korous 
24*820e8d86SJan Korous   auto foo1 = [ref_countable_ref](){};
25*820e8d86SJan Korous   // CHECK: warning: Captured reference 'ref_countable_ref' to uncounted type is unsafe [webkit.UncountedLambdaCapturesChecker]
26*820e8d86SJan Korous   auto foo2 = [&ref_countable_ref](){};
27*820e8d86SJan Korous   // CHECK: warning: Captured reference 'ref_countable_ref' to uncounted type is unsafe [webkit.UncountedLambdaCapturesChecker]
28*820e8d86SJan Korous   auto foo3 = [&](){ (void) ref_countable_ref; };
29*820e8d86SJan Korous   // CHECK: warning: Implicitly captured reference 'ref_countable_ref' to uncounted type is unsafe [webkit.UncountedLambdaCapturesChecker]
30*820e8d86SJan Korous   auto foo4 = [=](){ (void) ref_countable_ref; };
31*820e8d86SJan Korous   // CHECK: warning: Implicitly captured reference 'ref_countable_ref' to uncounted type is unsafe [webkit.UncountedLambdaCapturesChecker]
32*820e8d86SJan Korous }
33*820e8d86SJan Korous 
quiet()34*820e8d86SJan Korous void quiet() {
35*820e8d86SJan Korous // This code is not expected to trigger any warnings.
36*820e8d86SJan Korous   {
37*820e8d86SJan Korous     RefCountable automatic;
38*820e8d86SJan Korous     RefCountable &ref_countable_ref = automatic;
39*820e8d86SJan Korous   }
40*820e8d86SJan Korous 
41*820e8d86SJan Korous   auto foo3 = [&]() {};
42*820e8d86SJan Korous   auto foo4 = [=]() {};
43*820e8d86SJan Korous   RefCountable *ref_countable = nullptr;
44*820e8d86SJan Korous }
45