diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-09-23 21:41:42 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-09-23 21:41:42 +0000 |
commit | d784e6893cfbdd24b4f701e486adbab9906d4b27 (patch) | |
tree | cb6c302cc41d7d560f657e3ec93c7b0b75a4cb1d /clang/lib/AST/ItaniumMangle.cpp | |
parent | ed9b8f0a373b01e93b139f33a85465d79b7154df (diff) | |
download | bcm5719-llvm-d784e6893cfbdd24b4f701e486adbab9906d4b27.tar.gz bcm5719-llvm-d784e6893cfbdd24b4f701e486adbab9906d4b27.zip |
PR14858: Initial support for proper sizeof... handling within alias templates.
This doesn't quite get alias template equivalence right yet, but handles the
egregious cases where we would silently give the wrong answers.
llvm-svn: 248431
Diffstat (limited to 'clang/lib/AST/ItaniumMangle.cpp')
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 9fafef13f62..64f9ccd9967 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -3458,8 +3458,17 @@ recurse: break; case Expr::SizeOfPackExprClass: { + auto *SPE = cast<SizeOfPackExpr>(E); + if (SPE->isPartiallySubstituted()) { + Out << "sP"; + for (const auto &A : SPE->getPartialArguments()) + mangleTemplateArg(A); + Out << "E"; + break; + } + Out << "sZ"; - const NamedDecl *Pack = cast<SizeOfPackExpr>(E)->getPack(); + const NamedDecl *Pack = SPE->getPack(); if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack)) mangleTemplateParameter(TTP->getIndex()); else if (const NonTypeTemplateParmDecl *NTTP |