 lib/Frontend/CompilerInvocation.cpp | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index 97ca50a..a0ab648 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -1256,9 +1256,16 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
     Opts.LaxVectorConversions = 0;
   if (Args.hasArg(OPT_fno_threadsafe_statics))
     Opts.ThreadsafeStatics = 0;
-  Opts.Exceptions = Args.hasArg(OPT_fexceptions);
-  Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions);
-  Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions);
+  bool ObjCWithExceptions = (Opts.ObjC1 || Opts.ObjC2)
+                             && Opts.ObjCRuntime.hasUnwindExceptions();
+  Opts.Exceptions = Args.hasArg(OPT_fexceptions) || 
+                    ((Opts.CPlusPlus || ObjCWithExceptions)
+                     && !Args.hasArg(OPT_fno_exceptions));
+  Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions) || 
+                        ((Opts.ObjC1 || Opts.ObjC2)
+                         && !Args.hasArg(OPT_fno_objc_exceptions));
+  Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions) ||
+                       (Opts.CPlusPlus && !Args.hasArg(OPT_fno_cxx_exceptions));
   Opts.SjLjExceptions = Args.hasArg(OPT_fsjlj_exceptions);
   Opts.TraditionalCPP = Args.hasArg(OPT_traditional_cpp);
 
