1 // RUN: %clang_cc1 -std=c++11 %s -Wunused -verify
2 // expected-no-diagnostics
3 
4 template<typename T, typename U>
5 struct is_same {
6   static const bool value = false;
7 };
8 
9 template<typename T>
10 struct is_same<T, T> {
11   static const bool value = true;
12 };
13 
f3()14 void f3() {
15   float x, &r = x;
16   int i;
17   int &ir = i;
18   const int &irc = i;
19 
20   [=,&irc,&ir] {
21     static_assert(is_same<decltype(((r))), float const&>::value,
22                   "should be const float&");
23     static_assert(is_same<decltype(x), float>::value, "should be float");
24     static_assert(is_same<decltype((x)), const float&>::value,
25                   "should be const float&");
26     static_assert(is_same<decltype(r), float&>::value, "should be float&");
27     static_assert(is_same<decltype(ir), int&>::value, "should be int&");
28     static_assert(is_same<decltype((ir)), int&>::value, "should be int&");
29     static_assert(is_same<decltype(irc), const int&>::value,
30                   "should be const int&");
31     static_assert(is_same<decltype((irc)), const int&>::value,
32                   "should be const int&");
33   }();
34 
35   [=] {
36     [=] () mutable {
37       static_assert(is_same<decltype(x), float>::value, "should be float");
38       static_assert(is_same<decltype((x)), float&>::value,
39                     "should be float&");
40     }();
41   }();
42 
43   [&i] {
44     static_assert(is_same<decltype((i)), int&>::value, "should be int&");
45   }();
46 }
47