forked from OSchip/llvm-project
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:
parent
c0b07286cf
commit
eaed8d57dd
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue