From: Fariborz Jahanian Date: Tue, 21 Apr 2009 20:28:41 +0000 (+0000) Subject: Patch to diagnose use of objc's @defs in nonfragile abi. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0468fb99068c40990a3b1451938fee5b90daf941;p=clang Patch to diagnose use of objc's @defs in nonfragile abi. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69710 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index f264de4d0c..94602071ae 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -925,6 +925,8 @@ def err_sizeof_forward_interface : Error< def err_sizeof_nonfragile_interface : Error< "invalid application of '%select{alignof|sizeof}1' to interface %0 in " "non-fragile ABI">; +def err_atdef_nonfragile_interface : Error< + "invalid application of @defs in non-fragile ABI">; // FIXME: merge with %select def err_sizeof_incomplete_type : Error< "invalid application of 'sizeof' to an incomplete type %0">; diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 9b5f0d7bb0..5ab1efec03 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -1975,6 +1975,11 @@ void Sema::ActOnDefs(Scope *S, DeclPtrTy TagD, SourceLocation DeclStart, Diag(DeclStart, diag::err_undef_interface) << ClassName; return; } + if (LangOpts.ObjCNonFragileABI) { + Diag(DeclStart, diag::err_atdef_nonfragile_interface); + return; + } + // Collect the instance variables CollectIvars(Class, dyn_cast(TagD.getAs()), Context, Decls); diff --git a/test/SemaObjC/sizeof-interface.m b/test/SemaObjC/sizeof-interface.m index 3dae7b9017..3bbe18db70 100644 --- a/test/SemaObjC/sizeof-interface.m +++ b/test/SemaObjC/sizeof-interface.m @@ -33,6 +33,8 @@ int g2[ sizeof(I0) // expected-error {{invalid application of 'sizeof' to inte @synthesize p0 = _p0; @end +typedef struct { @defs(I1) } I1_defs; // expected-error {{invalid application of @defs in non-fragile ABI}} + // FIXME: This is currently broken due to the way the record layout we // create is tied to whether we have seen synthesized properties. Ugh. // int g3[ sizeof(I1) == 0 ? 1 : -1];