<p dir="ltr">Does this also affect generic lambdas? If not, this is in conflict with another patch out for review that makes us reject template members of local classes.</p>
<div class="gmail_quote">On 14 Oct 2013 03:19, "David Majnemer" <<a href="mailto:david.majnemer@gmail.com">david.majnemer@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi eli.friedman, rsmith, rjmccall,<br>
<br>
On builds of clang compiled with asserts, we would crash during<br>
mangling.<br>
On builds of clang compiler without asserts, we would mangle in an extra<br>
prefix.<br>
<br>
i.e. Funtion()::Function::Type<void>[...] rather than Funtion()::Type<void>[...]<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D1932" target="_blank">http://llvm-reviews.chandlerc.com/D1932</a><br>
<br>
Files:<br>
  lib/AST/ItaniumMangle.cpp<br>
  test/CodeGenCXX/mangle-local-class-names.cpp<br>
<br>
Index: lib/AST/ItaniumMangle.cpp<br>
===================================================================<br>
--- lib/AST/ItaniumMangle.cpp<br>
+++ lib/AST/ItaniumMangle.cpp<br>
@@ -1504,18 +1504,16 @@<br>
   if (NoFunction && isLocalContainerContext(DC))<br>
     return;<br>
<br>
-  assert(!isLocalContainerContext(DC));<br>
-<br>
-  const NamedDecl *ND = cast<NamedDecl>(DC);<br>
+  const NamedDecl *ND = cast<NamedDecl>(DC);<br>
   if (mangleSubstitution(ND))<br>
     return;<br>
<br>
   // Check if we have a template.<br>
   const TemplateArgumentList *TemplateArgs = 0;<br>
   if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {<br>
     mangleTemplatePrefix(TD);<br>
     mangleTemplateArgs(*TemplateArgs);<br>
-  } else {<br>
+  } else if (!isLocalContainerContext(DC)) {<br>
     manglePrefix(getEffectiveDeclContext(ND), NoFunction);<br>
     mangleUnqualifiedName(ND);<br>
   }<br>
Index: test/CodeGenCXX/mangle-local-class-names.cpp<br>
===================================================================<br>
--- test/CodeGenCXX/mangle-local-class-names.cpp<br>
+++ test/CodeGenCXX/mangle-local-class-names.cpp<br>
@@ -95,3 +95,23 @@<br>
   y.g();<br>
 }<br>
 void CallLocalAnonStruct() { LocalAnonStruct(); }<br>
+<br>
+// CHECK: @_ZZ4Fun1vEN5Type15Type2IvE4Fun2Ev<br>
+// CHECK: @_ZZZ4Fun1vEN5Type15Type2IvE4Fun2EvEN5Type35Type4IvE4Fun3Ev<br>
+void Fun1() {<br>
+  struct Type1 {<br>
+    template <typename = void><br>
+    struct Type2 {<br>
+      static void Fun2() {<br>
+        struct Type3 {<br>
+          template <typename = void><br>
+          struct Type4 {<br>
+            static void Fun3() {}<br>
+          };<br>
+        };<br>
+        Type3::template Type4<>::Fun3();<br>
+      }<br>
+    };<br>
+  };<br>
+  Type1::Type2<>::Fun2();<br>
+}<br>
</blockquote></div>