Skip to content

Commit 1306e48

Browse files
committed
C++: Add NonTypeTemplateParameter class
1 parent a99c9b5 commit 1306e48

File tree

4 files changed

+99
-80
lines changed

4 files changed

+99
-80
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: feature
3+
---
4+
* A new class `NonTypeTemplateParameter` was introduced, which represents C++ non-type template parameters.

cpp/ql/lib/cpp.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import semmle.code.cpp.Field
3535
import semmle.code.cpp.Function
3636
import semmle.code.cpp.MemberFunction
3737
import semmle.code.cpp.Parameter
38+
import semmle.code.cpp.TemplateParameter
3839
import semmle.code.cpp.Variable
3940
import semmle.code.cpp.Initializer
4041
import semmle.code.cpp.FriendDecl
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/**
2+
* Provides a hierarchy of classes for modeling C/C++ template parameters.
3+
*/
4+
5+
import semmle.code.cpp.Type
6+
private import semmle.code.cpp.internal.ResolveClass
7+
8+
abstract private class TemplateParameterImpl extends Locatable {
9+
override string getAPrimaryQlClass() { result = "TemplateParameterImpl" }
10+
}
11+
12+
/**
13+
* A C++ template parameter.
14+
*
15+
* In the example below, `T`, `TT`, and `I` are template parameters:
16+
* ```
17+
* template <class T, template<typename> TT, int I>
18+
* class C { };
19+
* ```
20+
*/
21+
final class TemplateParameterBase = TemplateParameterImpl;
22+
23+
/**
24+
* A C++ non-type template parameter.
25+
*
26+
* In the example below, `I` is a non-type template parameter:
27+
* ```
28+
* template <int I>
29+
* class C { };
30+
* ```
31+
*/
32+
class NonTypeTemplateParameter extends Literal, TemplateParameterImpl {
33+
NonTypeTemplateParameter() { nontype_template_parameters(underlyingElement(this)) }
34+
35+
override string getAPrimaryQlClass() { result = "NonTypeTemplateParameter" }
36+
}
37+
38+
/**
39+
* A C++ `typename` (or `class`) template parameter.
40+
*
41+
* DEPRECATED: Use `TypeTemplateParameter` instead.
42+
*/
43+
deprecated class TemplateParameter = TypeTemplateParameter;
44+
45+
/**
46+
* A C++ `typename` (or `class`) template parameter.
47+
*
48+
* In the example below, `T` is a template parameter:
49+
* ```
50+
* template <class T>
51+
* class C { };
52+
* ```
53+
*/
54+
class TypeTemplateParameter extends UserType, TemplateParameterImpl {
55+
TypeTemplateParameter() {
56+
usertypes(underlyingElement(this), _, 7) or usertypes(underlyingElement(this), _, 8)
57+
}
58+
59+
override string getAPrimaryQlClass() { result = "TypeTemplateParameter" }
60+
61+
override predicate involvesTemplateParameter() { any() }
62+
}
63+
64+
/**
65+
* A C++ template template parameter.
66+
*
67+
* In the example below, `T` is a template template parameter (although its name
68+
* may be omitted):
69+
* ```
70+
* template <template <typename T> class Container, class Elem>
71+
* void foo(const Container<Elem> &value) { }
72+
* ```
73+
*/
74+
class TemplateTemplateParameter extends TypeTemplateParameter {
75+
TemplateTemplateParameter() { usertypes(underlyingElement(this), _, 8) }
76+
77+
override string getAPrimaryQlClass() { result = "TemplateTemplateParameter" }
78+
}
79+
80+
/**
81+
* A type representing the use of the C++11 `auto` keyword.
82+
* ```
83+
* auto val = some_typed_expr();
84+
* ```
85+
*/
86+
class AutoType extends TypeTemplateParameter {
87+
AutoType() { usertypes(underlyingElement(this), "auto", 7) }
88+
89+
override string getAPrimaryQlClass() { result = "AutoType" }
90+
91+
override Location getLocation() { result instanceof UnknownDefaultLocation }
92+
}

cpp/ql/lib/semmle/code/cpp/Type.qll

Lines changed: 2 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import semmle.code.cpp.Element
66
import semmle.code.cpp.Function
7+
import semmle.code.cpp.TemplateParameter
78
private import semmle.code.cpp.internal.ResolveClass
89

910
/**
@@ -288,10 +289,7 @@ class Type extends Locatable, @type {
288289
*/
289290
Type stripType() { result = this }
290291

291-
override Location getLocation() {
292-
suppressUnusedThis(this) and
293-
result instanceof UnknownDefaultLocation
294-
}
292+
override Location getLocation() { result instanceof UnknownDefaultLocation }
295293
}
296294

297295
/**
@@ -1666,82 +1664,6 @@ class RoutineType extends Type, @routinetype {
16661664
}
16671665
}
16681666

1669-
abstract private class TemplateParameterImpl extends Locatable {
1670-
override string getAPrimaryQlClass() { result = "TemplateParameterImpl" }
1671-
}
1672-
1673-
/**
1674-
* A C++ template parameter.
1675-
*
1676-
* In the example below, `T`, `TT`, and `I` are template parameters:
1677-
* ```
1678-
* template <class T, template<typename> TT, int I>
1679-
* class C { };
1680-
* ```
1681-
*/
1682-
final class TemplateParameterBase = TemplateParameterImpl;
1683-
1684-
/**
1685-
* A C++ `typename` (or `class`) template parameter.
1686-
*
1687-
* DEPRECATED: Use `TypeTemplateParameter` instead.
1688-
*/
1689-
deprecated class TemplateParameter = TypeTemplateParameter;
1690-
1691-
/**
1692-
* A C++ `typename` (or `class`) template parameter.
1693-
*
1694-
* In the example below, `T` is a template parameter:
1695-
* ```
1696-
* template <class T>
1697-
* class C { };
1698-
* ```
1699-
*/
1700-
class TypeTemplateParameter extends UserType, TemplateParameterImpl {
1701-
TypeTemplateParameter() {
1702-
usertypes(underlyingElement(this), _, 7) or usertypes(underlyingElement(this), _, 8)
1703-
}
1704-
1705-
override string getAPrimaryQlClass() { result = "TypeTemplateParameter" }
1706-
1707-
override predicate involvesTemplateParameter() { any() }
1708-
}
1709-
1710-
/**
1711-
* A C++ template template parameter.
1712-
*
1713-
* In the example below, `T` is a template template parameter (although its name
1714-
* may be omitted):
1715-
* ```
1716-
* template <template <typename T> class Container, class Elem>
1717-
* void foo(const Container<Elem> &value) { }
1718-
* ```
1719-
*/
1720-
class TemplateTemplateParameter extends TypeTemplateParameter {
1721-
TemplateTemplateParameter() { usertypes(underlyingElement(this), _, 8) }
1722-
1723-
override string getAPrimaryQlClass() { result = "TemplateTemplateParameter" }
1724-
}
1725-
1726-
/**
1727-
* A type representing the use of the C++11 `auto` keyword.
1728-
* ```
1729-
* auto val = some_typed_expr();
1730-
* ```
1731-
*/
1732-
class AutoType extends TypeTemplateParameter {
1733-
AutoType() { usertypes(underlyingElement(this), "auto", 7) }
1734-
1735-
override string getAPrimaryQlClass() { result = "AutoType" }
1736-
1737-
override Location getLocation() {
1738-
suppressUnusedThis(this) and
1739-
result instanceof UnknownDefaultLocation
1740-
}
1741-
}
1742-
1743-
private predicate suppressUnusedThis(Type t) { any() }
1744-
17451667
/**
17461668
* A source code location referring to a user-defined type.
17471669
*

0 commit comments

Comments
 (0)