Unify our computation of the type of a captured reference to a
variable; it was previously duplicated, and one of the copies failed
to account for outer non-mutable lambda captures.

llvm-svn: 150872
diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p16.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p16.cpp
index 58fa766..1723ee3 100644
--- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p16.cpp
+++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p16.cpp
@@ -13,4 +13,7 @@
     [x] { // expected-error{{call to deleted constructor of 'const X'}}
     }();
   }();
+
+  int a; 
+  [=]{ [&] { int&x = a; }(); }(); // expected-error{{binding of reference to type 'int' to a value of type 'const int' drops qualifiers}}
 }
diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp
index 03cbe32..e935613 100644
--- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp
+++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p18.cpp
@@ -17,12 +17,12 @@
   const int &irc = i;
 
   [=,&irc,&ir] {
+    static_assert(is_same<decltype(((r))), float const&>::value, 
+                  "should be const float&");
     static_assert(is_same<decltype(x), float>::value, "should be float");
     static_assert(is_same<decltype((x)), const float&>::value, 
                   "should be const float&");
     static_assert(is_same<decltype(r), float&>::value, "should be float&");
-    static_assert(is_same<decltype(((r))), float const&>::value, 
-                  "should be const float&");
     static_assert(is_same<decltype(ir), int&>::value, "should be int&");
     static_assert(is_same<decltype((ir)), int&>::value, "should be int&");
     static_assert(is_same<decltype(irc), const int&>::value,