diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -2256,7 +2256,7 @@ def fno_asm : Flag<["-"], "fno-asm">, Group; def fno_asynchronous_unwind_tables : Flag<["-"], "fno-asynchronous-unwind-tables">, Group; def fno_assume_sane_operator_new : Flag<["-"], "fno-assume-sane-operator-new">, Group, - HelpText<"Don't assume that C++'s global operator new can't alias any pointer">, + HelpText<"Don't assume that C++'s global operator new can't alias any pointer or access accessible memory">, Flags<[CC1Option]>, MarshallingInfoNegativeFlag>; def fno_builtin : Flag<["-"], "fno-builtin">, Group, Flags<[CC1Option, CoreOption]>, HelpText<"Disable implicit builtin knowledge of functions">; 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(llvm::Attribute::InacccessibleMemOnly); + } } const CXXMethodDecl *MD = dyn_cast(Fn); const bool IsVirtualCall = MD && MD->isVirtual();