mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
Allow user re-definition of SEL as well as accessing its fields.
This fixes pr5611. llvm-svn: 89895
This commit is contained in:
@@ -243,7 +243,7 @@ public:
|
||||
// pseudo-builtins
|
||||
QualType ObjCIdRedefinitionType;
|
||||
QualType ObjCClassRedefinitionType;
|
||||
QualType ObjCSELRedefinitionType;
|
||||
QualType ObjCSelRedefinitionType;
|
||||
|
||||
/// \brief Source ranges for all of the comments in the source file,
|
||||
/// sorted in order of appearance in the translation unit.
|
||||
|
||||
@@ -48,7 +48,7 @@ ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM,
|
||||
BuiltinInfo(builtins), ExternalSource(0), PrintingPolicy(LOpts) {
|
||||
ObjCIdRedefinitionType = QualType();
|
||||
ObjCClassRedefinitionType = QualType();
|
||||
ObjCSELRedefinitionType = QualType();
|
||||
ObjCSelRedefinitionType = QualType();
|
||||
if (size_reserve > 0) Types.reserve(size_reserve);
|
||||
TUDecl = TranslationUnitDecl::Create(*this);
|
||||
InitBuiltinTypes();
|
||||
|
||||
@@ -1558,7 +1558,7 @@ void PCHReader::InitializeContext(ASTContext &Ctx) {
|
||||
// FIXME. Accommodate for this in several PCH/Index tests
|
||||
if (unsigned ObjCSelRedef
|
||||
= SpecialTypes[pch::SPECIAL_TYPE_OBJC_SEL_REDEFINITION])
|
||||
Context->ObjCSELRedefinitionType = GetType(ObjCSelRedef);
|
||||
Context->ObjCSelRedefinitionType = GetType(ObjCSelRedef);
|
||||
#endif
|
||||
if (unsigned String = SpecialTypes[pch::SPECIAL_TYPE_BLOCK_DESCRIPTOR])
|
||||
Context->setBlockDescriptorType(GetType(String));
|
||||
|
||||
@@ -1997,7 +1997,7 @@ void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls,
|
||||
AddTypeRef(Context.ObjCClassRedefinitionType, Record);
|
||||
#if 0
|
||||
// FIXME. Accommodate for this in several PCH/Indexer tests
|
||||
AddTypeRef(Context.ObjCSELRedefinitionType, Record);
|
||||
AddTypeRef(Context.ObjCSelRedefinitionType, Record);
|
||||
#endif
|
||||
AddTypeRef(Context.getRawBlockdescriptorType(), Record);
|
||||
AddTypeRef(Context.getRawBlockdescriptorExtendedType(), Record);
|
||||
|
||||
@@ -307,7 +307,7 @@ void Sema::ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) {
|
||||
&Context.Idents.get("SEL"), SelInfo);
|
||||
PushOnScopeChains(SelTypedef, TUScope);
|
||||
Context.setObjCSelType(Context.getTypeDeclType(SelTypedef));
|
||||
Context.ObjCSELRedefinitionType = Context.getObjCSelType();
|
||||
Context.ObjCSelRedefinitionType = Context.getObjCSelType();
|
||||
}
|
||||
|
||||
// Synthesize "@class Protocol;
|
||||
|
||||
@@ -681,7 +681,7 @@ void Sema::MergeTypeDefDecl(TypedefDecl *New, LookupResult &OldDecls) {
|
||||
case 3:
|
||||
if (!TypeID->isStr("SEL"))
|
||||
break;
|
||||
Context.ObjCSELRedefinitionType = New->getUnderlyingType();
|
||||
Context.ObjCSelRedefinitionType = New->getUnderlyingType();
|
||||
// Install the built-in type for 'SEL', ignoring the current definition.
|
||||
New->setTypeForDecl(Context.getObjCSelType().getTypePtr());
|
||||
return;
|
||||
|
||||
@@ -1937,6 +1937,16 @@ Sema::BuildMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc,
|
||||
ImpCastExprToType(BaseExpr, BaseType, CastExpr::CK_BitCast);
|
||||
}
|
||||
}
|
||||
// If this is an Objective-C pseudo-builtin and a definition is provided then
|
||||
// use that.
|
||||
if (Context.isObjCSelType(BaseType)) {
|
||||
// We have an 'SEL' type. Rather than fall through, we check if this
|
||||
// is a reference to 'sel_id'.
|
||||
if (BaseType != Context.ObjCSelRedefinitionType) {
|
||||
BaseType = Context.ObjCSelRedefinitionType;
|
||||
ImpCastExprToType(BaseExpr, BaseType, CastExpr::CK_BitCast);
|
||||
}
|
||||
}
|
||||
assert(!BaseType.isNull() && "no type for member expression");
|
||||
|
||||
// Handle properties on ObjC 'Class' types.
|
||||
@@ -3440,6 +3450,17 @@ QualType Sema::CheckConditionalOperands(Expr *&Cond, Expr *&LHS, Expr *&RHS,
|
||||
ImpCastExprToType(LHS, RHSTy, CastExpr::CK_BitCast);
|
||||
return RHSTy;
|
||||
}
|
||||
// And the same for struct objc_selector* / SEL
|
||||
if (Context.isObjCSelType(LHSTy) &&
|
||||
(RHSTy.getDesugaredType() == Context.ObjCSelRedefinitionType)) {
|
||||
ImpCastExprToType(RHS, LHSTy, CastExpr::CK_BitCast);
|
||||
return LHSTy;
|
||||
}
|
||||
if (Context.isObjCSelType(RHSTy) &&
|
||||
(LHSTy.getDesugaredType() == Context.ObjCSelRedefinitionType)) {
|
||||
ImpCastExprToType(LHS, RHSTy, CastExpr::CK_BitCast);
|
||||
return RHSTy;
|
||||
}
|
||||
// Handle block pointer types.
|
||||
if (LHSTy->isBlockPointerType() || RHSTy->isBlockPointerType()) {
|
||||
if (!LHSTy->isBlockPointerType() || !RHSTy->isBlockPointerType()) {
|
||||
|
||||
@@ -17,3 +17,7 @@ typedef const struct objc_selector {
|
||||
}
|
||||
@end
|
||||
|
||||
int func(SEL s1, SEL s2)
|
||||
{
|
||||
return s1->sel_id == s2->sel_id;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user