diff options
author | John McCall <rjmccall@apple.com> | 2015-11-05 19:19:56 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2015-11-05 19:19:56 +0000 |
commit | fbe5ed7807b127f7cc8a08481e758a9e522c3d16 (patch) | |
tree | a9797411d3e8f32878802ee4f88a1d812cf3dc21 /clang/lib | |
parent | a345877ce85dc6daef41fd1ef8bad54c05e63491 (diff) | |
download | bcm5719-llvm-fbe5ed7807b127f7cc8a08481e758a9e522c3d16.tar.gz bcm5719-llvm-fbe5ed7807b127f7cc8a08481e758a9e522c3d16.zip |
After some discussion, promote -fobjc-weak to a driver option.
rdar://problem/23415863
llvm-svn: 252187
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 17 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 17 |
2 files changed, 27 insertions, 7 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index d3276b9ae39..03d4c6be612 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -4816,6 +4816,23 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, } } + // Pass down -fobjc-weak or -fno-objc-weak if present. + if (types::isObjC(InputType)) { + auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak, + options::OPT_fno_objc_weak); + if (!WeakArg) { + // nothing to do + } else if (GCArg) { + if (WeakArg->getOption().matches(options::OPT_fobjc_weak)) + D.Diag(diag::err_objc_weak_with_gc); + } else if (!objcRuntime.allowsWeak()) { + if (WeakArg->getOption().matches(options::OPT_fobjc_weak)) + D.Diag(diag::err_objc_weak_unsupported); + } else { + WeakArg->render(Args, CmdArgs); + } + } + if (Args.hasFlag(options::OPT_fapplication_extension, options::OPT_fno_application_extension, false)) CmdArgs.push_back("-fapplication-extension"); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 468cc5746ce..7844b100d91 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1483,16 +1483,19 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, 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) { + // Note that we allow -fno-objc-weak to disable this even in ARC mode. + if (auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) { + if (!weakArg->getOption().matches(OPT_fobjc_weak)) { + assert(!Opts.ObjCWeak); + } else if (Opts.getGC() != LangOptions::NonGC) { Diags.Report(diag::err_objc_weak_with_gc); - } else if (Opts.ObjCWeakRuntime) { - Opts.ObjCWeak = true; - } else { + } else if (!Opts.ObjCWeakRuntime) { Diags.Report(diag::err_objc_weak_unsupported); + } else { + Opts.ObjCWeak = 1; } + } else if (Opts.ObjCAutoRefCount) { + Opts.ObjCWeak = Opts.ObjCWeakRuntime; } if (Args.hasArg(OPT_fno_objc_infer_related_result_type)) |