[cfe-commits] r106099 - in /cfe/trunk: include/clang/AST/ASTContext.h include/clang/AST/CanonicalType.h include/clang/AST/DeclTemplate.h include/clang/AST/Type.h lib/AST/ASTContext.cpp lib/AST/DeclPrinter.cpp lib/AST/DeclTemplate.cpp lib/AST/TypePrinter.cpp lib/Sema/SemaTemplate.cpp lib/Sema/SemaTemplateInstantiate.cpp lib/Sema/SemaTemplateInstantiateDecl.cpp

Douglas Gregor dgregor at apple.com
Wed Jun 16 08:23:56 PDT 2010


It looks like this broke self-host with an assertion, so I've reverted it in r106100.

	- Doug

On Jun 16, 2010, at 7:59 AM, Abramo Bagnara wrote:

> Author: abramo
> Date: Wed Jun 16 09:59:30 2010
> New Revision: 106099
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=106099&view=rev
> Log:
> Added TemplateTypeParmType::getDecl().
> 
> Modified:
>    cfe/trunk/include/clang/AST/ASTContext.h
>    cfe/trunk/include/clang/AST/CanonicalType.h
>    cfe/trunk/include/clang/AST/DeclTemplate.h
>    cfe/trunk/include/clang/AST/Type.h
>    cfe/trunk/lib/AST/ASTContext.cpp
>    cfe/trunk/lib/AST/DeclPrinter.cpp
>    cfe/trunk/lib/AST/DeclTemplate.cpp
>    cfe/trunk/lib/AST/TypePrinter.cpp
>    cfe/trunk/lib/Sema/SemaTemplate.cpp
>    cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
>    cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> 
> Modified: cfe/trunk/include/clang/AST/ASTContext.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ASTContext.h (original)
> +++ cfe/trunk/include/clang/AST/ASTContext.h Wed Jun 16 09:59:30 2010
> @@ -601,7 +601,7 @@
> 
>   QualType getTemplateTypeParmType(unsigned Depth, unsigned Index,
>                                    bool ParameterPack,
> -                                   IdentifierInfo *Name = 0);
> +                                   TemplateTypeParmDecl *ParmDecl = 0);
> 
>   QualType getTemplateSpecializationType(TemplateName T,
>                                          const TemplateArgument *Args,
> 
> Modified: cfe/trunk/include/clang/AST/CanonicalType.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/CanonicalType.h?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/CanonicalType.h (original)
> +++ cfe/trunk/include/clang/AST/CanonicalType.h Wed Jun 16 09:59:30 2010
> @@ -640,7 +640,6 @@
>   LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(unsigned, getDepth)
>   LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(unsigned, getIndex)
>   LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, isParameterPack)
> -  LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(IdentifierInfo *, getName)
> };
> 
> template<>
> 
> Modified: cfe/trunk/include/clang/AST/DeclTemplate.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclTemplate.h?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclTemplate.h (original)
> +++ cfe/trunk/include/clang/AST/DeclTemplate.h Wed Jun 16 09:59:30 2010
> @@ -662,18 +662,13 @@
>   /// default argument.
>   bool InheritedDefault : 1;
> 
> -  /// \brief Whether this is a parameter pack.
> -  bool ParameterPack : 1;
> -
>   /// \brief The default template argument, if any.
>   TypeSourceInfo *DefaultArgument;
> 
>   TemplateTypeParmDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
> -                       bool Typename, QualType Type, bool ParameterPack)
> +                       bool Typename)
>     : TypeDecl(TemplateTypeParm, DC, L, Id), Typename(Typename),
> -      InheritedDefault(false), ParameterPack(ParameterPack), DefaultArgument() {
> -    TypeForDecl = Type.getTypePtr();
> -  }
> +      InheritedDefault(false), DefaultArgument() { }
> 
> public:
>   static TemplateTypeParmDecl *Create(ASTContext &C, DeclContext *DC,
> @@ -724,7 +719,7 @@
>   unsigned getIndex() const;
> 
>   /// \brief Returns whether this is a parameter pack.
> -  bool isParameterPack() const { return ParameterPack; }
> +  bool isParameterPack() const;
> 
>   // Implement isa/cast/dyncast/etc.
>   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
> 
> Modified: cfe/trunk/include/clang/AST/Type.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Type.h (original)
> +++ cfe/trunk/include/clang/AST/Type.h Wed Jun 16 09:59:30 2010
> @@ -2311,42 +2311,63 @@
> };
> 
> class TemplateTypeParmType : public Type, public llvm::FoldingSetNode {
> -  unsigned Depth : 15;
> -  unsigned Index : 16;
> -  unsigned ParameterPack : 1;
> -  IdentifierInfo *Name;
> +  // Helper data collector for canonical types.
> +  struct CanonicalTTPTInfo {
> +    unsigned Depth : 15;
> +    unsigned Index : 16;
> +    unsigned ParameterPack : 1;
> +  };
> +
> +  union {
> +    // Info for the canonical type.
> +    CanonicalTTPTInfo CanTTPTInfo;
> +    // Info for the non-canonical type.
> +    TemplateTypeParmDecl *TTPDecl;
> +  };
> 
> -  TemplateTypeParmType(unsigned D, unsigned I, bool PP, IdentifierInfo *N,
> -                       QualType Canon)
> +  /// Build a non-canonical type.
> +  TemplateTypeParmType(TemplateTypeParmDecl *TTPDecl, QualType Canon)
>     : Type(TemplateTypeParm, Canon, /*Dependent=*/true),
> -      Depth(D), Index(I), ParameterPack(PP), Name(N) { }
> +      TTPDecl(TTPDecl) { }
> 
> +  /// Build the canonical type.
>   TemplateTypeParmType(unsigned D, unsigned I, bool PP)
> -    : Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true),
> -      Depth(D), Index(I), ParameterPack(PP), Name(0) { }
> +    : Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true) {
> +    CanTTPTInfo.Depth = D;
> +    CanTTPTInfo.Index = I;
> +    CanTTPTInfo.ParameterPack = PP;
> +  }
> 
>   friend class ASTContext;  // ASTContext creates these
> 
> +  const CanonicalTTPTInfo& getCanTTPTInfo() const {
> +    QualType Can = getCanonicalTypeInternal();
> +    return Can->getAs<TemplateTypeParmType>()->CanTTPTInfo;
> +  }
> +
> public:
> -  unsigned getDepth() const { return Depth; }
> -  unsigned getIndex() const { return Index; }
> -  bool isParameterPack() const { return ParameterPack; }
> -  IdentifierInfo *getName() const { return Name; }
> +  unsigned getDepth() const { return getCanTTPTInfo().Depth; }
> +  unsigned getIndex() const { return getCanTTPTInfo().Index; }
> +  bool isParameterPack() const { return getCanTTPTInfo().ParameterPack; }
> +
> +  TemplateTypeParmDecl *getDecl() const {
> +    return isCanonicalUnqualified() ? 0 : TTPDecl;
> +  }
> 
>   bool isSugared() const { return false; }
>   QualType desugar() const { return QualType(this, 0); }
> 
>   void Profile(llvm::FoldingSetNodeID &ID) {
> -    Profile(ID, Depth, Index, ParameterPack, Name);
> +    Profile(ID, getDepth(), getIndex(), isParameterPack(), getDecl());
>   }
> 
>   static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth,
>                       unsigned Index, bool ParameterPack,
> -                      IdentifierInfo *Name) {
> +                      TemplateTypeParmDecl *TTPDecl) {
>     ID.AddInteger(Depth);
>     ID.AddInteger(Index);
>     ID.AddBoolean(ParameterPack);
> -    ID.AddPointer(Name);
> +    ID.AddPointer(TTPDecl);
>   }
> 
>   static bool classof(const Type *T) {
> @@ -2373,8 +2394,6 @@
>   friend class ASTContext;
> 
> public:
> -  IdentifierInfo *getName() const { return Replaced->getName(); }
> -
>   /// Gets the template parameter that was substituted for.
>   const TemplateTypeParmType *getReplacedParameter() const {
>     return Replaced;
> 
> Modified: cfe/trunk/lib/AST/ASTContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
> +++ cfe/trunk/lib/AST/ASTContext.cpp Wed Jun 16 09:59:30 2010
> @@ -1728,9 +1728,9 @@
> /// name.
> QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
>                                              bool ParameterPack,
> -                                             IdentifierInfo *Name) {
> +                                             TemplateTypeParmDecl *TTPDecl) {
>   llvm::FoldingSetNodeID ID;
> -  TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, Name);
> +  TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
>   void *InsertPos = 0;
>   TemplateTypeParmType *TypeParm
>     = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
> @@ -1738,10 +1738,9 @@
>   if (TypeParm)
>     return QualType(TypeParm, 0);
> 
> -  if (Name) {
> +  if (TTPDecl) {
>     QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack);
> -    TypeParm = new (*this, TypeAlignment)
> -      TemplateTypeParmType(Depth, Index, ParameterPack, Name, Canon);
> +    TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon);
> 
>     TemplateTypeParmType *TypeCheck 
>       = TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
> 
> Modified: cfe/trunk/lib/AST/DeclPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclPrinter.cpp?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclPrinter.cpp (original)
> +++ cfe/trunk/lib/AST/DeclPrinter.cpp Wed Jun 16 09:59:30 2010
> @@ -623,7 +623,7 @@
>       if (TTP->isParameterPack())
>         Out << "... ";
> 
> -      Out << ParamType.getAsString(Policy);
> +      Out << TTP->getNameAsString();
> 
>       if (TTP->hasDefaultArgument()) {
>         Out << " = ";
> 
> Modified: cfe/trunk/lib/AST/DeclTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclTemplate.cpp?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclTemplate.cpp (original)
> +++ cfe/trunk/lib/AST/DeclTemplate.cpp Wed Jun 16 09:59:30 2010
> @@ -265,8 +265,11 @@
>                              SourceLocation L, unsigned D, unsigned P,
>                              IdentifierInfo *Id, bool Typename,
>                              bool ParameterPack) {
> -  QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id);
> -  return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack);
> +  TemplateTypeParmDecl *TTPDecl
> +    = new (C) TemplateTypeParmDecl(DC, L, Id, Typename);
> +  QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
> +  TTPDecl->TypeForDecl = TTPType.getTypePtr();
> +  return TTPDecl;
> }
> 
> SourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
> @@ -281,6 +284,10 @@
>   return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
> }
> 
> +bool TemplateTypeParmDecl::isParameterPack() const {
> +  return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack();
> +}
> +
> //===----------------------------------------------------------------------===//
> // NonTypeTemplateParmDecl Method Implementations
> //===----------------------------------------------------------------------===//
> 
> Modified: cfe/trunk/lib/AST/TypePrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TypePrinter.cpp?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/TypePrinter.cpp (original)
> +++ cfe/trunk/lib/AST/TypePrinter.cpp Wed Jun 16 09:59:30 2010
> @@ -506,12 +506,12 @@
>                                         std::string &S) { 
>   if (!S.empty())    // Prefix the basic type, e.g. 'parmname X'.
>     S = ' ' + S;
> -  
> -  if (!T->getName())
> +
> +  if (IdentifierInfo *Id = T->getDecl() ? T->getDecl()->getIdentifier() : 0)
> +    S = Id->getName().str() + S;
> +  else
>     S = "type-parameter-" + llvm::utostr_32(T->getDepth()) + '-' +
>         llvm::utostr_32(T->getIndex()) + S;
> -  else
> -    S = T->getName()->getName().str() + S;  
> }
> 
> void TypePrinter::PrintSubstTemplateTypeParm(const SubstTemplateTypeParmType *T, 
> 
> Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Wed Jun 16 09:59:30 2010
> @@ -450,7 +450,7 @@
> /// (otherwise, "class" was used), and KeyLoc is the location of the
> /// "class" or "typename" keyword. ParamName is the name of the
> /// parameter (NULL indicates an unnamed template parameter) and
> -/// ParamName is the location of the parameter name (if any).
> +/// ParamNameLoc is the location of the parameter name (if any).
> /// If the type parameter has a default argument, it will be added
> /// later via ActOnTypeParameterDefault.
> Sema::DeclPtrTy Sema::ActOnTypeParameter(Scope *S, bool Typename, bool Ellipsis,
> 
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Wed Jun 16 09:59:30 2010
> @@ -896,12 +896,17 @@
>   // the template parameter list of a member template inside the
>   // template we are instantiating). Create a new template type
>   // parameter with the template "level" reduced by one.
> +  TemplateTypeParmDecl *NewTTPDecl = 0;
> +  if (TemplateTypeParmDecl *OldTTPDecl = T->getDecl())
> +    NewTTPDecl = cast_or_null<TemplateTypeParmDecl>(
> +                                  TransformDecl(TL.getNameLoc(), OldTTPDecl));
> +
>   QualType Result
>     = getSema().Context.getTemplateTypeParmType(T->getDepth()
>                                                  - TemplateArgs.getNumLevels(),
>                                                 T->getIndex(),
>                                                 T->isParameterPack(),
> -                                                T->getName());
> +                                                NewTTPDecl);
>   TemplateTypeParmTypeLoc NewTL = TLB.push<TemplateTypeParmTypeLoc>(Result);
>   NewTL.setNameLoc(TL.getNameLoc());
>   return Result;
> 
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=106099&r1=106098&r2=106099&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Wed Jun 16 09:59:30 2010
> @@ -1442,14 +1442,12 @@
> Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
>                                                     TemplateTypeParmDecl *D) {
>   // TODO: don't always clone when decls are refcounted.
> -  const Type* T = D->getTypeForDecl();
> -  assert(T->isTemplateTypeParmType());
> -  const TemplateTypeParmType *TTPT = T->getAs<TemplateTypeParmType>();
> +  assert(D->getTypeForDecl()->isTemplateTypeParmType());
> 
>   TemplateTypeParmDecl *Inst =
>     TemplateTypeParmDecl::Create(SemaRef.Context, Owner, D->getLocation(),
> -                                 TTPT->getDepth() - 1, TTPT->getIndex(),
> -                                 TTPT->getName(),
> +                                 D->getDepth() - 1, D->getIndex(),
> +                                 D->getIdentifier(),
>                                  D->wasDeclaredWithTypename(),
>                                  D->isParameterPack());
> 
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list