From: Douglas Gregor Date: Tue, 27 Sep 2011 22:48:19 +0000 (+0000) Subject: Remove the egregious hack that made Objective-C++ ARC work with older X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ed73b1046d1f30d64b47baaaeaaeffa6ef0dde91;p=clang Remove the egregious hack that made Objective-C++ ARC work with older versions of libc++. Newer versions of libc++ know how to deal with ARC properly. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140651 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index 4c0c11e35f..6f49ec4744 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/lib/Frontend/InitPreprocessor.cpp @@ -221,72 +221,6 @@ static void DefineExactWidthIntType(TargetInfo::IntType Ty, ConstSuffix); } -/// \brief Add definitions required for a smooth interaction between -/// Objective-C++ automatic reference counting and libc++. -static void AddObjCXXARCLibcxxDefines(const LangOptions &LangOpts, - MacroBuilder &Builder) { - Builder.defineMacro("_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF"); - - std::string Result; - { - // Provide overloads of the function std::__1::addressof() that accept - // references to lifetime-qualified objects. libc++'s (more general) - // std::__1::addressof() template fails to instantiate with such types, - // because it attempts to convert the object to a char& before - // dereferencing. - llvm::raw_string_ostream Out(Result); - - Out << "#pragma clang diagnostic push\n" - << "#pragma clang diagnostic ignored \"-Wc++0x-extensions\"\n" - << "namespace std { inline namespace __1 {\n" - << "\n"; - - Out << "template \n" - << "inline __attribute__ ((__visibility__(\"hidden\"), " - << "__always_inline__))\n" - << "__attribute__((objc_ownership(strong))) _Tp*\n" - << "addressof(__attribute__((objc_ownership(strong))) _Tp& __x) {\n" - << " return &__x;\n" - << "}\n" - << "\n"; - - if (LangOpts.ObjCRuntimeHasWeak) { - Out << "template \n" - << "inline __attribute__ ((__visibility__(\"hidden\")," - << "__always_inline__))\n" - << "__attribute__((objc_ownership(weak))) _Tp*\n" - << "addressof(__attribute__((objc_ownership(weak))) _Tp& __x) {\n" - << " return &__x;\n" - << "};\n" - << "\n"; - } - - Out << "template \n" - << "inline __attribute__ ((__visibility__(\"hidden\")," - << "__always_inline__))\n" - << "__attribute__((objc_ownership(autoreleasing))) _Tp*\n" - << "addressof(__attribute__((objc_ownership(autoreleasing))) _Tp& __x) " - << "{\n" - << " return &__x;\n" - << "}\n" - << "\n"; - - Out << "template \n" - << "inline __attribute__ ((__visibility__(\"hidden\"), " - << "__always_inline__))\n" - << "__unsafe_unretained _Tp* addressof(__unsafe_unretained _Tp& __x)" - << " {\n" - << " return &__x;\n" - << "}\n"; - - Out << "\n" - << "} }\n" - << "#pragma clang diagnostic pop\n" - << "\n"; - } - Builder.append(Result); -} - /// \brief Add definitions required for a smooth interaction between /// Objective-C++ automated reference counting and libstdc++ (4.2). static void AddObjCXXARCLibstdcxxDefines(const LangOptions &LangOpts, @@ -726,10 +660,7 @@ void clang::InitializePreprocessor(Preprocessor &PP, if (LangOpts.ObjC1 && LangOpts.CPlusPlus && LangOpts.ObjCAutoRefCount) { switch (InitOpts.ObjCXXARCStandardLibrary) { case ARCXX_nolib: - break; - - case ARCXX_libcxx: - AddObjCXXARCLibcxxDefines(LangOpts, Builder); + case ARCXX_libcxx: break; case ARCXX_libstdcxx: diff --git a/test/SemaObjCXX/arc-libcxx.mm b/test/SemaObjCXX/arc-libcxx.mm deleted file mode 100644 index 7992f602f5..0000000000 --- a/test/SemaObjCXX/arc-libcxx.mm +++ /dev/null @@ -1,11 +0,0 @@ -// RUN: %clang_cc1 -fsyntax-only -fobjc-arc -fobjc-arc-cxxlib=libc++ -fobjc-nonfragile-abi -fobjc-runtime-has-weak -verify %s - -@interface A @end - -void f(__strong id &sir, __weak id &wir, __autoreleasing id &air, - __unsafe_unretained id &uir) { - __strong id *sip = std::addressof(sir); - __weak id *wip = std::addressof(wir); - __autoreleasing id *aip = std::addressof(air); - __unsafe_unretained id *uip = std::addressof(uir); -}