[cfe-commits] r55990 - in /cfe/trunk/lib: AST/ASTContext.cpp Sema/Sema.cpp Sema/Sema.h Sema/SemaDecl.cpp
Steve Naroff
snaroff at apple.com
Tue Sep 9 07:32:23 PDT 2008
Author: snaroff
Date: Tue Sep 9 09:32:20 2008
New Revision: 55990
URL: http://llvm.org/viewvc/llvm-project?rev=55990&view=rev
Log:
Tweak implementation for allowing ObjC builtin type redefinitions.
- Replace string comparisons with pre-defined idents.
- Avoid calling isBuiltinObjCType() to avoid two checks.
- Remove isBuiltinObjCType(), since it was only used in Sema::MergeTypeDefDecl().
- Have Sema::MergeTypeDefDecl() set the new type.
This is a moidified version of an patch by David Chisnall.
Modified:
cfe/trunk/lib/AST/ASTContext.cpp
cfe/trunk/lib/Sema/Sema.cpp
cfe/trunk/lib/Sema/Sema.h
cfe/trunk/lib/Sema/SemaDecl.cpp
Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=55990&r1=55989&r2=55990&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Tue Sep 9 09:32:20 2008
@@ -1697,8 +1697,6 @@
void ASTContext::setObjCIdType(TypedefDecl *TD)
{
- assert(ObjCIdType.isNull() && "'id' type already set!");
-
ObjCIdType = getTypedefType(TD);
// typedef struct objc_object *id;
@@ -1711,8 +1709,6 @@
void ASTContext::setObjCSelType(TypedefDecl *TD)
{
- assert(ObjCSelType.isNull() && "'SEL' type already set!");
-
ObjCSelType = getTypedefType(TD);
// typedef struct objc_selector *SEL;
@@ -1725,14 +1721,11 @@
void ASTContext::setObjCProtoType(QualType QT)
{
- assert(ObjCProtoType.isNull() && "'Protocol' type already set!");
ObjCProtoType = QT;
}
void ASTContext::setObjCClassType(TypedefDecl *TD)
{
- assert(ObjCClassType.isNull() && "'Class' type already set!");
-
ObjCClassType = getTypedefType(TD);
// typedef struct objc_class *Class;
Modified: cfe/trunk/lib/Sema/Sema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=55990&r1=55989&r2=55990&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.cpp (original)
+++ cfe/trunk/lib/Sema/Sema.cpp Tue Sep 9 09:32:20 2008
@@ -21,12 +21,6 @@
using namespace clang;
-bool Sema::isBuiltinObjCType(TypedefDecl *TD) {
- const char *typeName = TD->getIdentifier()->getName();
- return strcmp(typeName, "id") == 0 || strcmp(typeName, "Class") == 0 ||
- strcmp(typeName, "SEL") == 0 || strcmp(typeName, "Protocol") == 0;
-}
-
static inline RecordDecl *CreateStructDecl(ASTContext &C, const char *Name)
{
if (C.getLangOptions().CPlusPlus)
@@ -107,6 +101,12 @@
SuperID = &IT.get("super");
+ // ObjC builtin typedef names.
+ Ident_id = &IT.get("id");
+ Ident_Class = &IT.get("Class");
+ Ident_SEL = &IT.get("SEL");
+ Ident_Protocol = &IT.get("Protocol");
+
TUScope = 0;
if (getLangOptions().CPlusPlus)
FieldCollector.reset(new CXXFieldCollector());
Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=55990&r1=55989&r2=55990&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Tue Sep 9 09:32:20 2008
@@ -146,6 +146,10 @@
/// SuperID - Identifier for "super" used for Objective-C checking.
IdentifierInfo* SuperID;
+ /// Identifiers for builtin ObjC typedef names.
+ IdentifierInfo *Ident_id, *Ident_Class; // "id", "Class"
+ IdentifierInfo *Ident_SEL, *Ident_Protocol; // "SEL", "Protocol"
+
/// Translation Unit Scope - useful to Objective-C actions that need
/// to lookup file scope declarations in the "ordinary" C decl namespace.
/// For example, user-defined classes, built-in "id" type, etc.
@@ -358,10 +362,6 @@
bool MatchTwoMethodDeclarations(const ObjCMethodDecl *Method,
const ObjCMethodDecl *PrevMethod);
- /// isBuiltinObjCType - Returns true of the type is "id", "SEL", "Class"
- /// or "Protocol".
- bool isBuiltinObjCType(TypedefDecl *TD);
-
/// AddInstanceMethodToGlobalPool - All instance methods in a translation
/// unit are added to a global pool. This allows us to efficiently associate
/// a selector with a method declaraation for purposes of typechecking
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=55990&r1=55989&r2=55990&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Sep 9 09:32:20 2008
@@ -230,6 +230,25 @@
/// situation, merging decls or emitting diagnostics as appropriate.
///
TypedefDecl *Sema::MergeTypeDefDecl(TypedefDecl *New, Decl *OldD) {
+ // Allow multiple definitions for ObjC built-in typedefs.
+ // FIXME: Verify the underlying types are equivalent!
+ if (getLangOptions().ObjC1) {
+ const IdentifierInfo *typeIdent = New->getIdentifier();
+ if (typeIdent == Ident_id) {
+ Context.setObjCIdType(New);
+ return New;
+ } else if (typeIdent == Ident_Class) {
+ Context.setObjCClassType(New);
+ return New;
+ } else if (typeIdent == Ident_SEL) {
+ Context.setObjCSelType(New);
+ return New;
+ } else if (typeIdent == Ident_Protocol) {
+ Context.setObjCProtoType(New->getUnderlyingType());
+ return New;
+ }
+ // Fall through - the typedef name was not a builtin type.
+ }
// Verify the old decl was also a typedef.
TypedefDecl *Old = dyn_cast<TypedefDecl>(OldD);
if (!Old) {
@@ -251,11 +270,6 @@
return Old;
}
- // Allow multiple definitions for ObjC built-in typedefs.
- // FIXME: Verify the underlying types are equivalent!
- if (getLangOptions().ObjC1 && isBuiltinObjCType(New))
- return Old;
-
if (getLangOptions().Microsoft) return New;
// Redeclaration of a type is a constraint violation (6.7.2.3p1).
More information about the cfe-commits
mailing list