[cfe-commits] r133639 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/CodeGen/CGException.cpp lib/CodeGen/CGObjCGNU.cpp lib/CodeGen/CGObjCMac.cpp lib/CodeGen/CGObjCRuntime.h lib/Sema/SemaDeclCXX.cpp test/CodeGenObjCXX/catch-id-type.mm

John McCall rjmccall at apple.com
Wed Jun 22 13:48:01 PDT 2011


On Jun 22, 2011, at 1:21 PM, Fariborz Jahanian wrote:
> Added:
>    cfe/trunk/test/CodeGenObjCXX/catch-id-type.mm
> Modified:
>    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>    cfe/trunk/lib/CodeGen/CGException.cpp
>    cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
>    cfe/trunk/lib/CodeGen/CGObjCMac.cpp
>    cfe/trunk/lib/CodeGen/CGObjCRuntime.h
>    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> 
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=133639&r1=133638&r2=133639&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Jun 22 15:21:51 2011
> @@ -3151,9 +3151,12 @@
>   "@catch parameter declarator cannot be qualified">;
> def err_objc_pointer_cxx_catch_gnu : Error<
>   "can't catch Objective C exceptions in C++ in the GNU runtime">;
> -def err_objc_pointer_cxx_catch_fragile : Error<
> -  "can't catch Objective C exceptions in C++ in the non-unified "
> +def warn_objc_pointer_cxx_catch_fragile : Warning<
> +  "catching Objective C id's exceptions in C++ in the non-unified "
>   "exception model">;

Please put this in a warning group so that users who do it intentionally
can suppress the warning.  I suggest -Wobjc-nonunified-exceptions.

> Modified: cfe/trunk/lib/CodeGen/CGObjCGNU.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=133639&r1=133638&r2=133639&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGObjCGNU.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGObjCGNU.cpp Wed Jun 22 15:21:51 2011
> @@ -438,7 +438,7 @@
>                                    bool lval = false);
>   virtual llvm::Value *GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl
>       *Method);
> -  virtual llvm::Constant *GetEHType(QualType T);
> +  virtual llvm::Constant *GetEHType(QualType T, const CodeGenFunction *CGF=0);

Er.  Why is a CGF necessary here?  The only use I can see is:

> -llvm::Constant *CGObjCMac::GetEHType(QualType T) {
> +llvm::Constant *CGObjCMac::GetEHType(QualType T, const CodeGenFunction *CGF) {
> +  if (T->isObjCIdType() ||
> +      T->isObjCQualifiedIdType()) {
> +    return CGM.GetAddrOfRTTIDescriptor(
> +              CGF->getContext().ObjCIdRedefinitionType, /*ForEH=*/true);
> +  }

But CodeGenModule has a getContext() method, too.

Also, I think these users want to be able to throw and catch any Objective-C
type, not just id and qualified id, and it looks like this will change the EH
type we use for 'id' in a fragile @catch, too, which seems wrong.

John.



More information about the cfe-commits mailing list