/** * Provides a hierarchy of classes for modeling C/C++ template parameters. */ import semmle.code.cpp.Type private import semmle.code.cpp.internal.ResolveClass abstract private class TemplateParameterImpl extends Locatable { override string getAPrimaryQlClass() { result = "TemplateParameterImpl" } } /** * A C++ template parameter. * * In the example below, `T`, `TT`, and `I` are template parameters: * ``` * template TT, int I> * class C { }; * ``` */ final class TemplateParameterBase = TemplateParameterImpl; /** * A C++ non-type template parameter. * * In the example below, `I` is a non-type template parameter: * ``` * template * class C { }; * ``` */ class NonTypeTemplateParameter extends Literal, TemplateParameterImpl { NonTypeTemplateParameter() { nontype_template_parameters(underlyingElement(this)) } override string getAPrimaryQlClass() { result = "NonTypeTemplateParameter" } } /** * A C++ `typename` (or `class`) template parameter. * * In the example below, `T` is a template parameter: * ``` * template * class C { }; * ``` */ class TypeTemplateParameter extends UserType, TemplateParameterImpl { TypeTemplateParameter() { usertypes(underlyingElement(this), _, [7, 8]) } override string getAPrimaryQlClass() { result = "TypeTemplateParameter" } override predicate involvesTemplateParameter() { any() } /** * Get the type constraint of this type template parameter. */ Expr getTypeConstraint() { type_template_type_constraint(underlyingElement(this), unresolveElement(result)) } } /** * A C++ template template parameter. * * In the example below, `T` is a template template parameter (although its name * may be omitted): * ``` * template