diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-07-12 05:06:05 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-07-12 05:06:05 +0000 |
commit | 1cf9dd21dcb923b9aea3fab1e0959a59775bfc36 (patch) | |
tree | 1c77886e3284587afdcde142d8830e01a7ede16f | |
parent | 3ce8668273c418a9f8c807e704d35f97e07a67a9 (diff) | |
download | bcm5719-llvm-1cf9dd21dcb923b9aea3fab1e0959a59775bfc36.tar.gz bcm5719-llvm-1cf9dd21dcb923b9aea3fab1e0959a59775bfc36.zip |
Mangle dependent template names of unknown arity
llvm-svn: 134967
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 14 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle.cpp | 13 |
2 files changed, 17 insertions, 10 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 958b4a26a09..5a1025fff02 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -593,19 +593,13 @@ void CXXNameMangler::mangleUnscopedTemplateName(TemplateName Template) { if (mangleSubstitution(Template)) return; - // FIXME: How to cope with operators here? DependentTemplateName *Dependent = Template.getAsDependentTemplateName(); assert(Dependent && "Not a dependent template name?"); - if (!Dependent->isIdentifier()) { - // FIXME: We can't possibly know the arity of the operator here! - Diagnostic &Diags = Context.getDiags(); - unsigned DiagID = Diags.getCustomDiagID(Diagnostic::Error, - "cannot mangle dependent operator name"); - Diags.Report(DiagID); - return; - } + if (const IdentifierInfo *Id = Dependent->getIdentifier()) + mangleSourceName(Id); + else + mangleOperatorName(Dependent->getOperator(), UnknownArity); - mangleSourceName(Dependent->getIdentifier()); addSubstitution(Template); } diff --git a/clang/test/CodeGenCXX/mangle.cpp b/clang/test/CodeGenCXX/mangle.cpp index 56e70a2b151..0f4e5c5c382 100644 --- a/clang/test/CodeGenCXX/mangle.cpp +++ b/clang/test/CodeGenCXX/mangle.cpp @@ -826,3 +826,16 @@ namespace test34 { // CHECK: define weak_odr void @_ZN6test342f3ILy4EEEvRAplT_Ly8E_i template void f3<4>(int (&)[4 + sizeof(int*)]); } + +namespace test35 { + // Dependent operator names of unknown arity. + struct A { + template<typename U> A operator+(U) const; + }; + + template<typename T> + void f1(decltype(sizeof(&T::template operator+<int>))) {} + + // CHECK: define weak_odr void @_ZN6test352f1INS_1AEEEvDTszadsrT_plIiEE + template void f1<A>(__SIZE_TYPE__); +} |