diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-04 18:56:13 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-04 18:56:13 +0000 |
commit | be63bbfd2401a72b66c190e012985397471af24d (patch) | |
tree | 78949b623a26f800d97cbc8c0684c253043ee94b /clang/lib/CodeGen/Mangle.cpp | |
parent | 41a1550ef59b0eaab87e55393d6441ec06b6f2a7 (diff) | |
download | bcm5719-llvm-be63bbfd2401a72b66c190e012985397471af24d.tar.gz bcm5719-llvm-be63bbfd2401a72b66c190e012985397471af24d.zip |
Implement name mangling for sizeof...(pack), to silence the last of
the switch-enum warnings. Test is forthcoming, once I've dealt with
some template argument deduction issues.
llvm-svn: 122820
Diffstat (limited to 'clang/lib/CodeGen/Mangle.cpp')
-rw-r--r-- | clang/lib/CodeGen/Mangle.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp index 834ef4e5693..0969b8716f6 100644 --- a/clang/lib/CodeGen/Mangle.cpp +++ b/clang/lib/CodeGen/Mangle.cpp @@ -2048,6 +2048,28 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { Out << "sp"; mangleExpression(cast<PackExpansionExpr>(E)->getPattern()); break; + + case Expr::SizeOfPackExprClass: { + // FIXME: Variadic templates missing mangling for function parameter packs? + Out << "sZ"; + const NamedDecl *Pack = cast<SizeOfPackExpr>(E)->getPack(); + if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack)) + mangleTemplateParameter(TTP->getIndex()); + else if (const NonTypeTemplateParmDecl *NTTP + = dyn_cast<NonTypeTemplateParmDecl>(Pack)) + mangleTemplateParameter(NTTP->getIndex()); + else if (const TemplateTemplateParmDecl *TempTP + = dyn_cast<TemplateTemplateParmDecl>(Pack)) + mangleTemplateParameter(TempTP->getIndex()); + else { + // FIXME: This case isn't handled by the Itanium C++ ABI + Diagnostic &Diags = Context.getDiags(); + unsigned DiagID = Diags.getCustomDiagID(Diagnostic::Error, + "cannot mangle sizeof...(function parameter pack)"); + Diags.Report(DiagID); + return; + } + } } } |