зеркало из https://github.com/microsoft/clang-1.git
Revert r106099; it broke self-host.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106100 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
6cd8087e66
Коммит
efed5c832d
|
@ -601,7 +601,7 @@ public:
|
|||
|
||||
QualType getTemplateTypeParmType(unsigned Depth, unsigned Index,
|
||||
bool ParameterPack,
|
||||
TemplateTypeParmDecl *ParmDecl = 0);
|
||||
IdentifierInfo *Name = 0);
|
||||
|
||||
QualType getTemplateSpecializationType(TemplateName T,
|
||||
const TemplateArgument *Args,
|
||||
|
|
|
@ -640,6 +640,7 @@ struct CanProxyAdaptor<TemplateTypeParmType>
|
|||
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<>
|
||||
|
|
|
@ -662,13 +662,18 @@ class TemplateTypeParmDecl : public TypeDecl {
|
|||
/// 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)
|
||||
bool Typename, QualType Type, bool ParameterPack)
|
||||
: TypeDecl(TemplateTypeParm, DC, L, Id), Typename(Typename),
|
||||
InheritedDefault(false), DefaultArgument() { }
|
||||
InheritedDefault(false), ParameterPack(ParameterPack), DefaultArgument() {
|
||||
TypeForDecl = Type.getTypePtr();
|
||||
}
|
||||
|
||||
public:
|
||||
static TemplateTypeParmDecl *Create(ASTContext &C, DeclContext *DC,
|
||||
|
@ -719,7 +724,7 @@ public:
|
|||
unsigned getIndex() const;
|
||||
|
||||
/// \brief Returns whether this is a parameter pack.
|
||||
bool isParameterPack() const;
|
||||
bool isParameterPack() const { return ParameterPack; }
|
||||
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
|
|
|
@ -2311,63 +2311,42 @@ public:
|
|||
};
|
||||
|
||||
class TemplateTypeParmType : public Type, public llvm::FoldingSetNode {
|
||||
// Helper data collector for canonical types.
|
||||
struct CanonicalTTPTInfo {
|
||||
unsigned Depth : 15;
|
||||
unsigned Index : 16;
|
||||
unsigned ParameterPack : 1;
|
||||
};
|
||||
unsigned Depth : 15;
|
||||
unsigned Index : 16;
|
||||
unsigned ParameterPack : 1;
|
||||
IdentifierInfo *Name;
|
||||
|
||||
union {
|
||||
// Info for the canonical type.
|
||||
CanonicalTTPTInfo CanTTPTInfo;
|
||||
// Info for the non-canonical type.
|
||||
TemplateTypeParmDecl *TTPDecl;
|
||||
};
|
||||
|
||||
/// Build a non-canonical type.
|
||||
TemplateTypeParmType(TemplateTypeParmDecl *TTPDecl, QualType Canon)
|
||||
TemplateTypeParmType(unsigned D, unsigned I, bool PP, IdentifierInfo *N,
|
||||
QualType Canon)
|
||||
: Type(TemplateTypeParm, Canon, /*Dependent=*/true),
|
||||
TTPDecl(TTPDecl) { }
|
||||
Depth(D), Index(I), ParameterPack(PP), Name(N) { }
|
||||
|
||||
/// Build the canonical type.
|
||||
TemplateTypeParmType(unsigned D, unsigned I, bool PP)
|
||||
: Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true) {
|
||||
CanTTPTInfo.Depth = D;
|
||||
CanTTPTInfo.Index = I;
|
||||
CanTTPTInfo.ParameterPack = PP;
|
||||
}
|
||||
: Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true),
|
||||
Depth(D), Index(I), ParameterPack(PP), Name(0) { }
|
||||
|
||||
friend class ASTContext; // ASTContext creates these
|
||||
|
||||
const CanonicalTTPTInfo& getCanTTPTInfo() const {
|
||||
QualType Can = getCanonicalTypeInternal();
|
||||
return Can->getAs<TemplateTypeParmType>()->CanTTPTInfo;
|
||||
}
|
||||
|
||||
public:
|
||||
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;
|
||||
}
|
||||
unsigned getDepth() const { return Depth; }
|
||||
unsigned getIndex() const { return Index; }
|
||||
bool isParameterPack() const { return ParameterPack; }
|
||||
IdentifierInfo *getName() const { return Name; }
|
||||
|
||||
bool isSugared() const { return false; }
|
||||
QualType desugar() const { return QualType(this, 0); }
|
||||
|
||||
void Profile(llvm::FoldingSetNodeID &ID) {
|
||||
Profile(ID, getDepth(), getIndex(), isParameterPack(), getDecl());
|
||||
Profile(ID, Depth, Index, ParameterPack, Name);
|
||||
}
|
||||
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth,
|
||||
unsigned Index, bool ParameterPack,
|
||||
TemplateTypeParmDecl *TTPDecl) {
|
||||
IdentifierInfo *Name) {
|
||||
ID.AddInteger(Depth);
|
||||
ID.AddInteger(Index);
|
||||
ID.AddBoolean(ParameterPack);
|
||||
ID.AddPointer(TTPDecl);
|
||||
ID.AddPointer(Name);
|
||||
}
|
||||
|
||||
static bool classof(const Type *T) {
|
||||
|
@ -2394,6 +2373,8 @@ class SubstTemplateTypeParmType : public Type, public llvm::FoldingSetNode {
|
|||
friend class ASTContext;
|
||||
|
||||
public:
|
||||
IdentifierInfo *getName() const { return Replaced->getName(); }
|
||||
|
||||
/// Gets the template parameter that was substituted for.
|
||||
const TemplateTypeParmType *getReplacedParameter() const {
|
||||
return Replaced;
|
||||
|
|
|
@ -1728,9 +1728,9 @@ ASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm,
|
|||
/// name.
|
||||
QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
|
||||
bool ParameterPack,
|
||||
TemplateTypeParmDecl *TTPDecl) {
|
||||
IdentifierInfo *Name) {
|
||||
llvm::FoldingSetNodeID ID;
|
||||
TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, TTPDecl);
|
||||
TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, Name);
|
||||
void *InsertPos = 0;
|
||||
TemplateTypeParmType *TypeParm
|
||||
= TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
|
||||
|
@ -1738,9 +1738,10 @@ QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
|
|||
if (TypeParm)
|
||||
return QualType(TypeParm, 0);
|
||||
|
||||
if (TTPDecl) {
|
||||
if (Name) {
|
||||
QualType Canon = getTemplateTypeParmType(Depth, Index, ParameterPack);
|
||||
TypeParm = new (*this, TypeAlignment) TemplateTypeParmType(TTPDecl, Canon);
|
||||
TypeParm = new (*this, TypeAlignment)
|
||||
TemplateTypeParmType(Depth, Index, ParameterPack, Name, Canon);
|
||||
|
||||
TemplateTypeParmType *TypeCheck
|
||||
= TemplateTypeParmTypes.FindNodeOrInsertPos(ID, InsertPos);
|
||||
|
|
|
@ -623,7 +623,7 @@ void DeclPrinter::VisitTemplateDecl(TemplateDecl *D) {
|
|||
if (TTP->isParameterPack())
|
||||
Out << "... ";
|
||||
|
||||
Out << TTP->getNameAsString();
|
||||
Out << ParamType.getAsString(Policy);
|
||||
|
||||
if (TTP->hasDefaultArgument()) {
|
||||
Out << " = ";
|
||||
|
|
|
@ -265,11 +265,8 @@ TemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC,
|
|||
SourceLocation L, unsigned D, unsigned P,
|
||||
IdentifierInfo *Id, bool Typename,
|
||||
bool ParameterPack) {
|
||||
TemplateTypeParmDecl *TTPDecl
|
||||
= new (C) TemplateTypeParmDecl(DC, L, Id, Typename);
|
||||
QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
|
||||
TTPDecl->TypeForDecl = TTPType.getTypePtr();
|
||||
return TTPDecl;
|
||||
QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id);
|
||||
return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack);
|
||||
}
|
||||
|
||||
SourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
|
||||
|
@ -284,10 +281,6 @@ unsigned TemplateTypeParmDecl::getIndex() const {
|
|||
return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
|
||||
}
|
||||
|
||||
bool TemplateTypeParmDecl::isParameterPack() const {
|
||||
return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// NonTypeTemplateParmDecl Method Implementations
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -506,12 +506,12 @@ void TypePrinter::PrintTemplateTypeParm(const TemplateTypeParmType *T,
|
|||
std::string &S) {
|
||||
if (!S.empty()) // Prefix the basic type, e.g. 'parmname X'.
|
||||
S = ' ' + S;
|
||||
|
||||
if (IdentifierInfo *Id = T->getDecl() ? T->getDecl()->getIdentifier() : 0)
|
||||
S = Id->getName().str() + S;
|
||||
else
|
||||
|
||||
if (!T->getName())
|
||||
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,
|
||||
|
|
|
@ -450,7 +450,7 @@ void Sema::translateTemplateArguments(const ASTTemplateArgsPtr &TemplateArgsIn,
|
|||
/// (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
|
||||
/// ParamNameLoc is the location of the parameter name (if any).
|
||||
/// ParamName 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,
|
||||
|
|
|
@ -896,17 +896,12 @@ TemplateInstantiator::TransformTemplateTypeParmType(TypeLocBuilder &TLB,
|
|||
// 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(),
|
||||
NewTTPDecl);
|
||||
T->getName());
|
||||
TemplateTypeParmTypeLoc NewTL = TLB.push<TemplateTypeParmTypeLoc>(Result);
|
||||
NewTL.setNameLoc(TL.getNameLoc());
|
||||
return Result;
|
||||
|
|
|
@ -1442,12 +1442,14 @@ ParmVarDecl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) {
|
|||
Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
|
||||
TemplateTypeParmDecl *D) {
|
||||
// TODO: don't always clone when decls are refcounted.
|
||||
assert(D->getTypeForDecl()->isTemplateTypeParmType());
|
||||
const Type* T = D->getTypeForDecl();
|
||||
assert(T->isTemplateTypeParmType());
|
||||
const TemplateTypeParmType *TTPT = T->getAs<TemplateTypeParmType>();
|
||||
|
||||
TemplateTypeParmDecl *Inst =
|
||||
TemplateTypeParmDecl::Create(SemaRef.Context, Owner, D->getLocation(),
|
||||
D->getDepth() - 1, D->getIndex(),
|
||||
D->getIdentifier(),
|
||||
TTPT->getDepth() - 1, TTPT->getIndex(),
|
||||
TTPT->getName(),
|
||||
D->wasDeclaredWithTypename(),
|
||||
D->isParameterPack());
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче