forked from OSchip/llvm-project
reject sizeof(itf) when itf is a forward declared interface, or when
in non-fragile abi mode. rdar://6811884 llvm-svn: 69701
This commit is contained in:
parent
2c332fec97
commit
37920f5359
|
@ -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">;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue