diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -2062,11 +2062,14 @@ AddAttributesFromFunctionProtoType( getContext(), FuncAttrs, Fn->getType()->getAs()); if (AttrOnCallSite && Fn->isReplaceableGlobalAllocationFunction()) { - // A sane operator new returns a non-aliasing pointer. + // A sane operator new returns a non-aliasing pointer and is + // inaccessiblememonly auto Kind = Fn->getDeclName().getCXXOverloadedOperator(); if (getCodeGenOpts().AssumeSaneOperatorNew && - (Kind == OO_New || Kind == OO_Array_New)) + (Kind == OO_New || Kind == OO_Array_New)) { RetAttrs.addAttribute(llvm::Attribute::NoAlias); + FuncAttrs.addAttribute("inaccessiblememonly"); + } } const CXXMethodDecl *MD = dyn_cast(Fn); const bool IsVirtualCall = MD && MD->isVirtual();