From: John McCall Date: Wed, 20 Jun 2012 21:58:02 +0000 (+0000) Subject: Introduce ObjCRuntime::hasWeakClassImport() and use it in the appropriate X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0b92fcb1353d2d8b31b6c485e6caa14568aca43b;p=clang Introduce ObjCRuntime::hasWeakClassImport() and use it in the appropriate places. I've turned this off for the GNU runtimes --- I don't know if they support weak class import, but it's easy enough for them to opt in. Also tweak a comment per review by Jordan. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158860 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/ObjCRuntime.h b/include/clang/Basic/ObjCRuntime.h index b87632ff6a..a1024c4a58 100644 --- a/include/clang/Basic/ObjCRuntime.h +++ b/include/clang/Basic/ObjCRuntime.h @@ -160,6 +160,18 @@ public: llvm_unreachable("bad kind"); } + /// Does this runtime support weakly importing classes? + bool hasWeakClassImport() const { + switch (getKind()) { + case MacOSX: return true; + case iOS: return true; + case FragileMacOSX: return false; + case FragileGNU: return false; + case GNU: return false; + } + llvm_unreachable("bad kind"); + } + /// Try to parse an Objective-C runtime specification from the given string. /// /// Return true on error. diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 7d72093700..574f779b86 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -430,7 +430,7 @@ bool Decl::canBeWeakImported(bool &IsDefinition) const { // Objective-C classes, if this is the non-fragile runtime. } else if (isa(this) && - getASTContext().getLangOpts().ObjCRuntime.isNonFragile()) { + getASTContext().getLangOpts().ObjCRuntime.hasWeakClassImport()) { return true; // Nothing else. diff --git a/lib/Basic/ObjCRuntime.cpp b/lib/Basic/ObjCRuntime.cpp index d92adbcb46..d66da0706f 100644 --- a/lib/Basic/ObjCRuntime.cpp +++ b/lib/Basic/ObjCRuntime.cpp @@ -43,8 +43,9 @@ bool ObjCRuntime::tryParse(StringRef input) { // Look for the last dash. std::size_t dash = input.rfind('-'); - // We permit (1) dashes in the runtime name and (2) the version to - // be omitted, so ignore dashes that aren't followed by a digit. + // We permit dashes in the runtime name, and we also permit the + // version to be omitted, so if we see a dash not followed by a + // digit then we need to ignore it. if (dash != StringRef::npos && dash + 1 != input.size() && (input[dash+1] < '0' || input[dash+1] > '9')) { dash = StringRef::npos; diff --git a/lib/Lex/PPMacroExpansion.cpp b/lib/Lex/PPMacroExpansion.cpp index 826fa03621..a5337867b1 100644 --- a/lib/Lex/PPMacroExpansion.cpp +++ b/lib/Lex/PPMacroExpansion.cpp @@ -644,7 +644,7 @@ static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) { .Case("objc_instancetype", LangOpts.ObjC2) .Case("objc_modules", LangOpts.ObjC2 && LangOpts.Modules) .Case("objc_nonfragile_abi", LangOpts.ObjCRuntime.isNonFragile()) - .Case("objc_weak_class", LangOpts.ObjCRuntime.isNonFragile()) + .Case("objc_weak_class", LangOpts.ObjCRuntime.hasWeakClassImport()) .Case("ownership_holds", true) .Case("ownership_returns", true) .Case("ownership_takes", true)