The paired 'operator delete' for a placement 'operator new' is always a

placement 'operator delete', even if there are no placement args (i.e.
overload resolution selected an operator new with default arguments).

llvm-svn: 113861
This commit is contained in:
John McCall 2010-09-14 21:34:24 +00:00
parent a244f70113
commit d3be2c83d5
2 changed files with 26 additions and 1 deletions

View File

@ -1046,7 +1046,14 @@ bool Sema::FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range,
llvm::SmallVector<std::pair<DeclAccessPair,FunctionDecl*>, 2> Matches;
if (NumPlaceArgs > 0) {
// Whether we're looking for a placement operator delete is dictated
// by whether we selected a placement operator new, not by whether
// we had explicit placement arguments. This matters for things like
// struct A { void *operator new(size_t, int = 0); ... };
// A *a = new A()
bool isPlacementNew = (NumPlaceArgs > 0 || OperatorNew->param_size() != 1);
if (isPlacementNew) {
// C++ [expr.new]p20:
// A declaration of a placement deallocation function matches the
// declaration of a placement allocation function if it has the

View File

@ -354,3 +354,21 @@ namespace DeleteParam {
void operator delete(void* const);
};
}
// <rdar://problem/8427878>
// Test that the correct 'operator delete' is selected to pair with
// the unexpected placement 'operator new'.
namespace PairedDelete {
template <class T> struct A {
A();
void *operator new(size_t s, double d = 0);
void operator delete(void *p, double d);
void operator delete(void *p) {
T::dealloc(p);
}
};
A<int> *test() {
return new A<int>();
}
}