<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>