<div dir="ltr"><div class="gmail_quote">If a lambda used as default argument in a method declaration contained<br>
a local class, that class was incorrectly recognized as nested class.<br>
In this case compiler tried to postpone parsing of this class until<br>
the enclosing class is finished, which caused crashes in some cases.<br>
<br>
This change fixes PR13987.<br>
<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D11006&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=EYV_BAyt_cWit7ecnaFZEfBy10r0ehty9ZSEISrZnRY&s=dus7a76c89jm0fDO7ss_vCtXyMuc39PYNSnW0jQM99c&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D11006</a><br>
<br>
Files:<br>
  lib/Parse/ParseDeclCXX.cpp<br>
  test/SemaCXX/cxx1y-generic-lambdas.cpp<br>
<br>
Index: test/SemaCXX/cxx1y-generic-lambdas.cpp<br>
===================================================================<br>
--- test/SemaCXX/cxx1y-generic-lambdas.cpp<br>
+++ test/SemaCXX/cxx1y-generic-lambdas.cpp<br>
@@ -948,3 +948,30 @@<br>
<br>
 auto x = f(0)();<br>
 }<br>
+<br>
+namespace PR13987 {<br>
+class Enclosing {<br>
+  void Method(char c = []()->char {<br>
+    int d = []()->int {<br>
+        struct LocalClass {<br>
+          int Method() { return 0; }<br>
+        };<br>
+      return 0;<br>
+    }();<br>
+    return d; }()<br>
+  );<br>
+};<br>
+<br>
+<br>
+class Enclosing2 {<br>
+  void Method(char c = [](auto x)->char {<br>
+    int d = []()->int {<br>
+        struct LocalClass {<br>
+          int Method() { return 0; }<br>
+        };<br>
+      return 0;<br>
+    }();<br>
+    return d; }(0)<br>
+  );<br>
+};<br>
+}<br>
Index: lib/Parse/ParseDeclCXX.cpp<br>
===================================================================<br>
--- lib/Parse/ParseDeclCXX.cpp<br>
+++ lib/Parse/ParseDeclCXX.cpp<br>
@@ -2824,6 +2824,9 @@<br>
           Parent = Parent->getParent();<br>
         if (Parent->isClassScope())<br>
           break;<br>
+        // Classes defined inside lambda functions are local as well.<br>
+        if (S->getFlags() & Scope::BlockScope)<br>
+          break;<br>
       }<br>
     }<br>
   }<br>
<br>
<br>
</div><br></div>