forked from OSchip/llvm-project
Bugfix: don't assert if someone manages to declare an operator new/delete template before the builtin operator new/delete.
llvm-svn: 210230
This commit is contained in:
parent
ad81f0f419
commit
599bed75ed
|
@ -1041,8 +1041,9 @@ RValue CodeGenFunction::EmitBuiltinNewDeleteCall(const FunctionProtoType *Type,
|
|||
DeclarationName Name = Ctx.DeclarationNames
|
||||
.getCXXOperatorName(IsDelete ? OO_Delete : OO_New);
|
||||
for (auto *Decl : Ctx.getTranslationUnitDecl()->lookup(Name))
|
||||
if (Ctx.hasSameType(cast<FunctionDecl>(Decl)->getType(), QualType(Type, 0)))
|
||||
return EmitNewDeleteCall(*this, cast<FunctionDecl>(Decl), Type, Args);
|
||||
if (auto *FD = dyn_cast<FunctionDecl>(Decl))
|
||||
if (Ctx.hasSameType(FD->getType(), QualType(Type, 0)))
|
||||
return EmitNewDeleteCall(*this, cast<FunctionDecl>(Decl), Type, Args);
|
||||
llvm_unreachable("predeclared global operator new/delete is missing");
|
||||
}
|
||||
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
|
||||
typedef __typeof__(sizeof(0)) size_t;
|
||||
|
||||
// Declare an 'operator new' template to tickle a bug in __builtin_operator_new.
|
||||
template<typename T> void *operator new(size_t, int (*)(T));
|
||||
|
||||
// Ensure that this declaration doesn't cause operator new to lose its
|
||||
// 'noalias' attribute.
|
||||
void *operator new[](size_t);
|
||||
|
@ -33,7 +36,6 @@ void *operator new[](size_t, const std::nothrow_t &) throw();
|
|||
void operator delete(void *, const std::nothrow_t &) throw();
|
||||
void operator delete[](void *, const std::nothrow_t &) throw();
|
||||
|
||||
|
||||
void t2(int* a) {
|
||||
int* b = new (a) int;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue