]> granicus.if.org Git - clang/commitdiff
Move the creation of the predefined typedef for Objective-C's 'id'
authorDouglas Gregor <dgregor@apple.com>
Fri, 12 Aug 2011 05:46:01 +0000 (05:46 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 12 Aug 2011 05:46:01 +0000 (05:46 +0000)
type over into the AST context, then make that declaration a
predefined declaration in the AST format. This ensures that different
AST files will at least agree on the (global) declaration ID for 'id',
and eliminates one of the "special" types in the AST file format.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@137429 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTContext.h
include/clang/Serialization/ASTBitCodes.h
lib/AST/ASTContext.cpp
lib/Sema/Sema.cpp
lib/Serialization/ASTReader.cpp
lib/Serialization/ASTWriter.cpp

index ed8d1c91016dca0be7dddcd183a51b96380a01bb..6feda32c546d36e6f783297994663378ca598e20 100644 (file)
@@ -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;
index 3bd340ab9ce50fa24207ffaa8a45fa2674803913..f9896e6ab8069394f5f11785a2607249a93e1a7a 100644 (file)
@@ -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.
     ///
index c4955721e964d3617d862cd5849298018eb59d13..cf4535bd90ca46b7085d95bb0a6b1b5411b74f79 100644 (file)
@@ -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) {
index 7451fa439123699f3bb7f4e396d4384655d7a21f..adc749dd70441039dd5f949def4f5bbbf3057e20 100644 (file)
@@ -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() {
index 43435b6754e5e4379716aa6804611bf263a3bfd0..2e9e1bee6842e96229bd8aa0db98c5e949864bf9 100644 (file)
@@ -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;
index 2654ae3fdf33cff6a4a28d8cc36e8c9072130dd1..2377369c74f78edc5dc6e475c83cabe829767386 100644 (file)
@@ -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);