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 <rdar://problem/10062179>.

llvm-svn: 140651
This commit is contained in:
Douglas Gregor 2011-09-27 22:48:19 +00:00
parent c0b07286cf
commit eaed8d57dd
2 changed files with 1 additions and 81 deletions

View File

@ -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 <class _Tp>\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 <class _Tp>\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 <class _Tp>\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 <class _Tp>\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:

View File

@ -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);
}