<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 19, 2015 at 5:31 PM, Reid Kleckner <span dir="ltr"><<a href="mailto:reid@kleckner.net" target="_blank">reid@kleckner.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: rnk<br>
Date: Thu Mar 19 19:31:07 2015<br>
New Revision: 232788<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=232788&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=232788&view=rev</a><br>
Log:<br>
C++14: Disable sized deallocation by default due to ABI breakage<br>
<br>
There are no widely deployed standard libraries providing sized<br>
deallocation functions, so we have to punt and ask the user if they want<br>
us to use sized deallocation. In the future, when such libraries are<br>
deployed, we can teach the driver to detect them and enable this<br>
feature.<br>
<br>
N3536 claimed that a weak thunk from sized to unsized deallocation could<br>
be emitted to avoid breaking backwards compatibility with standard<br>
libraries not providing sized deallocation. However, this approach and<br>
other variations don't work in practice.<br>
<br>
With the weak function approach, the thunk has to have default<br>
visibility in order to ensure that it is overridden by other DSOs<br>
providing sized deallocation. Weak, default visibility symbols are<br>
particularly expensive on MachO, so John McCall was considering<br>
disabling this feature by default on Darwin. It also changes behavior<br>
ELF linking behavior, causing certain otherwise unreferenced object<br>
files from an archive to be pulled into the link.<br>
<br>
Our second approach was to use an extern_weak function declaration and<br>
do an inline conditional branch at the deletion call site. This doesn't<br>
work because extern_weak only works on MachO if you have some archive<br>
providing the default value of the extern_weak symbol. Arranging to<br>
provide such an archive has the same challenges as providing the symbol<br>
in the standard library. Not to mention that extern_weak doesn't really<br>
work on COFF.<br>
<br>
Reviewers: rsmith, rjmccall<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D8467" target="_blank">http://reviews.llvm.org/D8467</a><br>
<br>
Removed:<br>
    cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp<br>
    cfe/trunk/test/CodeGenCXX/pr21754.cpp<br>
Modified:<br>
    cfe/trunk/docs/ReleaseNotes.rst<br>
    cfe/trunk/include/clang/AST/Decl.h<br>
    cfe/trunk/include/clang/Basic/LangOptions.def<br>
    cfe/trunk/include/clang/Driver/CC1Options.td<br>
    cfe/trunk/include/clang/Driver/Options.td<br>
    cfe/trunk/lib/AST/Decl.cpp<br>
    cfe/trunk/lib/CodeGen/CodeGenFunction.cpp<br>
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp<br>
    cfe/trunk/lib/Driver/Tools.cpp<br>
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
    cfe/trunk/lib/Sema/SemaExprCXX.cpp<br>
    cfe/trunk/test/CXX/drs/dr412.cpp<br>
    cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp<br>
    cfe/trunk/test/Lexer/cxx-features.cpp<br>
    cfe/trunk/www/cxx_status.html<br>
<br>
Modified: cfe/trunk/docs/ReleaseNotes.rst<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ReleaseNotes.rst?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ReleaseNotes.rst?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/docs/ReleaseNotes.rst (original)<br>
+++ cfe/trunk/docs/ReleaseNotes.rst Thu Mar 19 19:31:07 2015<br>
@@ -62,6 +62,11 @@ about them. The improvements since the 3<br>
 New Compiler Flags<br>
 ------------------<br>
<br>
+The sized deallocation feature of C++14 is now controlled by the<br>
+``-fsized-deallocation`` flag. This feature relies on library support that<br>
+isn't yet widely deployed, so the user must supply an extra flag to get the<br>
+extra functionality.<br>
+<br>
 The option ....<br>
<br>
<br>
<br>
Modified: cfe/trunk/include/clang/AST/Decl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/AST/Decl.h (original)<br>
+++ cfe/trunk/include/clang/AST/Decl.h Thu Mar 19 19:31:07 2015<br>
@@ -1861,11 +1861,6 @@ public:<br>
   ///    allocation function. [...]<br>
   bool isReplaceableGlobalAllocationFunction() const;<br>
<br>
-  /// \brief Determine whether this function is a sized global deallocation<br>
-  /// function in C++1y. If so, find and return the corresponding unsized<br>
-  /// deallocation function.<br>
-  FunctionDecl *getCorrespondingUnsizedGlobalDeallocationFunction() const;<br>
-<br>
   /// Compute the language linkage.<br>
   LanguageLinkage getLanguageLinkage() const;<br>
<br>
<br>
Modified: cfe/trunk/include/clang/Basic/LangOptions.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/LangOptions.def (original)<br>
+++ cfe/trunk/include/clang/Basic/LangOptions.def Thu Mar 19 19:31:07 2015<br>
@@ -165,7 +165,6 @@ LANGOPT(CUDAAllowHostCallsFromHostDevice<br>
<br>
 LANGOPT(AssumeSaneOperatorNew , 1, 1, "implicit __attribute__((malloc)) for C++'s new operators")<br>
 LANGOPT(SizedDeallocation , 1, 0, "enable sized deallocation functions")<br>
-LANGOPT(DefineSizedDeallocation , 1, 0, "generate weak definitions of sized delete")<br>
 BENIGN_LANGOPT(ElideConstructors , 1, 1, "C++ copy constructor elision")<br>
 BENIGN_LANGOPT(DumpRecordLayouts , 1, 0, "dumping the layout of IRgen'd records")<br>
 BENIGN_LANGOPT(DumpRecordLayoutsSimple , 1, 0, "dumping the layout of IRgen'd records in a simple form")<br>
<br>
Modified: cfe/trunk/include/clang/Driver/CC1Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/CC1Options.td Thu Mar 19 19:31:07 2015<br>
@@ -518,12 +518,6 @@ def fdeprecated_macro : Flag<["-"], "fde<br>
   HelpText<"Defines the __DEPRECATED macro">;<br>
 def fno_deprecated_macro : Flag<["-"], "fno-deprecated-macro">,<br>
   HelpText<"Undefines the __DEPRECATED macro">;<br>
-def fsized_deallocation : Flag<["-"], "fsized-deallocation">,<br>
-  HelpText<"Enable C++14 sized global deallocation functions">;<br>
-def fno_sized_deallocation: Flag<["-"], "fno-sized-deallocation">,<br>
-  HelpText<"Disable sized deallocation functions">;<br>
-def fdefine_sized_deallocation: Flag<["-"], "fdefine-sized-deallocation">,<br>
-  HelpText<"Allow compiler-generated definition of sized deallocation functions">;<br></blockquote><div><br>This broke a couple of sanitizer (compiler-rt) tests:<br><br><div>    AddressSanitizer-i386-linux :: TestCases/Linux/sized_delete_test.cc</div><div>    AddressSanitizer-x86_64-linux :: TestCases/Linux/sized_delete_test.cc</div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
 def fobjc_subscripting_legacy_runtime : Flag<["-"], "fobjc-subscripting-legacy-runtime">,<br>
   HelpText<"Allow Objective-C array and dictionary subscripting in legacy runtime">;<br>
 def vtordisp_mode_EQ : Joined<["-"], "vtordisp-mode=">,<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/Options.td Thu Mar 19 19:31:07 2015<br>
@@ -830,6 +830,9 @@ def fapplication_extension : Flag<["-"],<br>
   HelpText<"Restrict code to those available for App Extensions">;<br>
 def fno_application_extension : Flag<["-"], "fno-application-extension">,<br>
   Group<f_Group>;<br>
+def fsized_deallocation : Flag<["-"], "fsized-deallocation">, Flags<[CC1Option]>,<br>
+  HelpText<"Enable C++14 sized global deallocation functions">, Group<f_Group>;<br>
+def fno_sized_deallocation: Flag<["-"], "fno-sized-deallocation">, Group<f_Group>;<br>
<br>
 def fobjc_gc_only : Flag<["-"], "fobjc-gc-only">, Group<f_Group>, Flags<[CC1Option]>,<br>
   HelpText<"Use GC exclusively for Objective-C related memory management">;<br>
<br>
Modified: cfe/trunk/lib/AST/Decl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/AST/Decl.cpp (original)<br>
+++ cfe/trunk/lib/AST/Decl.cpp Thu Mar 19 19:31:07 2015<br>
@@ -2513,39 +2513,6 @@ bool FunctionDecl::isReplaceableGlobalAl<br>
   return RD && isNamed(RD, "nothrow_t") && RD->isInStdNamespace();<br>
 }<br>
<br>
-FunctionDecl *<br>
-FunctionDecl::getCorrespondingUnsizedGlobalDeallocationFunction() const {<br>
-  ASTContext &Ctx = getASTContext();<br>
-  if (!Ctx.getLangOpts().SizedDeallocation)<br>
-    return nullptr;<br>
-<br>
-  if (getDeclName().getNameKind() != DeclarationName::CXXOperatorName)<br>
-    return nullptr;<br>
-  if (getDeclName().getCXXOverloadedOperator() != OO_Delete &&<br>
-      getDeclName().getCXXOverloadedOperator() != OO_Array_Delete)<br>
-    return nullptr;<br>
-  if (isa<CXXRecordDecl>(getDeclContext()))<br>
-    return nullptr;<br>
-<br>
-  if (!getDeclContext()->getRedeclContext()->isTranslationUnit())<br>
-    return nullptr;<br>
-<br>
-  if (getNumParams() != 2 || isVariadic() ||<br>
-      !Ctx.hasSameType(getType()->castAs<FunctionProtoType>()->getParamType(1),<br>
-                       Ctx.getSizeType()))<br>
-    return nullptr;<br>
-<br>
-  // This is a sized deallocation function. Find the corresponding unsized<br>
-  // deallocation function.<br>
-  lookup_result R = getDeclContext()->lookup(getDeclName());<br>
-  for (lookup_result::iterator RI = R.begin(), RE = R.end(); RI != RE;<br>
-       ++RI)<br>
-    if (FunctionDecl *FD = dyn_cast<FunctionDecl>(*RI))<br>
-      if (FD->getNumParams() == 1 && !FD->isVariadic())<br>
-        return FD;<br>
-  return nullptr;<br>
-}<br>
-<br>
 LanguageLinkage FunctionDecl::getLanguageLinkage() const {<br>
   return getDeclLanguageLinkage(*this);<br>
 }<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Thu Mar 19 19:31:07 2015<br>
@@ -802,20 +802,6 @@ static void TryMarkNoThrow(llvm::Functio<br>
   F->setDoesNotThrow();<br>
 }<br>
<br>
-static void EmitSizedDeallocationFunction(CodeGenFunction &CGF,<br>
-                                          const FunctionDecl *UnsizedDealloc) {<br>
-  // This is a weak discardable definition of the sized deallocation function.<br>
-  CGF.CurFn->setLinkage(llvm::Function::LinkOnceAnyLinkage);<br>
-  if (CGF.CGM.supportsCOMDAT())<br>
-    CGF.CurFn->setComdat(<br>
-        CGF.CGM.getModule().getOrInsertComdat(CGF.CurFn->getName()));<br>
-<br>
-  // Call the unsized deallocation function and forward the first argument<br>
-  // unchanged.<br>
-  llvm::Constant *Unsized = CGF.CGM.GetAddrOfFunction(UnsizedDealloc);<br>
-  CGF.Builder.CreateCall(Unsized, &*CGF.CurFn->arg_begin());<br>
-}<br>
-<br>
 void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn,<br>
                                    const CGFunctionInfo &FnInfo) {<br>
   const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());<br>
@@ -891,14 +877,6 @@ void CodeGenFunction::GenerateCode(Globa<br>
     emitImplicitAssignmentOperatorBody(Args);<br>
   } else if (Stmt *Body = FD->getBody()) {<br>
     EmitFunctionBody(Args, Body);<br>
-  } else if (FunctionDecl *UnsizedDealloc =<br>
-                 FD->getCorrespondingUnsizedGlobalDeallocationFunction()) {<br>
-    // Global sized deallocation functions get an implicit weak definition if<br>
-    // they don't have an explicit definition, if allowed.<br>
-    assert(getLangOpts().DefineSizedDeallocation &&<br>
-           "Can't emit unallowed definition.");<br>
-    EmitSizedDeallocationFunction(*this, UnsizedDealloc);<br>
-<br>
   } else<br>
     llvm_unreachable("no definition for emitted function");<br>
<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Thu Mar 19 19:31:07 2015<br>
@@ -1620,16 +1620,6 @@ CodeGenModule::GetOrCreateLLVMFunction(S<br>
       // don't need it anymore).<br>
       addDeferredDeclToEmit(F, DDI->second);<br>
       DeferredDecls.erase(DDI);<br>
-<br>
-      // Otherwise, if this is a sized deallocation function, emit a weak<br>
-      // definition for it at the end of the translation unit (if allowed),<br>
-      // unless the sized deallocation function is aliased.<br>
-    } else if (D &&<br>
-               cast<FunctionDecl>(D)<br>
-                  ->getCorrespondingUnsizedGlobalDeallocationFunction() &&<br>
-               getLangOpts().DefineSizedDeallocation &&<br>
-               !D->hasAttr<AliasAttr>()) {<br>
-      addDeferredDeclToEmit(F, GD);<br>
<br>
       // Otherwise, there are cases we have to worry about where we're<br>
       // using a declaration for which we must emit a definition but where<br>
<br>
Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Tools.cpp Thu Mar 19 19:31:07 2015<br>
@@ -4250,6 +4250,12 @@ void Clang::ConstructJob(Compilation &C,<br>
                     options::OPT_fno_assume_sane_operator_new))<br>
     CmdArgs.push_back("-fno-assume-sane-operator-new");<br>
<br>
+  // -fsized-deallocation is off by default, as it is an ABI-breaking change for<br>
+  // most platforms.<br>
+  if (Args.hasFlag(options::OPT_fsized_deallocation,<br>
+                   options::OPT_fno_sized_deallocation, false))<br>
+    CmdArgs.push_back("-fsized-deallocation");<br>
+<br>
   // -fconstant-cfstrings is default, and may be subject to argument translation<br>
   // on Darwin.<br>
   if (!Args.hasFlag(options::OPT_fconstant_cfstrings,<br>
<br>
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu Mar 19 19:31:07 2015<br>
@@ -1262,9 +1262,6 @@ void CompilerInvocation::setLangDefaults<br>
   Opts.CXXOperatorNames = Opts.CPlusPlus;<br>
<br>
   Opts.DollarIdents = !Opts.AsmPreprocessor;<br>
-<br>
-  // C++14 onwards has sized global deallocation functions.<br>
-  Opts.SizedDeallocation = Opts.CPlusPlus14;<br>
 }<br>
<br>
 /// Attempt to parse a visibility value out of the given argument.<br>
@@ -1543,10 +1540,7 @@ static void ParseLangArgs(LangOptions &O<br>
   Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;<br>
   Opts.NoMathBuiltin = Args.hasArg(OPT_fno_math_builtin);<br>
   Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);<br>
-  Opts.SizedDeallocation |= Args.hasArg(OPT_fsized_deallocation);<br>
-  Opts.SizedDeallocation &= !Args.hasArg(OPT_fno_sized_deallocation);<br>
-  Opts.DefineSizedDeallocation = Opts.SizedDeallocation &&<br>
-      Args.hasArg(OPT_fdefine_sized_deallocation);<br>
+  Opts.SizedDeallocation = Args.hasArg(OPT_fsized_deallocation);<br>
   Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);<br>
   Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);<br>
   Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Thu Mar 19 19:31:07 2015<br>
@@ -2168,15 +2168,6 @@ void Sema::DeclareGlobalAllocationFuncti<br>
       }<br>
     }<br>
   }<br>
-<br>
-  // If the function is sized operator delete and has not already been<br>
-  // declared, and weak definitions have been disabled, do not declare<br>
-  // it implicitly. Instead, let deallocation function lookup pick up<br>
-  // unsized delete.<br>
-  // FIXME: We should remove this guard once backward compatibility is<br>
-  // no longer an issue<br>
-  if (NumParams == 2 && !getLangOpts().DefineSizedDeallocation)<br>
-    return;<br>
<br>
   FunctionProtoType::ExtProtoInfo EPI;<br>
<br>
<br>
Modified: cfe/trunk/test/CXX/drs/dr412.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr412.cpp?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr412.cpp?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/drs/dr412.cpp (original)<br>
+++ cfe/trunk/test/CXX/drs/dr412.cpp Thu Mar 19 19:31:07 2015<br>
@@ -15,7 +15,7 @@ inline void* operator new(size_t) BAD_AL<br>
 inline void* operator new[](size_t) BAD_ALLOC; // expected-error {{cannot be declared 'inline'}}<br>
 inline void operator delete(void*) NOEXCEPT; // expected-error {{cannot be declared 'inline'}}<br>
 inline void operator delete[](void*) NOEXCEPT; // expected-error {{cannot be declared 'inline'}}<br>
-#if __cplusplus >= 201402L<br>
+#ifdef __cpp_sized_deallocation<br>
 inline void operator delete(void*, size_t) NOEXCEPT; // expected-error {{cannot be declared 'inline'}}<br>
 inline void operator delete[](void*, size_t) NOEXCEPT; // expected-error {{cannot be declared 'inline'}}<br>
 #endif<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp Thu Mar 19 19:31:07 2015<br>
@@ -1,22 +1,18 @@<br>
-// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED<br>
-// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -o - -DINLIB | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKUND<br>
-// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -fdefine-sized-deallocation -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKDEF<br>
-// RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED<br>
-// RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - -DINLIB | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKUND<br>
-// RUN: %clang_cc1 -std=c++11 -fsized-deallocation -fdefine-sized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKDEF<br>
+// Check that delete exprs call the sized deallocation function if<br>
+// -fsized-deallocation is passed in both C++11 and C++14.<br>
+// RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s<br>
+// RUN: %clang_cc1 -std=c++14 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s<br>
+<br>
+// Check that we don't used sized deallocation without -fsized-deallocation and<br>
+// C++14.<br>
 // RUN: %clang_cc1 -std=c++11 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED<br>
-// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -fno-sized-deallocation -o - | FileCheck %s --check-prefix=CHECK-UNSIZED<br>
+// RUN: %clang_cc1 -std=c++14 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED<br>
<br>
 // CHECK-UNSIZED-NOT: _ZdlPvm<br>
 // CHECK-UNSIZED-NOT: _ZdaPvm<br>
<br>
 typedef decltype(sizeof(0)) size_t;<br>
<br>
-#ifdef INLIB<br>
-void operator delete(void *, size_t) noexcept;<br>
-void operator delete[](void *, size_t) noexcept;<br>
-#endif<br>
-<br>
 typedef int A;<br>
 struct B { int n; };<br>
 struct C { ~C() {} };<br>
@@ -60,9 +56,7 @@ D::D() {}<br>
 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)<br>
 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})<br>
<br>
-// CHECKDEF-LABEL: define linkonce void @_ZdlPvm(i8*, i64) #{{[0-9]+}} comdat<br>
-// CHECKDEF: call void @_ZdlPv(i8* %0)<br>
-// CHECKUND-LABEL: declare void @_ZdlPvm(i8*<br>
+// CHECK-LABEL: declare void @_ZdlPvm(i8*<br>
<br>
 // CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()<br>
 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)<br>
@@ -82,9 +76,7 @@ D::D() {}<br>
 // CHECK: add i64 %{{[^ ]*}}, 8<br>
 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})<br>
<br>
-// CHECKDEF-LABEL: define linkonce void @_ZdaPvm(i8*, i64) #{{[0-9]+}} comdat<br>
-// CHECKDEF: call void @_ZdaPv(i8* %0)<br>
-// CHECKUND-LABEL: declare void @_ZdaPvm(i8*<br>
+// CHECK-LABEL: declare void @_ZdaPvm(i8*<br>
<br>
 // CHECK-LABEL: define weak_odr void @_Z3delI1DEvv()<br>
 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)<br>
<br>
Removed: cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp?rev=232787&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp?rev=232787&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp (removed)<br>
@@ -1,69 +0,0 @@<br>
-// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - -std=c++11 %s 2>&1 | FileCheck %s -check-prefix=CHECKDEF -check-prefix=CHECK11<br>
-// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - -std=c++11 -fvisibility hidden %s 2>&1 | FileCheck %s -check-prefix=CHECKHID -check-prefix=CHECK11<br>
-// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - -std=c++14 -DINLIB -fno-sized-deallocation %s 2>&1 | FileCheck %s -check-prefix=CHECKDEF -check-prefix=CHECK11<br>
-// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - -std=c++14 -DINLIB %s 2>&1 | FileCheck %s -check-prefix=CHECKDEF -check-prefix=CHECK14 -check-prefix=CHECK14UND<br>
-// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - -std=c++14 -DINLIB -fvisibility hidden %s 2>&1 | FileCheck %s -check-prefix=CHECKHID -check-prefix=CHECK14 -check-prefix=CHECK14UND<br>
-// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - -std=c++14 -DINLIB -fdefine-sized-deallocation %s 2>&1 | FileCheck %s -check-prefix=CHECKDEF -check-prefix=CHECK14 -check-prefix=CHECK14DEFCOMDAT<br>
-// RUN: %clang_cc1 -emit-llvm -triple x86_64-unknown-unknown -o - -std=c++14 -DINLIB -fdefine-sized-deallocation -fvisibility hidden %s 2>&1 | FileCheck %s -check-prefix=CHECKHID -check-prefix=CHECK14 -check-prefix=CHECK14DEFCOMDAT<br>
-// RUN: %clang_cc1 -emit-llvm -triple x86_64-apple-macosx -o - -std=c++14 -DINLIB -fdefine-sized-deallocation %s | FileCheck %s -check-prefix=CHECKDEF -check-prefix=CHECK14 -check-prefix=CHECK14DEFNOCOMDAT<br>
-<br>
-// PR22419: Implicit sized deallocation functions always have default visibility.<br>
-//   Generalized to all implicit allocation functions.<br>
-<br>
-#ifdef INLIB<br>
-typedef decltype(sizeof(0)) size_t;<br>
-void operator delete(void *, size_t) noexcept;<br>
-void operator delete[](void *, size_t) noexcept;<br>
-#endif<br>
-<br>
-// CHECK14-DAG: %struct.A = type { i8 }<br>
-struct A { };<br>
-<br>
-// CHECKDEF-DAG: define void @_Z3fooP1A(%struct.A* %is)<br>
-// CHECKHID-DAG: define hidden void @_Z3fooP1A(%struct.A* %is)<br>
-void foo(A* is) {<br>
-<br>
-  // CHECK11-DAG: call noalias i8* @_Znwm(i64 1)<br>
-  // CHECK14-DAG: call noalias i8* @_Znwm(i64 1)<br>
-  is = new A();<br>
-<br>
-  // CHECK11-DAG: call void @_ZdlPv(i8* %{{.+}})<br>
-  // CHECK14-DAG: call void @_ZdlPvm(i8* %{{.+}}, i64 1)<br>
-  delete is;<br>
-}<br>
-<br>
-// CHECK11-DAG: declare noalias i8* @_Znwm(i64)<br>
-// CHECK11-DAG: declare void @_ZdlPv(i8*)<br>
-<br>
-// CHECK14-DAG: declare noalias i8* @_Znwm(i64)<br>
-// CHECK14UND-DAG: declare void @_ZdlPvm(i8*, i64)<br>
-// CHECK14DEFCOMDAT-DAG: define linkonce void @_ZdlPvm(i8*, i64) #{{[0-9]+}} comdat {<br>
-// CHECK14DEFCOMDAT-DAG: declare void @_ZdlPv(i8*)<br>
-// CHECK14DEFNOCOMDAT-DAG: define linkonce void @_ZdlPvm(i8*, i64) #{{[0-9]+}} {<br>
-// CHECK14DEFNOCOMDAT-DAG: declare void @_ZdlPv(i8*)<br>
-<br>
-// CHECK14-DAG: %struct.B = type { i8 }<br>
-struct B { ~B() { }};<br>
-<br>
-// CHECKDEF-DAG: define void @_Z1fP1B(%struct.B* %p)<br>
-// CHECKHID-DAG: define hidden void @_Z1fP1B(%struct.B* %p)<br>
-void f(B *p) {<br>
-<br>
-  // CHECK11-DAG: call noalias i8* @_Znam(i64 13)<br>
-  // CHECK14-DAG: call noalias i8* @_Znam(i64 13)<br>
-  p = new B[5];<br>
-<br>
-  // CHECK11-DAG: call void @_ZdaPv(i8* %{{.+}})<br>
-  // CHECK14-DAG: call void @_ZdaPvm(i8* %{{.+}}, i64 %{{.+}})<br>
-  delete[] p;<br>
-}<br>
-<br>
-// CHECK11-DAG: declare noalias i8* @_Znam(i64)<br>
-// CHECK11-DAG: declare void @_ZdaPv(i8*)<br>
-<br>
-// CHECK14-DAG: declare noalias i8* @_Znam(i64)<br>
-// CHECK14UND-DAG: declare void @_ZdaPvm(i8*, i64)<br>
-// CHECK14DEF-DAG: define linkonce void @_ZdaPvm(i8*, i64) #{{[0-9]+}} comdat {<br>
-// CHECK14DEF-DAG: declare void @_ZdaPv(i8*)<br>
-// CHECK14DEFNOCOMDAT-DAG: define linkonce void @_ZdaPvm(i8*, i64) #{{[0-9]+}} {<br>
-// CHECK14DEFNOCOMDAT-DAG: declare void @_ZdaPv(i8*)<br>
<br>
Removed: cfe/trunk/test/CodeGenCXX/pr21754.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/pr21754.cpp?rev=232787&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/pr21754.cpp?rev=232787&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/pr21754.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/pr21754.cpp (removed)<br>
@@ -1,11 +0,0 @@<br>
-// RUN: %clang -cc1 -emit-llvm -triple x86_64-unknown-unknown -std=c++1y -o - %s 2>&1 | FileCheck %s<br>
-// RUN: %clang -cc1 -emit-llvm -triple x86_64-unknown-unknown -std=c++1y -fdefine-sized-deallocation -o - %s 2>&1 | FileCheck %s<br>
-// RUN: %clang -cc1 -emit-llvm -triple x86_64-unknown-unknown -std=c++1y -fno-sized-deallocation -o - %s 2>&1 | FileCheck %s<br>
-// RUN: %clang -cc1 -emit-llvm -triple x86_64-unknown-unknown -std=c++11 -fsized-deallocation -o - %s 2>&1 | FileCheck %s<br>
-// RUN: %clang -cc1 -emit-llvm -triple x86_64-unknown-unknown -std=c++11 -fsized-deallocation -fdefine-sized-deallocation -o - %s 2>&1 | FileCheck %s<br>
-// RUN: %clang -cc1 -emit-llvm -triple x86_64-unknown-unknown -std=c++11 -o - %s 2>&1 | FileCheck %s<br>
-<br>
-void operator delete(void*, unsigned long) throw() __attribute__((alias("foo")));<br>
-extern "C" void foo(void*, unsigned long) {}<br>
-<br>
-// CHECK-DAG: @_ZdlPvm = alias void (i8*, i64)* @foo<br>
<br>
Modified: cfe/trunk/test/Lexer/cxx-features.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/cxx-features.cpp?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/cxx-features.cpp?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Lexer/cxx-features.cpp (original)<br>
+++ cfe/trunk/test/Lexer/cxx-features.cpp Thu Mar 19 19:31:07 2015<br>
@@ -1,6 +1,6 @@<br>
 // RUN: %clang_cc1 -std=c++98 -verify %s<br>
 // RUN: %clang_cc1 -std=c++11 -verify %s<br>
-// RUN: %clang_cc1 -std=c++1y -verify %s<br>
+// RUN: %clang_cc1 -std=c++1y -fsized-deallocation -verify %s<br>
<br>
 // expected-no-diagnostics<br>
<br>
<br>
Modified: cfe/trunk/www/cxx_status.html<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_status.html?rev=232788&r1=232787&r2=232788&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_status.html?rev=232788&r1=232787&r2=232788&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/www/cxx_status.html (original)<br>
+++ cfe/trunk/www/cxx_status.html Thu Mar 19 19:31:07 2015<br>
@@ -504,14 +504,14 @@ Clang version in which each feature beca<br>
       <td class="full" align="center">Clang 3.4 <a href="#n3778">(6)</a></td><br>
     </tr><br>
 </table><br>
+<br>
 <p><br>
-<span id="n3778">(6): In Clang SVN, using sized deallocation in C++14 mode requires linking either<br>
-libc++ 3.7 or later, or libstdc++ 5 or later. Alternatively, you can use the<br>
-<code>-Xclang -fdefine-sized-deallocation</code> compiler option to enable the implementation from<br>
-Clang 3.4 through Clang 3.6, where weak definitions of sized deallocation functions are implicitly<br>
-generated (by the compiler). You can also use the <code>-Xclang -fno-sized-deallocation</code> option<br>
-to disable sized deallocation. Note that both of these flags are temporary provisions and may go away<br>
-soon.<br>
+<span id="n3778">(6): In Clang 3.7 and later, sized deallocation is only enabled<br>
+if the user passes the <code>-fsized-deallocation</code> flag. The user must<br>
+supply definitions of the sized deallocation functions, either by providing them<br>
+explicitly or by using a C++ standard library that does. <code>libstdc++</code><br>
+added these functions in version 5.0, and <code>libc++</code> added them in<br>
+version 3.7.<br>
 </span><br>
 </p><br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>