forked from OSchip/llvm-project
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:
parent
a244f70113
commit
d3be2c83d5
|
@ -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
|
||||
|
|
|
@ -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>();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue