summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2013-07-05 18:41:30 +0000
committerEli Friedman <eli.friedman@gmail.com>2013-07-05 18:41:30 +0000
commit86af13f0abbd0b4fe9a532101390a0c98292bdf3 (patch)
tree455d3809a1a0bf5d89bd755bf2512808ad81be7b
parent50b76b522686a7efd079ca4178cad517757d3b06 (diff)
downloadbcm5719-llvm-86af13f0abbd0b4fe9a532101390a0c98292bdf3.tar.gz
bcm5719-llvm-86af13f0abbd0b4fe9a532101390a0c98292bdf3.zip
Fix regression from r185450.
As it turns out, the NoFunction bit for local class mangling needed to be propagated into more places. r185450 turned what used to be an incorrect mangling into an assertion. llvm-svn: 185713
-rw-r--r--clang/lib/AST/ItaniumMangle.cpp9
-rw-r--r--clang/test/CodeGenCXX/mangle-local-class-names.cpp9
2 files changed, 14 insertions, 4 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index 419cb32e45a..adfc3a790fb 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -326,7 +326,7 @@ private:
void manglePrefix(NestedNameSpecifier *qualifier);
void manglePrefix(const DeclContext *DC, bool NoFunction=false);
void manglePrefix(QualType type);
- void mangleTemplatePrefix(const TemplateDecl *ND);
+ void mangleTemplatePrefix(const TemplateDecl *ND, bool NoFunction=false);
void mangleTemplatePrefix(TemplateName Template);
void mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity);
void mangleQualifiers(Qualifiers Quals);
@@ -1250,7 +1250,7 @@ void CXXNameMangler::mangleNestedName(const NamedDecl *ND,
// Check if we have a template.
const TemplateArgumentList *TemplateArgs = 0;
if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {
- mangleTemplatePrefix(TD);
+ mangleTemplatePrefix(TD, NoFunction);
mangleTemplateArgs(*TemplateArgs);
}
else {
@@ -1513,7 +1513,8 @@ void CXXNameMangler::mangleTemplatePrefix(TemplateName Template) {
mangleUnscopedTemplateName(Template);
}
-void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND) {
+void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND,
+ bool NoFunction) {
// <template-prefix> ::= <prefix> <template unqualified-name>
// ::= <template-param>
// ::= <substitution>
@@ -1530,7 +1531,7 @@ void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND) {
return;
}
- manglePrefix(getEffectiveDeclContext(ND));
+ manglePrefix(getEffectiveDeclContext(ND), NoFunction);
mangleUnqualifiedName(ND->getTemplatedDecl());
addSubstitution(ND);
}
diff --git a/clang/test/CodeGenCXX/mangle-local-class-names.cpp b/clang/test/CodeGenCXX/mangle-local-class-names.cpp
index 332146076ae..c3ea31a54ca 100644
--- a/clang/test/CodeGenCXX/mangle-local-class-names.cpp
+++ b/clang/test/CodeGenCXX/mangle-local-class-names.cpp
@@ -55,3 +55,12 @@ void GORF (float IVAR1)
}
}
+// CHECK: @_ZZ25LocalTemplateFunctionTestdEN5Local3fooIdEET_S1_
+int LocalTemplateFunctionTest(double d) {
+ struct Local {
+ template<class T> T foo(T t) {
+ return t;
+ }
+ };
+ return Local().foo(d);
+}
OpenPOWER on IntegriCloud