[cfe-commits] r123425 - in /cfe/trunk: include/clang/AST/ include/clang/Serialization/ lib/AST/ lib/Sema/ lib/Serialization/ test/CXX/temp/temp.decls/temp.variadic/
Matt Beaumont-Gay
matthewbg at google.com
Thu Jan 13 21:16:18 PST 2011
On Thu, Jan 13, 2011 at 20:59, Douglas Gregor <dgregor at apple.com> wrote:
>
> On Jan 13, 2011, at 8:19 PM, Matt Beaumont-Gay wrote:
>
>> On Thu, Jan 13, 2011 at 18:55, Douglas Gregor <dgregor at apple.com> wrote:
>>> Author: dgregor
>>> Date: Thu Jan 13 20:55:32 2011
>>> New Revision: 123425
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=123425&view=rev
>>> Log:
>>> Start implementing support for substitution into pack expansions that
>>> involve template parameter packs at multiple template levels that
>>> occur within the signatures members of class templates (and partial
>>> specializations thereof). This is a work-in-progress that is deficient
>>> in several ways, notably:
>>> - It only works for template type parameter packs, but we need to
>>> also support non-type template parameter packs and template template
>>> parameter packs.
>>> - It doesn't keep track of the lengths of the substituted argument
>>> packs in the expansion, so it can't properly diagnose length
>>> mismatches.
>>>
>>> However, this is a concrete step in the right direction.
>>>
>>> Modified:
>>> cfe/trunk/include/clang/AST/ASTContext.h
>>> cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>>> cfe/trunk/include/clang/AST/Type.h
>>> cfe/trunk/include/clang/AST/TypeLoc.h
>>> cfe/trunk/include/clang/AST/TypeNodes.def
>>> cfe/trunk/include/clang/Serialization/ASTBitCodes.h
>>> cfe/trunk/lib/AST/ASTContext.cpp
>>> cfe/trunk/lib/AST/ItaniumMangle.cpp
>>> cfe/trunk/lib/AST/MicrosoftMangle.cpp
>>> cfe/trunk/lib/AST/Type.cpp
>>> cfe/trunk/lib/AST/TypePrinter.cpp
>>> cfe/trunk/lib/Sema/SemaTemplate.cpp
>>> cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
>>> cfe/trunk/lib/Sema/SemaTemplateVariadic.cpp
>>> cfe/trunk/lib/Sema/TreeTransform.h
>>> cfe/trunk/lib/Serialization/ASTReader.cpp
>>> cfe/trunk/lib/Serialization/ASTWriter.cpp
>>> cfe/trunk/test/CXX/temp/temp.decls/temp.variadic/multi-level-substitution.cpp
>>>
>>> Modified: cfe/trunk/include/clang/AST/ASTContext.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=123425&r1=123424&r2=123425&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/ASTContext.h (original)
>>> +++ cfe/trunk/include/clang/AST/ASTContext.h Thu Jan 13 20:55:32 2011
>>> @@ -102,6 +102,8 @@
>>> mutable llvm::FoldingSet<TemplateTypeParmType> TemplateTypeParmTypes;
>>> mutable llvm::FoldingSet<SubstTemplateTypeParmType>
>>> SubstTemplateTypeParmTypes;
>>> + mutable llvm::FoldingSet<SubstTemplateTypeParmPackType>
>>> + SubstTemplateTypeParmPackTypes;
>>> mutable llvm::ContextualFoldingSet<TemplateSpecializationType, ASTContext&>
>>> TemplateSpecializationTypes;
>>> mutable llvm::FoldingSet<ParenType> ParenTypes;
>>> @@ -664,6 +666,9 @@
>>>
>>> QualType getSubstTemplateTypeParmType(const TemplateTypeParmType *Replaced,
>>> QualType Replacement) const;
>>> + QualType getSubstTemplateTypeParmPackType(
>>> + const TemplateTypeParmType *Replaced,
>>> + const TemplateArgument &ArgPack);
>>>
>>> QualType getTemplateTypeParmType(unsigned Depth, unsigned Index,
>>> bool ParameterPack,
>>>
>>> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=123425&r1=123424&r2=123425&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
>>> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Thu Jan 13 20:55:32 2011
>>> @@ -718,6 +718,7 @@
>>> DEF_TRAVERSE_TYPE(EnumType, { })
>>> DEF_TRAVERSE_TYPE(TemplateTypeParmType, { })
>>> DEF_TRAVERSE_TYPE(SubstTemplateTypeParmType, { })
>>> +DEF_TRAVERSE_TYPE(SubstTemplateTypeParmPackType, { })
>>>
>>> DEF_TRAVERSE_TYPE(TemplateSpecializationType, {
>>> TRY_TO(TraverseTemplateName(T->getTemplateName()));
>>> @@ -925,6 +926,7 @@
>>> DEF_TRAVERSE_TYPELOC(EnumType, { })
>>> DEF_TRAVERSE_TYPELOC(TemplateTypeParmType, { })
>>> DEF_TRAVERSE_TYPELOC(SubstTemplateTypeParmType, { })
>>> +DEF_TRAVERSE_TYPELOC(SubstTemplateTypeParmPackType, { })
>>>
>>> // FIXME: use the loc for the template name?
>>> DEF_TRAVERSE_TYPELOC(TemplateSpecializationType, {
>>>
>>> Modified: cfe/trunk/include/clang/AST/Type.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=123425&r1=123424&r2=123425&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/Type.h (original)
>>> +++ cfe/trunk/include/clang/AST/Type.h Thu Jan 13 20:55:32 2011
>>> @@ -2860,6 +2860,59 @@
>>> static bool classof(const SubstTemplateTypeParmType *T) { return true; }
>>> };
>>>
>>> +/// \brief Represents the result of substituting a set of types for a template
>>> +/// type parameter pack.
>>> +///
>>> +/// When a pack expansion in the source code contains multiple parameter packs
>>> +/// and those parameter packs correspond to different levels of template
>>> +/// parameter lists, this type node is used to represent a template type
>>> +/// parameter pack from an outer level, which has already had its argument pack
>>> +/// substituted but that still lives within a pack expansion that itself
>>> +/// could not be instantiated. When actually performing a substitution into
>>> +/// that pack expansion (e.g., when all template parameters have corresponding
>>> +/// arguments), this type will be replaced with the \c SubstTemplateTypeParmType
>>> +/// at the current pack substitution index.
>>> +class SubstTemplateTypeParmPackType : public Type, public llvm::FoldingSetNode {
>>> + /// \brief The original type parameter.
>>> + const TemplateTypeParmType *Replaced;
>>> +
>>> + /// \brief A pointer to the set of template arguments that this
>>> + /// parameter pack is instantiated with.
>>> + const TemplateArgument *Arguments;
>>> +
>>> + /// \brief The number of template arguments in \c Arguments.
>>> + unsigned NumArguments;
>>> +
>>> + SubstTemplateTypeParmPackType(const TemplateTypeParmType *Param,
>>> + QualType Canon,
>>> + const TemplateArgument &ArgPack);
>>> +
>>> + friend class ASTContext;
>>> +
>>> +public:
>>> + IdentifierInfo *getName() const { return Replaced->getName(); }
>>> +
>>> + /// Gets the template parameter that was substituted for.
>>> + const TemplateTypeParmType *getReplacedParameter() const {
>>> + return Replaced;
>>> + }
>>> +
>>> + bool isSugared() const { return false; }
>>> + QualType desugar() const { return QualType(this, 0); }
>>> +
>>> + TemplateArgument getArgumentPack() const;
>>> +
>>> + void Profile(llvm::FoldingSetNodeID &ID);
>>> + static void Profile(llvm::FoldingSetNodeID &ID,
>>> + const TemplateTypeParmType *Replaced,
>>> + const TemplateArgument &ArgPack);
>>> +
>>> + static bool classof(const Type *T) {
>>> + return T->getTypeClass() == SubstTemplateTypeParmPack;
>>> + }
>>> + static bool classof(const SubstTemplateTypeParmPackType *T) { return true; }
>>> +};
>>> +
>>> /// \brief Represents the type of a template specialization as written
>>> /// in the source code.
>>> ///
>>>
>>> Modified: cfe/trunk/include/clang/AST/TypeLoc.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TypeLoc.h?rev=123425&r1=123424&r2=123425&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/TypeLoc.h (original)
>>> +++ cfe/trunk/include/clang/AST/TypeLoc.h Thu Jan 13 20:55:32 2011
>>> @@ -592,6 +592,13 @@
>>> SubstTemplateTypeParmType> {
>>> };
>>>
>>> + /// \brief Wrapper for substituted template type parameters.
>>> +class SubstTemplateTypeParmPackTypeLoc :
>>> + public InheritingConcreteTypeLoc<TypeSpecTypeLoc,
>>> + SubstTemplateTypeParmPackTypeLoc,
>>> + SubstTemplateTypeParmPackType> {
>>> +};
>>> +
>>> struct AttributedLocInfo {
>>> union {
>>> Expr *ExprOperand;
>>>
>>> Modified: cfe/trunk/include/clang/AST/TypeNodes.def
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/TypeNodes.def?rev=123425&r1=123424&r2=123425&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/TypeNodes.def (original)
>>> +++ cfe/trunk/include/clang/AST/TypeNodes.def Thu Jan 13 20:55:32 2011
>>> @@ -91,6 +91,7 @@
>>> NON_CANONICAL_TYPE(Attributed, Type)
>>> DEPENDENT_TYPE(TemplateTypeParm, Type)
>>> NON_CANONICAL_TYPE(SubstTemplateTypeParm, Type)
>>> +DEPENDENT_TYPE(SubstTemplateTypeParmPack, Type)
>>
>> A couple of switch statements need cases for SubstTemplateTypeParmPack:
>>
>> tools/clang/lib/AST/ASTImporter.cpp:379:11: error: enumeration value
>> 'SubstTemplateTypeParmPack' not handled in switch [-Wswitch-enum]
>> switch (TC) {
>> ^
>>
>> tools/clang/lib/Sema/SemaTemplateDeduction.cpp:3448:12: error:
>> enumeration value 'SubstTemplateTypeParmPack' not handled in switch
>> [-Wswitch-enum]
>> switch (T->getTypeClass()) {
>> ^
>>
>> Want me to just add "default: assert(0 && ...)" for now?
>
>
> Please don't; I'll implement these pieces now. I forgot to do a check for warnings as I was running out the door :(
No problem.
-Matt
More information about the cfe-commits
mailing list