On Thu, Dec 4, 2014 at 4:01 PM, Nico Weber <[email protected]> wrote:
> This doesn't look right. Isn't cc1 -fexceptions passed if either ObjC or > C++ exceptions are enabled? > Right, this change doesn't make sense to me; Clang's -cc1 interface has no compatibility goal with GCC's cc1plus, and we should only be defining __EXCEPTIONS if the *driver* has -fexceptions passed to it. Perhaps the issue is that the driver should be forwarding -fexceptions to -fcxx-exceptions in more cases? > As is, it looks like this breaks this lovely bit of code from breakpad in > a .mm file: > > #ifndef __EXCEPTIONS > // This file uses C++ try/catch (but shouldn't). Duplicate the macros from > // <c++/4.2.1/exception_defines.h> allowing this file to work properly with > // exceptions disabled even when other C++ libraries are used. #undef the > try > // and catch macros first in case libstdc++ is in use and has already > provided > // its own definitions. > #undef try > #define try if (true) > #undef catch > #define catch(X) if (false) > #endif // __EXCEPTIONS > > even though that file is built with an explicit -fno-exceptions. Repro: > > $ bin/clang -fno-exceptions -x objective-c++ -dM /dev/null -E | grep EXCE > #define OBJC_ZEROCOST_EXCEPTIONS 1 > #define __EXCEPTIONS 1 > > On Mon, Oct 27, 2014 at 1:02 PM, David Majnemer <[email protected]> > wrote: > >> Author: majnemer >> Date: Mon Oct 27 15:02:19 2014 >> New Revision: 220714 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=220714&view=rev >> Log: >> Frontend: Define __EXCEPTIONS if -fexceptions is passed >> >> GCC defines __EXCEPTIONS, regardless of language mode, if -fexceptions >> is passed. We should do the same. >> >> This fixes PR21358. >> >> Modified: >> cfe/trunk/lib/Frontend/InitPreprocessor.cpp >> cfe/trunk/test/Frontend/exceptions.c >> cfe/trunk/test/Preprocessor/predefined-exceptions.m >> >> Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=220714&r1=220713&r2=220714&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original) >> +++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Mon Oct 27 15:02:19 2014 >> @@ -550,7 +550,7 @@ static void InitializePredefinedMacros(c >> Builder.defineMacro("__BLOCKS__"); >> } >> >> - if (!LangOpts.MSVCCompat && LangOpts.CXXExceptions) >> + if (!LangOpts.MSVCCompat && LangOpts.Exceptions) >> Builder.defineMacro("__EXCEPTIONS"); >> if (!LangOpts.MSVCCompat && LangOpts.RTTI) >> Builder.defineMacro("__GXX_RTTI"); >> >> Modified: cfe/trunk/test/Frontend/exceptions.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/exceptions.c?rev=220714&r1=220713&r2=220714&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Frontend/exceptions.c (original) >> +++ cfe/trunk/test/Frontend/exceptions.c Mon Oct 27 15:02:19 2014 >> @@ -1,6 +1,9 @@ >> -// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions >> -verify %s >> +// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions >> -DMS_MODE -verify %s >> // expected-no-diagnostics >> >> -#if defined(__EXCEPTIONS) >> +// RUN: %clang_cc1 -fms-compatibility -fexceptions -verify %s >> +// expected-no-diagnostics >> + >> +#if defined(MS_MODE) && defined(__EXCEPTIONS) >> #error __EXCEPTIONS should not be defined. >> #endif >> >> Modified: cfe/trunk/test/Preprocessor/predefined-exceptions.m >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/predefined-exceptions.m?rev=220714&r1=220713&r2=220714&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Preprocessor/predefined-exceptions.m (original) >> +++ cfe/trunk/test/Preprocessor/predefined-exceptions.m Mon Oct 27 >> 15:02:19 2014 >> @@ -1,6 +1,6 @@ >> // RUN: %clang_cc1 -x objective-c -fobjc-exceptions -fexceptions -E -dM >> %s | FileCheck -check-prefix=CHECK-OBJC-NOCXX %s >> // CHECK-OBJC-NOCXX: #define OBJC_ZEROCOST_EXCEPTIONS 1 >> -// CHECK-OBJC-NOCXX-NOT: #define __EXCEPTIONS 1 >> +// CHECK-OBJC-NOCXX: #define __EXCEPTIONS 1 >> >> // RUN: %clang_cc1 -x objective-c++ -fobjc-exceptions -fexceptions >> -fcxx-exceptions -E -dM %s | FileCheck -check-prefix=CHECK-OBJC-CXX %s >> // CHECK-OBJC-CXX: #define OBJC_ZEROCOST_EXCEPTIONS 1 >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
