Rakete1111 updated this revision to Diff 170828.
Rakete1111 added a comment.

Addresed review comments :)

I updated the dr status file but a lot of unrelated changes made it in. Is this 
okay?


Repository:
  rC Clang

https://reviews.llvm.org/D53595

Files:
  include/clang/Basic/DiagnosticSemaKinds.td
  include/clang/Sema/Sema.h
  lib/Sema/SemaLambda.cpp
  test/CXX/drs/dr22xx.cpp
  test/SemaCXX/warn-shadow-in-lambdas.cpp
  www/cxx_dr_status.html

Index: www/cxx_dr_status.html
===================================================================
--- www/cxx_dr_status.html
+++ www/cxx_dr_status.html
@@ -7437,11 +7437,11 @@
     <td>Brace elision in array temporary initialization</td>
     <td class="none" align="center">Unknown</td>
   </tr>
-  <tr class="open" id="1271">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1271";>1271</a></td>
-    <td>drafting</td>
+  <tr id="1271">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1271";>1271</a></td>
+    <td>DR</td>
     <td>Imprecise wording regarding dependent types</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="1272">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#1272";>1272</a></td>
@@ -11147,7 +11147,7 @@
   </tr>
   <tr class="open" id="1889">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1889";>1889</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Unclear effect of <TT>#pragma</TT> on conformance</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -11170,8 +11170,8 @@
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="1893">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1893";>1893</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1893";>1893</a></td>
+    <td>DR</td>
     <td>Function-style cast with <I>braced-init-list</I>s and empty pack expansions</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -11247,11 +11247,11 @@
     <td>Dependent types and injected-class-names</td>
     <td class="none" align="center">Unknown</td>
   </tr>
-  <tr class="open" id="1906">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1906";>1906</a></td>
-    <td>review</td>
+  <tr id="1906">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#1906";>1906</a></td>
+    <td>NAD</td>
     <td>Name lookup in member <TT>friend</TT> declaration</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="1907">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1907";>1907</a></td>
@@ -11272,8 +11272,8 @@
     <td class="full" align="center">Yes</td>
   </tr>
   <tr id="1910">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1910";>1910</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1910";>1910</a></td>
+    <td>DR</td>
     <td>&#8220;Shall&#8221; requirement applied to runtime behavior</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -11710,8 +11710,8 @@
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="1983">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1983";>1983</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1983";>1983</a></td>
+    <td>DR</td>
     <td>Inappropriate use of <I>virt-specifier</I></td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -12166,8 +12166,8 @@
     <td align="center">Not resolved</td>
   </tr>
   <tr id="2059">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2059";>2059</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2059";>2059</a></td>
+    <td>DR</td>
     <td>Linkage and deduced return types</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -12298,8 +12298,8 @@
     <td align="center">Not resolved</td>
   </tr>
   <tr id="2081">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2081";>2081</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2081";>2081</a></td>
+    <td>DR</td>
     <td>Deduced return type in redeclaration or specialization of function template</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -12340,8 +12340,8 @@
     <td align="center">Not resolved</td>
   </tr>
   <tr id="2088">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2088";>2088</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2088";>2088</a></td>
+    <td>DR</td>
     <td>Late tiebreakers in partial ordering</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -12364,8 +12364,8 @@
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="2092">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2092";>2092</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2092";>2092</a></td>
+    <td>DR</td>
     <td>Deduction failure and overload resolution</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -12796,8 +12796,8 @@
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="2164">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2164";>2164</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2164";>2164</a></td>
+    <td>DR</td>
     <td>Name hiding and <I>using-directive</I>s</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -12935,7 +12935,7 @@
   </tr>
   <tr class="open" id="2187">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2187";>2187</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Protected members and access via <I>qualified-id</I></td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13025,7 +13025,7 @@
   </tr>
   <tr class="open" id="2202">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2202";>2202</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>When does default argument instantiation occur?</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13081,7 +13081,7 @@
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2211";>2211</a></td>
     <td>C++17</td>
     <td>Hiding by lambda captures and parameters</td>
-    <td class="none" align="center">Unknown</td>
+    <td class="svn" align="center">SVN</td>
   </tr>
   <tr class="open" id="2212">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2212";>2212</a></td>
@@ -13127,7 +13127,7 @@
   </tr>
   <tr class="open" id="2219">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2219";>2219</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Dynamically-unreachable handlers</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13168,14 +13168,14 @@
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="2226">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2226";>2226</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2226";>2226</a></td>
+    <td>DR</td>
     <td>Xvalues vs lvalues in conditional expressions</td>
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="2227">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2227";>2227</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2227";>2227</a></td>
+    <td>DR</td>
     <td>Destructor access and default member initializers</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -13186,8 +13186,8 @@
     <td align="center">Not resolved</td>
   </tr>
   <tr id="2229">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2229";>2229</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2229";>2229</a></td>
+    <td>DR</td>
     <td>Volatile unnamed bit-fields</td>
     <td class="full" align="center">Clang 7</td>
   </tr>
@@ -13216,14 +13216,14 @@
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="2234">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2234";>2234</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2234";>2234</a></td>
+    <td>DR</td>
     <td>Missing rules for <I>simple-template-id</I> as <I>class-name</I></td>
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="2235">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2235";>2235</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2235";>2235</a></td>
+    <td>DR</td>
     <td>Partial ordering and non-dependent types</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -13234,8 +13234,8 @@
     <td align="center">Not resolved</td>
   </tr>
   <tr id="2237">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2237";>2237</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2237";>2237</a></td>
+    <td>accepted</td>
     <td>Can a <I>template-id</I> name a constructor?</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -13253,15 +13253,15 @@
   </tr>
   <tr class="open" id="2240">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2240";>2240</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td><TT>this</TT> is not odr-used in a constant expression</td>
     <td align="center">Not resolved</td>
   </tr>
-  <tr class="open" id="2241">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2241";>2241</a></td>
-    <td>open</td>
+  <tr id="2241">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2241";>2241</a></td>
+    <td>DR</td>
     <td>Overload resolution is not invoked with a single function</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2242">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2242";>2242</a></td>
@@ -13283,13 +13283,13 @@
   </tr>
   <tr class="open" id="2245">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2245";>2245</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Point of instantiation of incomplete class template</td>
     <td align="center">Not resolved</td>
   </tr>
   <tr class="open" id="2246">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2246";>2246</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Access of indirect virtual base class constructors</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13325,7 +13325,7 @@
   </tr>
   <tr class="open" id="2252">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2252";>2252</a></td>
-    <td>open</td>
+    <td>review</td>
     <td>Enumeration list-initialization from the same type</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13337,25 +13337,25 @@
   </tr>
   <tr id="2254">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2254";>2254</a></td>
-    <td>tentatively ready</td>
+    <td>ready</td>
     <td>Standard-layout classes and bit-fields</td>
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="2255">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2255";>2255</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2255";>2255</a></td>
+    <td>DR</td>
     <td>Instantiated static data member templates</td>
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2256">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2256";>2256</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Lifetime of trivially-destructible objects</td>
     <td align="center">Not resolved</td>
   </tr>
   <tr class="open" id="2257">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2257";>2257</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Lifetime extension of references vs exceptions</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13372,14 +13372,14 @@
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="2260">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2260";>2260</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2260";>2260</a></td>
+    <td>DR</td>
     <td>Explicit specializations of deleted member functions</td>
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2261">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2261";>2261</a></td>
-    <td>open</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#2261";>2261</a></td>
+    <td>extension</td>
     <td>Explicit instantiation of in-class <TT>friend</TT> definition</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13391,31 +13391,31 @@
   </tr>
   <tr class="open" id="2263">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2263";>2263</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Default argument instantiation for <TT>friend</TT>s</td>
     <td align="center">Not resolved</td>
   </tr>
   <tr class="open" id="2264">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2264";>2264</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Memberwise copying with indeterminate value</td>
     <td align="center">Not resolved</td>
   </tr>
   <tr class="open" id="2265">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2265";>2265</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Delayed pack expansion and member redeclarations</td>
     <td align="center">Not resolved</td>
   </tr>
   <tr class="open" id="2266">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2266";>2266</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Has dependent type vs is type-dependent</td>
     <td align="center">Not resolved</td>
   </tr>
   <tr class="open" id="2267">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2267";>2267</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Copy-initialization of temporary in reference direct-initialization</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13481,7 +13481,7 @@
   </tr>
   <tr class="open" id="2278">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2278";>2278</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Copy elision in constant expressions reconsidered</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13499,7 +13499,7 @@
   </tr>
   <tr class="open" id="2281">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2281";>2281</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Consistency of aligned <TT>operator delete</TT> replacement</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13569,17 +13569,17 @@
     <td><I>simple-template-id</I> is ambiguous between <I>class-name</I> and <I>type-name</I></td>
     <td align="center">Not resolved</td>
   </tr>
-  <tr class="open" id="2293">
+  <tr id="2293">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2293";>2293</a></td>
-    <td>drafting</td>
+    <td>ready</td>
     <td>Requirements for <I>simple-template-id</I> used as a <I>class-name</I></td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
-  <tr class="open" id="2294">
+  <tr id="2294">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2294";>2294</a></td>
-    <td>drafting</td>
+    <td>ready</td>
     <td>Dependent <TT>auto</TT> static data members</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2295">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#2295";>2295</a></td>
@@ -13606,8 +13606,8 @@
     <td align="center">Not resolved</td>
   </tr>
   <tr id="2299">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2299";>2299</a></td>
-    <td>tentatively ready</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2299";>2299</a></td>
+    <td>DR</td>
     <td><TT>constexpr</TT> vararg functions</td>
     <td class="none" align="center">Unknown</td>
   </tr>
@@ -13631,7 +13631,7 @@
   </tr>
   <tr class="open" id="2303">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2303";>2303</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Partial ordering and recursive variadic inheritance</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13659,11 +13659,11 @@
     <td>Unclear definition of &#8220;equivalent to a nontype template parameter&#8221;</td>
     <td class="none" align="center">Unknown</td>
   </tr>
-  <tr class="open" id="2308">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2308";>2308</a></td>
-    <td>open</td>
+  <tr id="2308">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#2308";>2308</a></td>
+    <td>NAD</td>
     <td>Structured bindings and lambda capture</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2309">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2309";>2309</a></td>
@@ -13673,7 +13673,7 @@
   </tr>
   <tr class="open" id="2310">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2310";>2310</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Type completeness and derived-to-base pointer conversions</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13683,11 +13683,11 @@
     <td>Missed case for guaranteed copy elision</td>
     <td align="center">Not resolved</td>
   </tr>
-  <tr class="open" id="2312">
+  <tr id="2312">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2312";>2312</a></td>
-    <td>drafting</td>
+    <td>ready</td>
     <td>Structured bindings and <TT>mutable</TT></td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr id="2313">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2313";>2313</a></td>
@@ -13715,7 +13715,7 @@
   </tr>
   <tr class="open" id="2317">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2317";>2317</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Self-referential default member initializers</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13737,23 +13737,23 @@
     <td><TT>constexpr if</TT> and boolean conversions</td>
     <td align="center">Not resolved</td>
   </tr>
-  <tr class="open" id="2321">
+  <tr id="2321">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2321";>2321</a></td>
-    <td>drafting</td>
+    <td>ready</td>
     <td>Conditional operator and cv-qualified class prvalues</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
-  <tr class="open" id="2322">
+  <tr id="2322">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2322";>2322</a></td>
-    <td>drafting</td>
+    <td>ready</td>
     <td>Substitution failure and lexical order</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
-  <tr class="open" id="2323">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2323";>2323</a></td>
-    <td>drafting</td>
+  <tr id="2323">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2323";>2323</a></td>
+    <td>accepted</td>
     <td>Expunge POD</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2324">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2324";>2324</a></td>
@@ -13845,11 +13845,11 @@
     <td>Undefined behavior converting to short enums with fixed underlying types</td>
     <td class="none" align="center">Unknown</td>
   </tr>
-  <tr class="open" id="2339">
+  <tr id="2339">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2339";>2339</a></td>
-    <td>drafting</td>
+    <td>ready</td>
     <td>Underspecified template arguments in structured bindings</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2340">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2340";>2340</a></td>
@@ -13870,68 +13870,68 @@
     <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2343">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2343";>2343</a></td>
-    <td>open</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#2343";>2343</a></td>
+    <td>extension</td>
     <td><TT>void*</TT> non-type template parameters</td>
     <td align="center">Not resolved</td>
   </tr>
   <tr class="open" id="2344">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2344";>2344</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Redeclaration of names in <I>init-statement</I>s</td>
     <td align="center">Not resolved</td>
   </tr>
   <tr class="open" id="2345">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2345";>2345</a></td>
-    <td>open</td>
+    <td>review</td>
     <td>Jumping across initializers in <I>init-statement</I>s and <I>condition</I>s</td>
     <td align="center">Not resolved</td>
   </tr>
-  <tr class="open" id="2346">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2346";>2346</a></td>
-    <td>open</td>
+  <tr id="2346">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#2346";>2346</a></td>
+    <td>DR</td>
     <td>Local variables in default arguments</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2347">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2347";>2347</a></td>
     <td>open</td>
     <td>Passing short scoped enumerations to ellipsis</td>
     <td align="center">Not resolved</td>
   </tr>
-  <tr class="open" id="2348">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2348";>2348</a></td>
-    <td>open</td>
+  <tr id="2348">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#2348";>2348</a></td>
+    <td>NAD</td>
     <td>Non-templated <TT>constexpr if</TT></td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
-  <tr class="open" id="2349">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2349";>2349</a></td>
-    <td>open</td>
+  <tr id="2349">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#2349";>2349</a></td>
+    <td>NAD</td>
     <td>Class/enumeration names vs conditions</td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2350">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2350";>2350</a></td>
     <td>open</td>
     <td>Forwarding references and deduction guides</td>
     <td align="center">Not resolved</td>
   </tr>
-  <tr class="open" id="2351">
+  <tr id="2351">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2351";>2351</a></td>
-    <td>open</td>
+    <td>tentatively ready</td>
     <td><TT>void{}</TT></td>
-    <td align="center">Not resolved</td>
+    <td class="none" align="center">Unknown</td>
   </tr>
   <tr class="open" id="2352">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2352";>2352</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Similar types and reference binding</td>
     <td align="center">Not resolved</td>
   </tr>
   <tr class="open" id="2353">
     <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2353";>2353</a></td>
-    <td>open</td>
+    <td>drafting</td>
     <td>Potential results of a member access expression for a static data member</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13942,8 +13942,8 @@
     <td align="center">Not resolved</td>
   </tr>
   <tr class="open" id="2355">
-    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2355";>2355</a></td>
-    <td>open</td>
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#2355";>2355</a></td>
+    <td>extension</td>
     <td>Deducing <I>noexcept-specifier</I>s</td>
     <td align="center">Not resolved</td>
   </tr>
@@ -13953,6 +13953,60 @@
     <td>Base class copy and move constructors should not be inherited</td>
     <td class="none" align="center">Unknown</td>
   </tr>
+  <tr class="open" id="2357">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2357";>2357</a></td>
+    <td>open</td>
+    <td>Lookup in member function declarations</td>
+    <td align="center">Not resolved</td>
+  </tr>
+  <tr class="open" id="2358">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2358";>2358</a></td>
+    <td>drafting</td>
+    <td>Explicit capture of value</td>
+    <td align="center">Not resolved</td>
+  </tr>
+  <tr id="2359">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2359";>2359</a></td>
+    <td>tentatively ready</td>
+    <td>Unintended copy initialization with designated initializers</td>
+    <td class="none" align="center">Unknown</td>
+  </tr>
+  <tr class="open" id="2360">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2360";>2360</a></td>
+    <td>open</td>
+    <td><TT>[[maybe_unused]]</TT> and structured bindings</td>
+    <td align="center">Not resolved</td>
+  </tr>
+  <tr class="open" id="2361">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2361";>2361</a></td>
+    <td>open</td>
+    <td>Unclear description of <TT>longjmp</TT> undefined behavior</td>
+    <td align="center">Not resolved</td>
+  </tr>
+  <tr class="open" id="2362">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2362";>2362</a></td>
+    <td>open</td>
+    <td><TT>__func__</TT> should be <TT>constexpr</TT></td>
+    <td align="center">Not resolved</td>
+  </tr>
+  <tr class="open" id="2363">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2363";>2363</a></td>
+    <td>open</td>
+    <td>Opaque enumeration friend declarations</td>
+    <td align="center">Not resolved</td>
+  </tr>
+  <tr class="open" id="2364">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2364";>2364</a></td>
+    <td>open</td>
+    <td>Constant expressions, aggregate initialization, and modifications</td>
+    <td align="center">Not resolved</td>
+  </tr>
+  <tr class="open" id="2365">
+    <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2365";>2365</a></td>
+    <td>open</td>
+    <td>Confusing specification for <TT>dynamic_cast</TT></td>
+    <td align="center">Not resolved</td>
+  </tr>
 </table>
 
 </div>
Index: test/SemaCXX/warn-shadow-in-lambdas.cpp
===================================================================
--- test/SemaCXX/warn-shadow-in-lambdas.cpp
+++ test/SemaCXX/warn-shadow-in-lambdas.cpp
@@ -1,6 +1,7 @@
 // RUN: %clang_cc1 -std=c++14 -verify -fsyntax-only -Wshadow -D AVOID %s
 // RUN: %clang_cc1 -std=c++14 -verify -fsyntax-only -Wshadow -Wshadow-uncaptured-local %s
 // RUN: %clang_cc1 -std=c++14 -verify -fsyntax-only -Wshadow-all %s
+// RUN: %clang_cc1 -std=c++17 -verify -fsyntax-only -Wshadow-all %s
 
 void foo(int param) { // expected-note 1+ {{previous declaration is here}}
   int var = 0; // expected-note 1+ {{previous declaration is here}}
@@ -79,7 +80,7 @@
       int var = 1; // expected-warning {{declaration shadows a local variable}}
     };
     auto f2 = [param]   // expected-note {{variable 'param' is explicitly captured here}}
-     (int param) { ; }; // expected-warning {{declaration shadows a local variable}}
+     (int param) { ; }; // expected-error {{a lambda parameter cannot shadow an explicitly captured entity}}
   }
 
   // Warn for variables defined in the capture list.
@@ -135,7 +136,7 @@
   auto g2 = [=](auto param) { ; }; // expected-warning {{declaration shadows a local variable}}
 #endif
   auto g3 = [param] // expected-note {{variable 'param' is explicitly captured here}}
-   (auto param) { ; }; // expected-warning {{declaration shadows a local variable}}
+   (auto param) { ; }; // expected-error {{a lambda parameter cannot shadow an explicitly captured entity}}
 }
 
 void avoidWarningWhenRedefining() {
Index: test/CXX/drs/dr22xx.cpp
===================================================================
--- test/CXX/drs/dr22xx.cpp
+++ test/CXX/drs/dr22xx.cpp
@@ -15,3 +15,14 @@
   const volatile unsigned i3 : 1;
 };
 }
+
+#if __cplusplus >= 201103L
+namespace dr2211 { // dr2211: 8
+void f() {
+  int a;
+  auto f = [a](int a) { (void)a; }; // expected-error {{a lambda parameter cannot shadow an explicitly captured entity}}
+  // expected-note@-1{{variable 'a' is explicitly captured here}}
+  auto g = [=](int a) { (void)a; };
+}
+}
+#endif
Index: lib/Sema/SemaLambda.cpp
===================================================================
--- lib/Sema/SemaLambda.cpp
+++ lib/Sema/SemaLambda.cpp
@@ -493,15 +493,29 @@
   LSI->finishedExplicitCaptures();
 }
 
-void Sema::addLambdaParameters(CXXMethodDecl *CallOperator, Scope *CurScope) {
+void Sema::addLambdaParameters(
+    ArrayRef<LambdaIntroducer::LambdaCapture> Captures,
+    CXXMethodDecl *CallOperator, Scope *CurScope) {
   // Introduce our parameters into the function scope
   for (unsigned p = 0, NumParams = CallOperator->getNumParams();
        p < NumParams; ++p) {
     ParmVarDecl *Param = CallOperator->getParamDecl(p);
 
     // If this has an identifier, add it to the scope stack.
     if (CurScope && Param->getIdentifier()) {
-      CheckShadow(CurScope, Param);
+      bool Error = false;
+      // Resolution of CWG 2211 in C++17 renders shadowing ill-formed, but we
+      // retroactively apply it.
+      for (const auto &Capture : Captures) {
+        if (Capture.Id == Param->getIdentifier()) {
+          Error = true;
+          Diag(Param->getLocation(), diag::err_parameter_shadow_capture);
+          Diag(Capture.Loc, diag::note_var_explicitly_captured_here)
+              << Capture.Id << true;
+        }
+      }
+      if (!Error)
+        CheckShadow(CurScope, Param);
 
       PushOnScopeChains(Param, CurScope);
     }
@@ -1142,7 +1156,7 @@
   LSI->ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
 
   // Add lambda parameters into scope.
-  addLambdaParameters(Method, CurScope);
+  addLambdaParameters(Intro.Captures, Method, CurScope);
 
   // Enter a new evaluation context to insulate the lambda from any
   // cleanups from the enclosing full-expression.
Index: include/clang/Sema/Sema.h
===================================================================
--- include/clang/Sema/Sema.h
+++ include/clang/Sema/Sema.h
@@ -5580,7 +5580,9 @@
   void finishLambdaExplicitCaptures(sema::LambdaScopeInfo *LSI);
 
   /// Introduce the lambda parameters into scope.
-  void addLambdaParameters(CXXMethodDecl *CallOperator, Scope *CurScope);
+  void addLambdaParameters(
+      ArrayRef<LambdaIntroducer::LambdaCapture> Captures,
+      CXXMethodDecl *CallOperator, Scope *CurScope);
 
   /// Deduce a block or lambda's return type based on the return
   /// statements present in the body.
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td
+++ include/clang/Basic/DiagnosticSemaKinds.td
@@ -6630,6 +6630,10 @@
   def ext_star_this_lambda_capture_cxx17 : ExtWarn<
     "capture of '*this' by copy is a C++17 extension">, InGroup<CXX17>;
 
+  // C++17 parameter shadows capture
+  def err_parameter_shadow_capture : Error<
+    "a lambda parameter cannot shadow an explicitly captured entity">;
+
   // C++2a [=, this] captures.
   def warn_cxx17_compat_equals_this_lambda_capture : Warning<
     "explicit capture of 'this' with a capture default of '=' is incompatible "
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to