]> granicus.if.org Git - clang/commitdiff
Introduce LocInfoType which is a Sema-specific implementation detail.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 19 Aug 2009 01:28:17 +0000 (01:28 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 19 Aug 2009 01:28:17 +0000 (01:28 +0000)
This is a Type subclass that can hold a DeclaratorInfo* when we have type source info coming
out of a declarator that we want to preserve. This is used only at the "border" of Parser/Sema for
passing/getting QualTypes, it does not participate in the type system semantics in any way.

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

include/clang/AST/Type.h
lib/CodeGen/CGDebugInfo.cpp
lib/Sema/Sema.h
lib/Sema/SemaType.cpp
lib/Sema/TreeTransform.h

index b5317edb031a56d5928787c157317214faeece12..70bafc1dec32cbe272b04a5c7810bc316f6a30cd 100644 (file)
@@ -290,7 +290,10 @@ public:
 #include "clang/AST/TypeNodes.def"
     TagFirst = Record, TagLast = Enum
   };
-  
+
+protected:
+  enum { TypeClassBitSize = 6 };
+
 private:
   QualType CanonicalType;
 
@@ -300,7 +303,7 @@ private:
   /// TypeClass bitfield - Enum that specifies what subclass this belongs to.
   /// Note that this should stay at the end of the ivars for Type so that
   /// subclasses can pack their bitfields into the same word.
-  unsigned TC : 6;
+  unsigned TC : TypeClassBitSize;
 
   Type(const Type&);           // DO NOT IMPLEMENT.
   void operator=(const Type&); // DO NOT IMPLEMENT.
@@ -2141,7 +2144,7 @@ public:
   }
   static bool classof(const ObjCObjectPointerType *) { return true; }
 };
-    
+
 // Inline function definitions.
 
 /// getUnqualifiedType - Return the type without any qualifiers.
index 6547434883437b770d7bb7cdd1d8e7298ec58be5..f39055fd8731bb54769d83527b718e28471ab943 100644 (file)
@@ -764,7 +764,7 @@ llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty,
 #define DEPENDENT_TYPE(Class, Base) case Type::Class:
 #include "clang/AST/TypeNodes.def"
     assert(false && "Dependent types cannot show up in debug information");
-    
+
   case Type::LValueReference:
   case Type::RValueReference:
   case Type::Vector:
index b93faff7a02d27124edf6dc163f11cda23405656..35a2ae6741a409cb1111ae8b79e283340baf9310 100644 (file)
@@ -128,6 +128,40 @@ struct BlockSemaInfo {
   BlockSemaInfo *PrevBlockInfo;
 };
 
+/// \brief Holds a QualType and a DeclaratorInfo* that came out of a declarator
+/// parsing.
+///
+/// LocInfoType is a "transient" type, only needed for passing to/from Parser
+/// and Sema, when we want to preserve type source info for a parsed type.
+/// It will not participate in the type system semantics in any way.
+class LocInfoType : public Type {
+  enum {
+    // The last number that can fit in Type's TC.
+    // Avoids conflict with an existing Type class. 
+    LocInfo = (1 << TypeClassBitSize) - 1
+  };
+
+  DeclaratorInfo *DeclInfo;
+
+  LocInfoType(QualType ty, DeclaratorInfo *DInfo)
+    : Type((TypeClass)LocInfo, ty, ty->isDependentType()), DeclInfo(DInfo) {
+    assert(getTypeClass() == (TypeClass)LocInfo && "LocInfo didn't fit in TC?");
+  }
+  friend class Sema;
+
+public:
+  QualType getType() const { return getCanonicalTypeInternal(); }
+  DeclaratorInfo *getDeclaratorInfo() const { return DeclInfo; }
+
+  virtual void getAsStringInternal(std::string &Str,
+                                   const PrintingPolicy &Policy) const;
+
+  static bool classof(const Type *T) {
+    return T->getTypeClass() == (TypeClass)LocInfo;
+  }
+  static bool classof(const LocInfoType *) { return true; }
+};
+
 /// Sema - This implements semantic analysis and AST building for C.
 class Sema : public Action {
   Sema(const Sema&);           // DO NOT IMPLEMENT
@@ -301,6 +335,8 @@ public:
   /// unit.
   bool CompleteTranslationUnit;
 
+  llvm::BumpPtrAllocator BumpAlloc;
+
   /// \brief The number of SFINAE diagnostics that have been trapped.
   unsigned NumSFINAEErrors;
 
@@ -425,6 +461,8 @@ public:
                                 unsigned Skip = 0, TagDecl **OwnedDecl = 0);
   DeclaratorInfo *GetDeclaratorInfoForDeclarator(Declarator &D, QualType T,
                                                  unsigned Skip);
+  /// \brief Create a LocInfoType to hold the given QualType and DeclaratorInfo.
+  QualType CreateLocInfoType(QualType T, DeclaratorInfo *DInfo);
   DeclarationName GetNameForDeclarator(Declarator &D);
   bool CheckSpecifiedExceptionType(QualType T, const SourceRange &Range);
   bool CheckDistantExceptionSpec(QualType T);
index 03735bae4066f61397201c6b5042ee8203ac921a..0890340fe9c1967cd7421c31ccad40d81fff9ea5 100644 (file)
@@ -1309,6 +1309,23 @@ Sema::GetDeclaratorInfoForDeclarator(Declarator &D, QualType T, unsigned Skip) {
   return DInfo;
 }
 
+/// \brief Create a LocInfoType to hold the given QualType and DeclaratorInfo.
+QualType Sema::CreateLocInfoType(QualType T, DeclaratorInfo *DInfo) {
+  // FIXME: LocInfoTypes are "transient", only needed for passing to/from Parser
+  // and Sema during declaration parsing. Try deallocating/caching them when
+  // it's appropriate, instead of allocating them and keeping them around.
+  LocInfoType *LocT = (LocInfoType*)BumpAlloc.Allocate(sizeof(LocInfoType), 8);
+  new (LocT) LocInfoType(T, DInfo);
+  assert(LocT->getTypeClass() != T->getTypeClass() &&
+         "LocInfoType's TypeClass conflicts with an existing Type class");
+  return QualType(LocT, 0);
+}
+
+void LocInfoType::getAsStringInternal(std::string &Str,
+                                      const PrintingPolicy &Policy) const {
+  assert(false && "LocInfoType should not be used in the type system");
+}
+
 /// CheckSpecifiedExceptionType - Check if the given type is valid in an
 /// exception specification. Incomplete types, or pointers to incomplete types
 /// other than void are not allowed.
index 5516ab44106c4c62c60950f46564e83cd58c3270..e734d07e8575ebef25d3649bd2639112014ae237 100644 (file)
@@ -1561,7 +1561,7 @@ TreeTransform<Derived>::AddTypeQualifiers(QualType T, unsigned CVRQualifiers) {
   
   return T;
 }
-  
+
 template<typename Derived> 
 QualType TreeTransform<Derived>::TransformExtQualType(const ExtQualType *T) { 
   // FIXME: Implement