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