From: Chris Lattner Date: Tue, 21 Apr 2009 19:55:16 +0000 (+0000) Subject: reject sizeof(itf) when itf is a forward declared interface, or when X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ca790923930ca8df23bc1473fe925586e27387a6;p=clang reject sizeof(itf) when itf is a forward declared interface, or when in non-fragile abi mode. rdar://6811884 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69701 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index acfc006738..f264de4d0c 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -919,6 +919,12 @@ def ext_sizeof_function_type : Extension< "invalid application of 'sizeof' to a function type">; def ext_sizeof_void_type : Extension< "invalid application of '%0' to a void type">; +def err_sizeof_forward_interface : Error< + "invalid application of '%select{alignof|sizeof}1' to a forward declared" + " interface %0">; +def err_sizeof_nonfragile_interface : Error< + "invalid application of '%select{alignof|sizeof}1' to interface %0 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/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 788361b59a..b6f1afbe41 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -1225,7 +1225,22 @@ bool Sema::CheckSizeOfAlignOfOperand(QualType exprType, << (isSizeof ? "sizeof" : "__alignof") << ExprRange; return false; } + + // sizeof(interface) and sizeof(interface) + if (const ObjCInterfaceType *IIT = exprType->getAsObjCInterfaceType()) { + if (IIT->getDecl()->isForwardDecl()) { + Diag(OpLoc, diag::err_sizeof_forward_interface) + << IIT->getDecl()->getDeclName() << isSizeof; + return true; + } + if (LangOpts.ObjCNonFragileABI) { + Diag(OpLoc, diag::err_sizeof_nonfragile_interface) + << IIT->getDecl()->getDeclName() << isSizeof; + return true; + } + } + return RequireCompleteType(OpLoc, exprType, isSizeof ? diag::err_sizeof_incomplete_type : diag::err_alignof_incomplete_type, diff --git a/test/SemaObjC/sizeof-interface.m b/test/SemaObjC/sizeof-interface.m index 9ed63a7406..3dae7b9017 100644 --- a/test/SemaObjC/sizeof-interface.m +++ b/test/SemaObjC/sizeof-interface.m @@ -1,8 +1,9 @@ -// RUN: clang-cc -triple x86_64-apple-darwin9 -fsyntax-only %s +// RUN: clang-cc -triple x86_64-apple-darwin9 -verify -fsyntax-only %s @class I0; -// FIXME: Reject sizeof on incomplete interface; this breaks the test! -//int g0 = sizeof(I0); // exxpected-error{{invalid application of 'sizeof' to an incomplete type ...}} + +// rdar://6811884 +int g0 = sizeof(I0); // expected-error{{invalid application of 'sizeof' to a forward declared interface 'I0'}} @interface I0 { char x[4]; @@ -12,7 +13,8 @@ @end // size == 4 -int g1[ sizeof(I0) == 4 ? 1 : -1]; +int g1[ sizeof(I0) // expected-error {{invalid application of 'sizeof' to interface 'I0' in non-fragile ABI}} + == 4 ? 1 : -1]; @implementation I0 @synthesize p0 = _p0; @@ -20,7 +22,8 @@ int g1[ sizeof(I0) == 4 ? 1 : -1]; // size == 4 (we do not include extended properties in the // sizeof). -int g2[ sizeof(I0) == 4 ? 1 : -1]; +int g2[ sizeof(I0) // expected-error {{invalid application of 'sizeof' to interface 'I0' in non-fragile ABI}} + == 4 ? 1 : -1]; @interface I1 @property int p0;