diff options
-rw-r--r-- | include/clang/Basic/DiagnosticGroups.td | 3 | ||||
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 7 | ||||
-rw-r--r-- | lib/CodeGen/CGException.cpp | 2 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCGNU.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 18 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCRuntime.h | 3 | ||||
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 10 | ||||
-rw-r--r-- | test/CodeGenObjCXX/catch-id-type.mm | 17 | ||||
-rw-r--r-- | test/SemaObjCXX/exceptions-fragile.mm | 2 |
9 files changed, 41 insertions, 25 deletions
diff --git a/include/clang/Basic/DiagnosticGroups.td b/include/clang/Basic/DiagnosticGroups.td index 7881ad3ad6..8a10914988 100644 --- a/include/clang/Basic/DiagnosticGroups.td +++ b/include/clang/Basic/DiagnosticGroups.td @@ -296,3 +296,6 @@ def GNU : DiagGroup<"gnu", [GNUDesignator, VLA]>; // A warning group for warnings about Microsoft extensions. def Microsoft : DiagGroup<"microsoft">; + +def ObjCNonUnifiedException : DiagGroup<"objc-nonunified-exceptions">; + diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 6b710f5f1e..fb031596d5 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -3154,11 +3154,8 @@ def err_qualified_objc_catch_parm : Error< def err_objc_pointer_cxx_catch_gnu : Error< "can't catch Objective C exceptions in C++ in the GNU runtime">; def warn_objc_pointer_cxx_catch_fragile : Warning< - "catching Objective C id's exceptions in C++ in the non-unified " - "exception model">; -def err_objc_pointer_cxx_catch_fragile : Error< -"can't catch Objective C exceptions in C++ in the non-unified " -"exception model">; + "catching Objective C exceptions in C++ in the non-unified " + "exception model">, InGroup<ObjCNonUnifiedException>; def err_objc_object_catch : Error< "can't catch an Objective C object by value">; def err_incomplete_type_objc_at_encode : Error< diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index 79a730eb7e..1a4a5f988a 100644 --- a/lib/CodeGen/CGException.cpp +++ b/lib/CodeGen/CGException.cpp @@ -521,7 +521,7 @@ void CodeGenFunction::EnterCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) { llvm::Value *TypeInfo = 0; if (CaughtType->isObjCObjectPointerType()) - TypeInfo = CGM.getObjCRuntime().GetEHType(CaughtType, this); + TypeInfo = CGM.getObjCRuntime().GetEHType(CaughtType); else TypeInfo = CGM.GetAddrOfRTTIDescriptor(CaughtType, /*ForEH=*/true); CatchScope->setHandler(I, TypeInfo, Handler); diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp index ed194d9c91..6a711bff55 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/lib/CodeGen/CGObjCGNU.cpp @@ -438,7 +438,7 @@ public: bool lval = false); virtual llvm::Value *GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl *Method); - virtual llvm::Constant *GetEHType(QualType T, const CodeGenFunction *CGF=0); + virtual llvm::Constant *GetEHType(QualType T); virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD, const ObjCContainerDecl *CD); @@ -832,7 +832,7 @@ llvm::Value *CGObjCGNU::GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl return GetSelector(Builder, Method->getSelector(), SelTypes, false); } -llvm::Constant *CGObjCGNU::GetEHType(QualType T, const CodeGenFunction *CGF) { +llvm::Constant *CGObjCGNU::GetEHType(QualType T) { if (!CGM.getLangOptions().CPlusPlus) { if (T->isObjCIdType() || T->isObjCQualifiedIdType()) { diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 52dd520aa8..d518372f9c 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -1010,7 +1010,7 @@ public: virtual llvm::Value *GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl *Method); - virtual llvm::Constant *GetEHType(QualType T, const CodeGenFunction *CGF=0); + virtual llvm::Constant *GetEHType(QualType T); virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD); @@ -1271,7 +1271,7 @@ public: virtual llvm::Value *GenerateProtocolRef(CGBuilderTy &Builder, const ObjCProtocolDecl *PD); - virtual llvm::Constant *GetEHType(QualType T, const CodeGenFunction *CGF=0); + virtual llvm::Constant *GetEHType(QualType T); virtual llvm::Constant *GetPropertyGetFunction() { return ObjCTypes.getGetPropertyFn(); @@ -1414,12 +1414,20 @@ llvm::Value *CGObjCMac::GetSelector(CGBuilderTy &Builder, const ObjCMethodDecl return EmitSelector(Builder, Method->getSelector()); } -llvm::Constant *CGObjCMac::GetEHType(QualType T, const CodeGenFunction *CGF) { +llvm::Constant *CGObjCMac::GetEHType(QualType T) { if (T->isObjCIdType() || T->isObjCQualifiedIdType()) { return CGM.GetAddrOfRTTIDescriptor( - CGF->getContext().ObjCIdRedefinitionType, /*ForEH=*/true); + CGM.getContext().ObjCIdRedefinitionType, /*ForEH=*/true); } + if (T->isObjCClassType() || + T->isObjCQualifiedClassType()) { + return CGM.GetAddrOfRTTIDescriptor( + CGM.getContext().ObjCClassRedefinitionType, /*ForEH=*/true); + } + if (T->isObjCObjectPointerType()) + return CGM.GetAddrOfRTTIDescriptor(T, /*ForEH=*/true); + llvm_unreachable("asking for catch type for ObjC type in fragile runtime"); return 0; } @@ -6021,7 +6029,7 @@ CGObjCNonFragileABIMac::EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF, } llvm::Constant * -CGObjCNonFragileABIMac::GetEHType(QualType T, const CodeGenFunction *CGF) { +CGObjCNonFragileABIMac::GetEHType(QualType T) { // There's a particular fixed type info for 'id'. if (T->isObjCIdType() || T->isObjCQualifiedIdType()) { diff --git a/lib/CodeGen/CGObjCRuntime.h b/lib/CodeGen/CGObjCRuntime.h index 510143f767..7accc70c96 100644 --- a/lib/CodeGen/CGObjCRuntime.h +++ b/lib/CodeGen/CGObjCRuntime.h @@ -128,8 +128,7 @@ public: /// This is used externally to implement catching ObjC types in C++. /// Runtimes which don't support this should add the appropriate /// error to Sema. - virtual llvm::Constant *GetEHType(QualType T, - const CodeGenFunction *CGF=0) = 0; + virtual llvm::Constant *GetEHType(QualType T) = 0; /// Generate a constant string object. virtual llvm::Constant *GenerateConstantString(const StringLiteral *) = 0; diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 93f97f66ee..a7bd46a2ca 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -8045,14 +8045,8 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S, Diag(Loc, diag::err_objc_object_catch); Invalid = true; } else if (T->isObjCObjectPointerType()) { - if (!getLangOptions().ObjCNonFragileABI) { - if (T->isObjCIdType() || T->isObjCQualifiedIdType()) - Diag(Loc, diag::warn_objc_pointer_cxx_catch_fragile); - else { - Diag(Loc, diag::err_objc_pointer_cxx_catch_fragile); - Invalid = true; - } - } + if (!getLangOptions().ObjCNonFragileABI) + Diag(Loc, diag::warn_objc_pointer_cxx_catch_fragile); } } diff --git a/test/CodeGenObjCXX/catch-id-type.mm b/test/CodeGenObjCXX/catch-id-type.mm index 25d36550e8..ece342bb87 100644 --- a/test/CodeGenObjCXX/catch-id-type.mm +++ b/test/CodeGenObjCXX/catch-id-type.mm @@ -11,18 +11,33 @@ id Groups(); +@protocol P @end; + +@interface INTF<P> { + double dd; +} +@end + id FUNC() { id groups; try { groups = Groups(); // throws on errors. } + catch( INTF<P>* error ) + { + Groups(); + } catch( id error ) { - // CHECK: call i32 (i8*, i8*, ...)* @llvm.eh.selector({{.*}} @__gxx_personality_v0 {{.*}} @_ZTIP11objc_object + // CHECK: call i32 (i8*, i8*, ...)* @llvm.eh.selector({{.*}} @__gxx_personality_v0 {{.*}} @_ZTIP4INTF {{.*}} @_ZTIP11objc_object {{.*}} @_ZTIP10objc_class error = error; groups = [ns_array array]; } + catch (Class cl) { + cl = cl; + groups = [ns_array array]; + } return groups; } diff --git a/test/SemaObjCXX/exceptions-fragile.mm b/test/SemaObjCXX/exceptions-fragile.mm index d1e7077089..ebbf6a0374 100644 --- a/test/SemaObjCXX/exceptions-fragile.mm +++ b/test/SemaObjCXX/exceptions-fragile.mm @@ -6,7 +6,7 @@ void opaque(); namespace test0 { void test() { try { - } catch (NSException *e) { // expected-error {{can't catch Objective C exceptions in C++ in the non-unified exception model}} + } catch (NSException *e) { // expected-warning {{catching Objective C exceptions in C++ in the non-unified exception model [-Wobjc-nonunified-exceptions]}} } } } |