diff options
-rw-r--r-- | include/clang/AST/ASTContext.h | 19 | ||||
-rw-r--r-- | include/clang/Serialization/ASTBitCodes.h | 31 | ||||
-rw-r--r-- | lib/AST/ASTContext.cpp | 17 | ||||
-rw-r--r-- | lib/Sema/Sema.cpp | 22 | ||||
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 9 | ||||
-rw-r--r-- | lib/Serialization/ASTWriter.cpp | 5 |
6 files changed, 58 insertions, 45 deletions
diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index ed8d1c9101..6feda32c54 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -182,9 +182,9 @@ class ASTContext : public llvm::RefCountedBase<ASTContext> { /// a builtin that takes a valist is encountered. QualType BuiltinVaListType; - /// ObjCIdType - a pseudo built-in typedef type (set by Sema). - QualType ObjCIdTypedefType; - + /// \brief The typedef for the predefined 'id' type. + mutable TypedefDecl *ObjCIdDecl; + /// ObjCSelType - another pseudo built-in typedef type (set by Sema). QualType ObjCSelTypedefType; @@ -952,11 +952,16 @@ public: bool isInt128Installed() const { return IsInt128Installed; } void setInt128Installed() { IsInt128Installed = true; } + /// \brief Retrieve the typedef corresponding to the predefined 'id' type + /// in Objective-C. + TypedefDecl *getObjCIdDecl() const; + /// This setter/getter represents the ObjC 'id' type. It is setup lazily, by /// Sema. id is always a (typedef for a) pointer type, a pointer to a struct. - QualType getObjCIdType() const { return ObjCIdTypedefType; } - void setObjCIdType(QualType T); - + QualType getObjCIdType() const { + return getTypeDeclType(getObjCIdDecl()); + } + void setObjCSelType(QualType T); QualType getObjCSelType() const { return ObjCSelTypedefType; } @@ -1415,7 +1420,7 @@ public: bool typesAreBlockPointerCompatible(QualType, QualType); bool isObjCIdType(QualType T) const { - return T == ObjCIdTypedefType; + return T == getObjCIdType(); } bool isObjCClassType(QualType T) const { return T == ObjCClassTypedefType; diff --git a/include/clang/Serialization/ASTBitCodes.h b/include/clang/Serialization/ASTBitCodes.h index 3bd340ab9c..f9896e6ab8 100644 --- a/include/clang/Serialization/ASTBitCodes.h +++ b/include/clang/Serialization/ASTBitCodes.h @@ -640,30 +640,28 @@ namespace clang { enum SpecialTypeIDs { /// \brief __builtin_va_list SPECIAL_TYPE_BUILTIN_VA_LIST = 0, - /// \brief Objective-C "id" type - SPECIAL_TYPE_OBJC_ID = 1, /// \brief Objective-C selector type - SPECIAL_TYPE_OBJC_SELECTOR = 2, + SPECIAL_TYPE_OBJC_SELECTOR = 1, /// \brief Objective-C Protocol type - SPECIAL_TYPE_OBJC_PROTOCOL = 3, + SPECIAL_TYPE_OBJC_PROTOCOL = 2, /// \brief Objective-C Class type - SPECIAL_TYPE_OBJC_CLASS = 4, + SPECIAL_TYPE_OBJC_CLASS = 3, /// \brief CFConstantString type - SPECIAL_TYPE_CF_CONSTANT_STRING = 5, + SPECIAL_TYPE_CF_CONSTANT_STRING = 4, /// \brief C FILE typedef type - SPECIAL_TYPE_FILE = 6, + SPECIAL_TYPE_FILE = 5, /// \brief C jmp_buf typedef type - SPECIAL_TYPE_jmp_buf = 7, + SPECIAL_TYPE_jmp_buf = 6, /// \brief C sigjmp_buf typedef type - SPECIAL_TYPE_sigjmp_buf = 8, + SPECIAL_TYPE_sigjmp_buf = 7, /// \brief Objective-C "id" redefinition type - SPECIAL_TYPE_OBJC_ID_REDEFINITION = 9, + SPECIAL_TYPE_OBJC_ID_REDEFINITION = 8, /// \brief Objective-C "Class" redefinition type - SPECIAL_TYPE_OBJC_CLASS_REDEFINITION = 10, + SPECIAL_TYPE_OBJC_CLASS_REDEFINITION = 9, /// \brief Objective-C "SEL" redefinition type - SPECIAL_TYPE_OBJC_SEL_REDEFINITION = 11, + SPECIAL_TYPE_OBJC_SEL_REDEFINITION = 10, /// \brief Whether __[u]int128_t identifier is installed. - SPECIAL_TYPE_INT128_INSTALLED = 12 + SPECIAL_TYPE_INT128_INSTALLED = 11 }; /// \brief Predefined declaration IDs. @@ -677,14 +675,17 @@ namespace clang { PREDEF_DECL_NULL_ID = 0, /// \brief The translation unit. - PREDEF_DECL_TRANSLATION_UNIT_ID = 1 + PREDEF_DECL_TRANSLATION_UNIT_ID = 1, + + /// \brief The Objective-C 'id' type. + PREDEF_DECL_OBJC_ID_ID = 2 }; /// \brief The number of declaration IDs that are predefined. /// /// For more information about predefined declarations, see the /// \c PredefinedDeclIDs type and the PREDEF_DECL_*_ID constants. - const unsigned int NUM_PREDEF_DECL_IDS = 2; + const unsigned int NUM_PREDEF_DECL_IDS = 3; /// \brief Record codes for each kind of declaration. /// diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index c4955721e9..cf4535bd90 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -222,7 +222,7 @@ ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM, DependentTemplateSpecializationTypes(this_()), SubstTemplateTemplateParmPacks(this_()), GlobalNestedNameSpecifier(0), IsInt128Installed(false), - CFConstantStringTypeDecl(0), + ObjCIdDecl(0), CFConstantStringTypeDecl(0), FILEDecl(0), jmp_bufDecl(0), sigjmp_bufDecl(0), BlockDescriptorType(0), BlockDescriptorExtendedType(0), cudaConfigureCallDecl(0), @@ -430,7 +430,6 @@ void ASTContext::InitBuiltinTypes() { BuiltinVaListType = QualType(); // "Builtin" typedefs set by Sema::ActOnTranslationUnitScope(). - ObjCIdTypedefType = QualType(); ObjCClassTypedefType = QualType(); ObjCSelTypedefType = QualType(); @@ -4619,8 +4618,18 @@ void ASTContext::setBuiltinVaListType(QualType T) { BuiltinVaListType = T; } -void ASTContext::setObjCIdType(QualType T) { - ObjCIdTypedefType = T; +TypedefDecl *ASTContext::getObjCIdDecl() const { + if (!ObjCIdDecl) { + QualType T = getObjCObjectType(ObjCBuiltinIdTy, 0, 0); + T = getObjCObjectPointerType(T); + TypeSourceInfo *IdInfo = getTrivialTypeSourceInfo(T); + ObjCIdDecl = TypedefDecl::Create(const_cast<ASTContext &>(*this), + getTranslationUnitDecl(), + SourceLocation(), SourceLocation(), + &Idents.get("id"), IdInfo); + } + + return ObjCIdDecl; } void ASTContext::setObjCSelType(QualType T) { diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 7451fa4391..adc749dd70 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -106,18 +106,7 @@ void Sema::ActOnTranslationUnitScope(Scope *S) { Context.setObjCProtoType(Context.getObjCInterfaceType(ProtocolDecl)); PushOnScopeChains(ProtocolDecl, TUScope, false); } - // Create the built-in typedef for 'id'. - if (Context.getObjCIdType().isNull()) { - QualType T = Context.getObjCObjectType(Context.ObjCBuiltinIdTy, 0, 0); - T = Context.getObjCObjectPointerType(T); - TypeSourceInfo *IdInfo = Context.getTrivialTypeSourceInfo(T); - TypedefDecl *IdTypedef - = TypedefDecl::Create(Context, CurContext, - SourceLocation(), SourceLocation(), - &Context.Idents.get("id"), IdInfo); - PushOnScopeChains(IdTypedef, TUScope); - Context.setObjCIdType(Context.getTypeDeclType(IdTypedef)); - } + // Create the built-in typedef for 'Class'. if (Context.getObjCClassType().isNull()) { QualType T = Context.getObjCObjectType(Context.ObjCBuiltinClassTy, 0, 0); @@ -178,6 +167,15 @@ void Sema::Initialize() { if (ExternalSemaSource *ExternalSema = dyn_cast_or_null<ExternalSemaSource>(Context.getExternalSource())) ExternalSema->InitializeSema(*this); + + // Initialize predefined Objective-C types: + if (PP.getLangOptions().ObjC1) { + // If 'id' does not yet refer to any declarations, make it refer to the + // predefined 'id'. + DeclarationName Id = &Context.Idents.get("id"); + if (IdentifierResolver::begin(Id) == IdentifierResolver::end()) + PushOnScopeChains(Context.getObjCIdDecl(), TUScope); + } } Sema::~Sema() { diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 43435b6754..2e9e1bee68 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -2987,11 +2987,6 @@ void ASTReader::InitializeContext(ASTContext &Ctx) { GetType(SpecialTypes[SPECIAL_TYPE_BUILTIN_VA_LIST])); } - if (unsigned Id = SpecialTypes[SPECIAL_TYPE_OBJC_ID]) { - if (Context->ObjCIdTypedefType.isNull()) - Context->ObjCIdTypedefType = GetType(Id); - } - if (unsigned Sel = SpecialTypes[SPECIAL_TYPE_OBJC_SELECTOR]) { if (Context->ObjCSelTypedefType.isNull()) Context->ObjCSelTypedefType = GetType(Sel); @@ -4225,6 +4220,10 @@ Decl *ASTReader::GetDecl(DeclID ID) { case PREDEF_DECL_TRANSLATION_UNIT_ID: assert(Context && "No context available?"); return Context->getTranslationUnitDecl(); + + case PREDEF_DECL_OBJC_ID_ID: + assert(Context && "No context available?"); + return Context->getObjCIdDecl(); } return 0; diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 2654ae3fdf..2377369c74 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -2808,7 +2808,9 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls, // Set up predefined declaration IDs. DeclIDs[Context.getTranslationUnitDecl()] = PREDEF_DECL_TRANSLATION_UNIT_ID; - + if (Context.ObjCIdDecl) + DeclIDs[Context.ObjCIdDecl] = PREDEF_DECL_OBJC_ID_ID; + if (!Chain) { // Make sure that we emit IdentifierInfos (and any attached // declarations) for builtins. We don't need to do this when we're @@ -3015,7 +3017,6 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls, // Form the record of special types. RecordData SpecialTypes; AddTypeRef(Context.getBuiltinVaListType(), SpecialTypes); - AddTypeRef(Context.ObjCIdTypedefType, SpecialTypes); AddTypeRef(Context.ObjCSelTypedefType, SpecialTypes); AddTypeRef(Context.ObjCProtoType, SpecialTypes); AddTypeRef(Context.ObjCClassTypedefType, SpecialTypes); |