Emit an error when trying to @encode an incomplete type.

There are APIs, e.g. [NSValue valueWithBytes:objCType:], which use the encoding to find out
the size of an object pointed to by a pointer. Make things safer by making it illegal to @encode
incomplete types.

llvm-svn: 131364
This commit is contained in:
Argyrios Kyrtzidis 2011-05-14 20:32:39 +00:00
parent cb7e56e592
commit 7da04c6367
4 changed files with 20 additions and 2 deletions

View File

@ -2869,6 +2869,8 @@ def err_objc_pointer_cxx_catch_fragile : Error<
"exception model">;
def err_objc_object_catch : Error<
"can't catch an Objective C object by value">;
def err_incomplete_type_objc_at_encode : Error<
"'@encode' of incomplete type %0">;
def warn_setter_getter_impl_required : Warning<
"property %0 requires method %1 to be defined - "

View File

@ -3105,7 +3105,7 @@ public:
Expr **Strings,
unsigned NumStrings);
Expr *BuildObjCEncodeExpression(SourceLocation AtLoc,
ExprResult BuildObjCEncodeExpression(SourceLocation AtLoc,
TypeSourceInfo *EncodedTypeInfo,
SourceLocation RParenLoc);
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl,

View File

@ -119,7 +119,7 @@ ExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs,
return new (Context) ObjCStringLiteral(S, Ty, AtLocs[0]);
}
Expr *Sema::BuildObjCEncodeExpression(SourceLocation AtLoc,
ExprResult Sema::BuildObjCEncodeExpression(SourceLocation AtLoc,
TypeSourceInfo *EncodedTypeInfo,
SourceLocation RParenLoc) {
QualType EncodedType = EncodedTypeInfo->getType();
@ -127,6 +127,12 @@ Expr *Sema::BuildObjCEncodeExpression(SourceLocation AtLoc,
if (EncodedType->isDependentType())
StrTy = Context.DependentTy;
else {
if (!EncodedType->getAsArrayTypeUnsafe()) // Incomplete array is handled.
if (RequireCompleteType(AtLoc, EncodedType,
PDiag(diag::err_incomplete_type_objc_at_encode)
<< EncodedTypeInfo->getTypeLoc().getSourceRange()))
return ExprError();
std::string Str;
Context.getObjCEncodingForType(EncodedType, Str);

View File

@ -32,3 +32,13 @@ void test3(Object *o) {
// this is ok.
__sync_bool_compare_and_swap(&g, 0, o);
}
@class Incomplete_ObjC_class;
struct Incomplete_struct; // expected-note {{forward declaration}}
void test_encode() {
(void)@encode(Incomplete_ObjC_class); // expected-error {{incomplete type}}
(void)@encode(struct Incomplete_struct); // expected-error {{incomplete type}}
(void)@encode(Incomplete_ObjC_class*);
(void)@encode(id);
}