Define weak and __weak to mean ARC-style weak references, even in MRC.

Previously, __weak was silently accepted and ignored in MRC mode.
That makes this a potentially source-breaking change that we have to
roll out cautiously.  Accordingly, for the time being, actual support
for __weak references in MRC is experimental, and the compiler will
reject attempts to actually form such references.  The intent is to
eventually enable the feature by default in all non-GC modes.
(It is, of course, incompatible with ObjC GC's interpretation of
__weak.)

If you like, you can enable this feature with
  -Xclang -fobjc-weak
but like any -Xclang option, this option may be removed at any point,
e.g. if/when it is eventually enabled by default.

This patch also enables the use of the ARC __unsafe_unretained qualifier
in MRC.  Unlike __weak, this is being enabled immediately.  Since
variables are essentially __unsafe_unretained by default in MRC,
the only practical uses are (1) communication and (2) changing the
default behavior of by-value block capture.

As an implementation matter, this means that the ObjC ownership
qualifiers may appear in any ObjC language mode, and so this patch
removes a number of checks for getLangOpts().ObjCAutoRefCount
that were guarding the processing of these qualifiers.  I don't
expect this to be a significant drain on performance; it may even
be faster to just check for these qualifiers directly on a type
(since it's probably in a register anyway) than to do N dependent
loads to grab the LangOptions.

rdar://9674298

llvm-svn: 251041
This commit is contained in:
John McCall
2015-10-22 18:38:17 +00:00
parent 63d23d1b12
commit 460ce58fa6
35 changed files with 570 additions and 212 deletions

View File

@@ -1421,12 +1421,28 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
Opts.ObjCAutoRefCount = 1;
if (!Opts.ObjCRuntime.allowsARC())
Diags.Report(diag::err_arc_unsupported_on_runtime);
}
// Only set ObjCARCWeak if ARC is enabled.
if (Args.hasArg(OPT_fobjc_runtime_has_weak))
Opts.ObjCARCWeak = 1;
else
Opts.ObjCARCWeak = Opts.ObjCRuntime.allowsWeak();
// ObjCWeakRuntime tracks whether the runtime supports __weak, not
// whether the feature is actually enabled. This is predominantly
// determined by -fobjc-runtime, but we allow it to be overridden
// from the command line for testing purposes.
if (Args.hasArg(OPT_fobjc_runtime_has_weak))
Opts.ObjCWeakRuntime = 1;
else
Opts.ObjCWeakRuntime = Opts.ObjCRuntime.allowsWeak();
// ObjCWeak determines whether __weak is actually enabled.
if (Opts.ObjCAutoRefCount) {
Opts.ObjCWeak = Opts.ObjCWeakRuntime;
} else if (Args.hasArg(OPT_fobjc_weak)) {
if (Opts.getGC() != LangOptions::NonGC) {
Diags.Report(diag::err_objc_weak_with_gc);
} else if (Opts.ObjCWeakRuntime) {
Opts.ObjCWeak = true;
} else {
Diags.Report(diag::err_objc_weak_unsupported);
}
}
if (Args.hasArg(OPT_fno_objc_infer_related_result_type))