diff options
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 6 | ||||
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 15 | ||||
-rw-r--r-- | test/SemaObjC/sizeof-interface.m | 13 |
3 files changed, 29 insertions, 5 deletions
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<proto>) + 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; |