diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2011-03-17 23:28:31 +0000 |
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2011-03-17 23:28:31 +0000 |
| commit | c44f8cf7b8b832d6d586a8ed128b569315fb7854 (patch) | |
| tree | bd69961fef4f5cfd6d0f3d01460277770d546815 | |
| parent | ab959a2e68a0c40abb9f69adefb33e1306022333 (diff) | |
| download | bcm5719-llvm-c44f8cf7b8b832d6d586a8ed128b569315fb7854.tar.gz bcm5719-llvm-c44f8cf7b8b832d6d586a8ed128b569315fb7854.zip | |
Driver/Obj-C: Be compatible with GCC behavior in that -fno-exceptions *does not*
disable Obj-C exceptions.
llvm-svn: 127836
| -rw-r--r-- | clang/lib/Driver/Tools.cpp | 29 | ||||
| -rw-r--r-- | clang/test/Driver/exceptions.m | 19 |
2 files changed, 29 insertions, 19 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index cf6a8539527..45fdd8be2e6 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -843,25 +843,16 @@ static void addExceptionArgs(const ArgList &Args, types::ID InputType, if (ExceptionsEnabled && DidHaveExplicitExceptionFlag) ShouldUseExceptionTables = true; - if (types::isObjC(InputType)) { - bool ObjCExceptionsEnabled = ExceptionsEnabled; - - if (Arg *A = Args.getLastArg(options::OPT_fobjc_exceptions, - options::OPT_fno_objc_exceptions, - options::OPT_fexceptions, - options::OPT_fno_exceptions)) { - if (A->getOption().matches(options::OPT_fobjc_exceptions)) - ObjCExceptionsEnabled = true; - else if (A->getOption().matches(options::OPT_fno_objc_exceptions)) - ObjCExceptionsEnabled = false; - } - - if (ObjCExceptionsEnabled) { - CmdArgs.push_back("-fobjc-exceptions"); - - ShouldUseExceptionTables |= - shouldUseExceptionTablesForObjCExceptions(Args, Triple); - } + // Obj-C exceptions are enabled by default, regardless of -fexceptions. This + // is not necessarily sensible, but follows GCC. + if (types::isObjC(InputType) && + Args.hasFlag(options::OPT_fobjc_exceptions, + options::OPT_fno_objc_exceptions, + true)) { + CmdArgs.push_back("-fobjc-exceptions"); + + ShouldUseExceptionTables |= + shouldUseExceptionTablesForObjCExceptions(Args, Triple); } if (types::isCXX(InputType)) { diff --git a/clang/test/Driver/exceptions.m b/clang/test/Driver/exceptions.m new file mode 100644 index 00000000000..7d85fe30aef --- /dev/null +++ b/clang/test/Driver/exceptions.m @@ -0,0 +1,19 @@ +// RUN: %clang -ccc-host-triple x86_64-apple-darwin9 \ +// RUN: -fsyntax-only -fno-exceptions %s + +void f1() { + @throw @"A"; +} + +void f0() { + @try { + f1(); + } @catch (id x) { + ; + } +} + +int main() { + f0(); + return 0; +} |

