forked from OSchip/llvm-project
modern objective-c translator: When translating
call to 'super' use __rw_objc_super as type of the 'super' meta-data instead of objc_super. // rdar://11239894 llvm-svn: 154670
This commit is contained in:
parent
aa0df2d373
commit
4af0e9efdd
|
@ -2270,7 +2270,7 @@ void RewriteModernObjC::RewriteBlockLiteralFunctionDecl(FunctionDecl *FD) {
|
||||||
CurFunctionDeclToDeclareForBlock = 0;
|
CurFunctionDeclToDeclareForBlock = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// SynthSuperContructorFunctionDecl - id objc_super(id obj, id super);
|
// SynthSuperContructorFunctionDecl - id __rw_objc_super(id obj, id super);
|
||||||
void RewriteModernObjC::SynthSuperContructorFunctionDecl() {
|
void RewriteModernObjC::SynthSuperContructorFunctionDecl() {
|
||||||
if (SuperContructorFunctionDecl)
|
if (SuperContructorFunctionDecl)
|
||||||
return;
|
return;
|
||||||
|
@ -2311,21 +2311,13 @@ void RewriteModernObjC::SynthMsgSendFunctionDecl() {
|
||||||
SC_None, false);
|
SC_None, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// SynthMsgSendSuperFunctionDecl - id objc_msgSendSuper(struct objc_super *, SEL op, ...);
|
// SynthMsgSendSuperFunctionDecl - id objc_msgSendSuper(void);
|
||||||
void RewriteModernObjC::SynthMsgSendSuperFunctionDecl() {
|
void RewriteModernObjC::SynthMsgSendSuperFunctionDecl() {
|
||||||
IdentifierInfo *msgSendIdent = &Context->Idents.get("objc_msgSendSuper");
|
IdentifierInfo *msgSendIdent = &Context->Idents.get("objc_msgSendSuper");
|
||||||
SmallVector<QualType, 16> ArgTys;
|
SmallVector<QualType, 2> ArgTys;
|
||||||
RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
|
ArgTys.push_back(Context->VoidTy);
|
||||||
SourceLocation(), SourceLocation(),
|
|
||||||
&Context->Idents.get("objc_super"));
|
|
||||||
QualType argT = Context->getPointerType(Context->getTagDeclType(RD));
|
|
||||||
assert(!argT.isNull() && "Can't build 'struct objc_super *' type");
|
|
||||||
ArgTys.push_back(argT);
|
|
||||||
argT = Context->getObjCSelType();
|
|
||||||
assert(!argT.isNull() && "Can't find 'SEL' type");
|
|
||||||
ArgTys.push_back(argT);
|
|
||||||
QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
|
QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
|
||||||
&ArgTys[0], ArgTys.size(),
|
&ArgTys[0], 1,
|
||||||
true /*isVariadic*/);
|
true /*isVariadic*/);
|
||||||
MsgSendSuperFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
|
MsgSendSuperFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
|
||||||
SourceLocation(),
|
SourceLocation(),
|
||||||
|
@ -2357,22 +2349,14 @@ void RewriteModernObjC::SynthMsgSendStretFunctionDecl() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SynthMsgSendSuperStretFunctionDecl -
|
// SynthMsgSendSuperStretFunctionDecl -
|
||||||
// id objc_msgSendSuper_stret(struct objc_super *, SEL op, ...);
|
// id objc_msgSendSuper_stret(void);
|
||||||
void RewriteModernObjC::SynthMsgSendSuperStretFunctionDecl() {
|
void RewriteModernObjC::SynthMsgSendSuperStretFunctionDecl() {
|
||||||
IdentifierInfo *msgSendIdent =
|
IdentifierInfo *msgSendIdent =
|
||||||
&Context->Idents.get("objc_msgSendSuper_stret");
|
&Context->Idents.get("objc_msgSendSuper_stret");
|
||||||
SmallVector<QualType, 16> ArgTys;
|
SmallVector<QualType, 2> ArgTys;
|
||||||
RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
|
ArgTys.push_back(Context->VoidTy);
|
||||||
SourceLocation(), SourceLocation(),
|
|
||||||
&Context->Idents.get("objc_super"));
|
|
||||||
QualType argT = Context->getPointerType(Context->getTagDeclType(RD));
|
|
||||||
assert(!argT.isNull() && "Can't build 'struct objc_super *' type");
|
|
||||||
ArgTys.push_back(argT);
|
|
||||||
argT = Context->getObjCSelType();
|
|
||||||
assert(!argT.isNull() && "Can't find 'SEL' type");
|
|
||||||
ArgTys.push_back(argT);
|
|
||||||
QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
|
QualType msgSendType = getSimpleFunctionType(Context->getObjCIdType(),
|
||||||
&ArgTys[0], ArgTys.size(),
|
&ArgTys[0], 1,
|
||||||
true /*isVariadic*/);
|
true /*isVariadic*/);
|
||||||
MsgSendSuperStretFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
|
MsgSendSuperStretFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
|
||||||
SourceLocation(),
|
SourceLocation(),
|
||||||
|
@ -2925,18 +2909,20 @@ Stmt *RewriteModernObjC::RewriteObjCDictionaryLiteralExpr(ObjCDictionaryLiteral
|
||||||
return CE;
|
return CE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// struct objc_super { struct objc_object *receiver; struct objc_class *super; };
|
// struct __rw_objc_super {
|
||||||
|
// struct objc_object *object; struct objc_object *superClass;
|
||||||
|
// };
|
||||||
QualType RewriteModernObjC::getSuperStructType() {
|
QualType RewriteModernObjC::getSuperStructType() {
|
||||||
if (!SuperStructDecl) {
|
if (!SuperStructDecl) {
|
||||||
SuperStructDecl = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
|
SuperStructDecl = RecordDecl::Create(*Context, TTK_Struct, TUDecl,
|
||||||
SourceLocation(), SourceLocation(),
|
SourceLocation(), SourceLocation(),
|
||||||
&Context->Idents.get("objc_super"));
|
&Context->Idents.get("__rw_objc_super"));
|
||||||
QualType FieldTypes[2];
|
QualType FieldTypes[2];
|
||||||
|
|
||||||
// struct objc_object *receiver;
|
// struct objc_object *object;
|
||||||
FieldTypes[0] = Context->getObjCIdType();
|
FieldTypes[0] = Context->getObjCIdType();
|
||||||
// struct objc_class *super;
|
// struct objc_object *superClass;
|
||||||
FieldTypes[1] = Context->getObjCClassType();
|
FieldTypes[1] = Context->getObjCIdType();
|
||||||
|
|
||||||
// Create fields
|
// Create fields
|
||||||
for (unsigned i = 0; i < 2; ++i) {
|
for (unsigned i = 0; i < 2; ++i) {
|
||||||
|
@ -3073,7 +3059,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
|
||||||
NoTypeInfoCStyleCastExpr(Context,
|
NoTypeInfoCStyleCastExpr(Context,
|
||||||
Context->getObjCIdType(),
|
Context->getObjCIdType(),
|
||||||
CK_BitCast, Cls));
|
CK_BitCast, Cls));
|
||||||
// struct objc_super
|
// struct __rw_objc_super
|
||||||
QualType superType = getSuperStructType();
|
QualType superType = getSuperStructType();
|
||||||
Expr *SuperRep;
|
Expr *SuperRep;
|
||||||
|
|
||||||
|
@ -3091,7 +3077,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
|
||||||
// the structure definition in the header. The rewriter has it's own
|
// the structure definition in the header. The rewriter has it's own
|
||||||
// internal definition (__rw_objc_super) that is uses. This is why
|
// internal definition (__rw_objc_super) that is uses. This is why
|
||||||
// we need the cast below. For example:
|
// we need the cast below. For example:
|
||||||
// (struct objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER"))
|
// (struct __rw_objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER"))
|
||||||
//
|
//
|
||||||
SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
|
SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
|
||||||
Context->getPointerType(SuperRep->getType()),
|
Context->getPointerType(SuperRep->getType()),
|
||||||
|
@ -3101,7 +3087,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
|
||||||
Context->getPointerType(superType),
|
Context->getPointerType(superType),
|
||||||
CK_BitCast, SuperRep);
|
CK_BitCast, SuperRep);
|
||||||
} else {
|
} else {
|
||||||
// (struct objc_super) { <exprs from above> }
|
// (struct __rw_objc_super) { <exprs from above> }
|
||||||
InitListExpr *ILE =
|
InitListExpr *ILE =
|
||||||
new (Context) InitListExpr(*Context, SourceLocation(),
|
new (Context) InitListExpr(*Context, SourceLocation(),
|
||||||
&InitExprs[0], InitExprs.size(),
|
&InitExprs[0], InitExprs.size(),
|
||||||
|
@ -3111,7 +3097,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
|
||||||
SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo,
|
SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo,
|
||||||
superType, VK_LValue,
|
superType, VK_LValue,
|
||||||
ILE, false);
|
ILE, false);
|
||||||
// struct objc_super *
|
// struct __rw_objc_super *
|
||||||
SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
|
SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
|
||||||
Context->getPointerType(SuperRep->getType()),
|
Context->getPointerType(SuperRep->getType()),
|
||||||
VK_RValue, OK_Ordinary,
|
VK_RValue, OK_Ordinary,
|
||||||
|
@ -3183,7 +3169,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
|
||||||
// set 'super class', using class_getSuperclass().
|
// set 'super class', using class_getSuperclass().
|
||||||
NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(),
|
NoTypeInfoCStyleCastExpr(Context, Context->getObjCIdType(),
|
||||||
CK_BitCast, Cls));
|
CK_BitCast, Cls));
|
||||||
// struct objc_super
|
// struct __rw_objc_super
|
||||||
QualType superType = getSuperStructType();
|
QualType superType = getSuperStructType();
|
||||||
Expr *SuperRep;
|
Expr *SuperRep;
|
||||||
|
|
||||||
|
@ -3200,7 +3186,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
|
||||||
// the structure definition in the header. The rewriter has it's own
|
// the structure definition in the header. The rewriter has it's own
|
||||||
// internal definition (__rw_objc_super) that is uses. This is why
|
// internal definition (__rw_objc_super) that is uses. This is why
|
||||||
// we need the cast below. For example:
|
// we need the cast below. For example:
|
||||||
// (struct objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER"))
|
// (struct __rw_objc_super *)&__rw_objc_super((id)self, (id)objc_getClass("SUPER"))
|
||||||
//
|
//
|
||||||
SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
|
SuperRep = new (Context) UnaryOperator(SuperRep, UO_AddrOf,
|
||||||
Context->getPointerType(SuperRep->getType()),
|
Context->getPointerType(SuperRep->getType()),
|
||||||
|
@ -3210,7 +3196,7 @@ Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
|
||||||
Context->getPointerType(superType),
|
Context->getPointerType(superType),
|
||||||
CK_BitCast, SuperRep);
|
CK_BitCast, SuperRep);
|
||||||
} else {
|
} else {
|
||||||
// (struct objc_super) { <exprs from above> }
|
// (struct __rw_objc_super) { <exprs from above> }
|
||||||
InitListExpr *ILE =
|
InitListExpr *ILE =
|
||||||
new (Context) InitListExpr(*Context, SourceLocation(),
|
new (Context) InitListExpr(*Context, SourceLocation(),
|
||||||
&InitExprs[0], InitExprs.size(),
|
&InitExprs[0], InitExprs.size(),
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
// RUN: %clang_cc1 -x objective-c++ -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"id=struct objc_object *" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
|
||||||
|
// rdar://11239894
|
||||||
|
|
||||||
|
extern "C" void *sel_registerName(const char *);
|
||||||
|
|
||||||
|
typedef struct objc_class * Class;
|
||||||
|
|
||||||
|
@interface Sub
|
||||||
|
- (void)dealloc;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface I : Sub
|
||||||
|
- (void)dealloc;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation I
|
||||||
|
- (void)dealloc {
|
||||||
|
return;
|
||||||
|
[super dealloc];
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
Loading…
Reference in New Issue