forked from OSchip/llvm-project
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:
parent
cb7e56e592
commit
7da04c6367
|
@ -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 - "
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue