diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2012-02-16 12:22:20 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2012-02-16 12:22:20 +0000 |
commit | 2aed8b88613863f3c439cdfb205bdf8b608fb205 (patch) | |
tree | e9791c101a2e3b55dc3703adca331f4a83619907 /lib/AST/ItaniumMangle.cpp | |
parent | 1548d14f4092a817f7d90ad3e7a65266dc85fbc5 (diff) |
Revert "Revert "Make CXXNewExpr contain only a single initialier, and not hold the used constructor itself.""
This reintroduces commit r150682 with a fix for the Bullet benchmark crash.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150685 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ItaniumMangle.cpp')
-rw-r--r-- | lib/AST/ItaniumMangle.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 7df8f6fc6b..4843716909 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -2351,10 +2351,20 @@ recurse: Out << '_'; mangleType(New->getAllocatedType()); if (New->hasInitializer()) { + // FIXME: Does this mean "parenthesized initializer"? Out << "pi"; - for (CXXNewExpr::const_arg_iterator I = New->constructor_arg_begin(), - E = New->constructor_arg_end(); I != E; ++I) - mangleExpression(*I); + const Expr *Init = New->getInitializer(); + if (const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init)) { + // Directly inline the initializers. + for (CXXConstructExpr::const_arg_iterator I = CCE->arg_begin(), + E = CCE->arg_end(); + I != E; ++I) + mangleExpression(*I); + } else if (const ParenListExpr *PLE = dyn_cast<ParenListExpr>(Init)) { + for (unsigned i = 0, e = PLE->getNumExprs(); i != e; ++i) + mangleExpression(PLE->getExpr(i)); + } else + mangleExpression(Init); } Out << 'E'; break; |