Skip to content

Commit 6fe22a7

Browse files
author
Matthew Gretton-Dann
committed
C++: Change API for exposing template parameters.
Note that Declaration::getTemplateArgumentType() and Declaration::getTemplateArgumentValue() need to be public so that they can be overriden in derived classes.
1 parent 45ec852 commit 6fe22a7

File tree

12 files changed

+86
-49
lines changed

12 files changed

+86
-49
lines changed

cpp/ql/src/semmle/code/cpp/Class.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ class Class extends UserType {
610610
* class template. When called on a class template, this will return the
611611
* `i`th template parameter.
612612
*/
613-
override Type getTemplateArgument(int i) {
613+
override Type getTemplateArgumentType(int i) {
614614
class_template_argument(underlyingElement(this), i, unresolveElement(result))
615615
}
616616

@@ -632,7 +632,7 @@ class Class extends UserType {
632632
}
633633

634634
override predicate involvesTemplateParameter() {
635-
getATemplateArgument().involvesTemplateParameter()
635+
getATemplateArgument().(Type).involvesTemplateParameter()
636636
}
637637

638638
/** Holds if this class, struct or union was declared 'final'. */

cpp/ql/src/semmle/code/cpp/Declaration.qll

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -196,33 +196,36 @@ abstract class Declaration extends Locatable, @declaration {
196196
* When called on a template, this will return a template parameter type for
197197
* both typed and non-typed parameters.
198198
*/
199-
final Type getATemplateArgument() { result = getTemplateArgument(_) }
199+
final Locatable getATemplateArgument() { result = getTemplateArgument(_) }
200200

201201
/**
202202
* Gets a template argument used to instantiate this declaration from a template.
203203
* When called on a template, this will return a non-typed template
204204
* parameter value.
205205
*/
206-
final Expr getATemplateArgumentValue() { result = getTemplateArgumentValue(_) }
206+
final Locatable getATemplateArgumentKind() { result = getTemplateArgumentKind(_) }
207207

208208
/**
209209
* Gets the `i`th template argument used to instantiate this declaration from a
210-
* template. When called on a template, this will return the `i`th template
211-
* parameter's type.
210+
* template.
212211
*
213212
* For example:
214213
*
215214
* `template<typename T, T X> class Foo;`
216215
*
217216
* Will have `getTemplateArgument(0)` return `T`, and
218-
* `getTemplateArgument(1)` return `T`.
217+
* `getTemplateArgument(1)` return `X`.
219218
*
220219
* `Foo<int, 1> bar;
221220
*
222221
* Will have `getTemplateArgument())` return `int`, and
223-
* `getTemplateArgument(1)` return `int`.
222+
* `getTemplateArgument(1)` return `1`.
224223
*/
225-
Type getTemplateArgument(int index) { none() }
224+
final Locatable getTemplateArgument(int index) {
225+
if exists(getTemplateArgumentValue(index))
226+
then result = getTemplateArgumentValue(index)
227+
else result = getTemplateArgumentType(index)
228+
}
226229

227230
/**
228231
* Gets the `i`th template argument value used to instantiate this declaration
@@ -233,20 +236,44 @@ abstract class Declaration extends Locatable, @declaration {
233236
*
234237
* `template<typename T, T X> class Foo;`
235238
*
236-
* Will have `getTemplateArgumentValue(1)` return `X`, and no result for
237-
* `getTemplateArgumentValue(0)`.
239+
* Will have `getTemplateArgumentKind(1)` return `T`, and no result for
240+
* `getTemplateArgumentKind(0)`.
238241
*
239242
* `Foo<int, 10> bar;
240243
*
241-
* Will have `getTemplateArgumentValue(1)` return `10`, and no result for
242-
* `getTemplateArgumentValue(0)`.
244+
* Will have `getTemplateArgumentKind(1)` return `int`, and no result for
245+
* `getTemplateArgumentKind(0)`.
243246
*/
244-
Expr getTemplateArgumentValue(int index) { none() }
247+
final Locatable getTemplateArgumentKind(int index) {
248+
if exists(getTemplateArgumentValue(index))
249+
then result = getTemplateArgumentType(index)
250+
else none()
251+
}
245252

246253
/** Gets the number of template arguments for this declaration. */
247254
final int getNumberOfTemplateArguments() {
248255
result = count(int i | exists(getTemplateArgument(i)))
249256
}
257+
258+
/**
259+
* INTERNAL: Do not use.
260+
*
261+
* Gets a Type for a template argument. May be the template argument itself
262+
* or the type of a non-type template argument.
263+
*
264+
* Use `getTemplateArgument` or `getTemplateKind` instead.
265+
*/
266+
Type getTemplateArgumentType(int index) { none() }
267+
268+
/**
269+
* INTERNAL: Do not use.
270+
*
271+
* Gets an Expression representing the value of a non-type template
272+
* argument.
273+
*
274+
* Use `getTemplateArgument` or `getTemplateKind` instead.
275+
*/
276+
Expr getTemplateArgumentValue(int index) { none() }
250277
}
251278

252279
/**

cpp/ql/src/semmle/code/cpp/Function.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ class Function extends Declaration, ControlFlowNode, AccessHolder, @function {
348348
* function template. When called on a function template, this will return the
349349
* `i`th template parameter.
350350
*/
351-
override Type getTemplateArgument(int index) {
351+
override Type getTemplateArgumentType(int index) {
352352
function_template_argument(underlyingElement(this), index, unresolveElement(result))
353353
}
354354

cpp/ql/src/semmle/code/cpp/Print.qll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ private string getParameterTypeString(Type parameterType) {
3636
}
3737

3838
private string getTemplateArgumentString(Declaration d, int i) {
39-
if exists(d.getTemplateArgumentValue(i))
39+
if exists(d.getTemplateArgumentKind(i))
4040
then
41-
result = d.getTemplateArgument(i).(DumpType).getTypeIdentityString() + " " + d.getTemplateArgumentValue(i)
42-
else
43-
result = d.getTemplateArgument(i).(DumpType).getTypeIdentityString()
41+
result = d.getTemplateArgumentKind(i).(DumpType).getTypeIdentityString() + " " +
42+
d.getTemplateArgument(i)
43+
else result = d.getTemplateArgument(i).(DumpType).getTypeIdentityString()
4444
}
4545

4646
/**

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class Type extends Locatable, @type {
210210
// A function call that provides an explicit template argument that refers to T uses T.
211211
// We exclude calls within instantiations, since they do not appear directly in the source.
212212
exists(FunctionCall c |
213-
c.getAnExplicitTemplateArgument().refersTo(this) and
213+
c.getAnExplicitTemplateArgument().(Type).refersTo(this) and
214214
result = c and
215215
not c.getEnclosingFunction().isConstructedFrom(_)
216216
)

cpp/ql/src/semmle/code/cpp/Variable.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ class Variable extends Declaration, @variable {
160160
* variable template. When called on a variable template, this will return the
161161
* `i`th template parameter.
162162
*/
163-
override Type getTemplateArgument(int index) {
163+
override Type getTemplateArgumentType(int index) {
164164
variable_template_argument(underlyingElement(this), index, unresolveElement(result))
165165
}
166166

cpp/ql/src/semmle/code/cpp/exprs/Call.qll

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -139,27 +139,27 @@ class FunctionCall extends Call, @funbindexpr {
139139
override string getCanonicalQLClass() { result = "FunctionCall" }
140140

141141
/** Gets an explicit template argument for this call. */
142-
Type getAnExplicitTemplateArgument() { result = getExplicitTemplateArgument(_) }
142+
Locatable getAnExplicitTemplateArgument() { result = getExplicitTemplateArgument(_) }
143143

144144
/** Gets an explicit template argument value for this call. */
145-
Expr getAnExplicitTemplateArgumentValue() { result = getExplicitTemplateArgumentValue(_) }
145+
Locatable getAnExplicitTemplateArgumentKind() { result = getExplicitTemplateArgumentKind(_) }
146146

147147
/** Gets a template argument for this call. */
148-
Type getATemplateArgument() { result = getTarget().getATemplateArgument() }
148+
Locatable getATemplateArgument() { result = getTarget().getATemplateArgument() }
149149

150150
/** Gets a template argument value for this call. */
151-
Expr getATemplateArgumentValue() { result = getTarget().getATemplateArgumentValue() }
151+
Locatable getATemplateArgumentKind() { result = getTarget().getATemplateArgumentKind() }
152152

153153
/** Gets the nth explicit template argument for this call. */
154-
Type getExplicitTemplateArgument(int n) {
154+
Locatable getExplicitTemplateArgument(int n) {
155155
n < getNumberOfExplicitTemplateArguments() and
156156
result = getTemplateArgument(n)
157157
}
158158

159159
/** Gets the nth explicit template argument value for this call. */
160-
Expr getExplicitTemplateArgumentValue(int n) {
160+
Locatable getExplicitTemplateArgumentKind(int n) {
161161
n < getNumberOfExplicitTemplateArguments() and
162-
result = getTemplateArgumentValue(n)
162+
result = getTemplateArgumentKind(n)
163163
}
164164

165165
/** Gets the number of explicit template arguments for this call. */
@@ -172,14 +172,11 @@ class FunctionCall extends Call, @funbindexpr {
172172
/** Gets the number of template arguments for this call. */
173173
int getNumberOfTemplateArguments() { result = count(int i | exists(getTemplateArgument(i))) }
174174

175-
/** Gets the number of template argument which are values for this call. */
176-
int getNumberOfTemplateArgumentValues() { result = count(int i | exists(getTemplateArgumentValue(i))) }
177-
178175
/** Gets the nth template argument for this call (indexed from 0). */
179-
Type getTemplateArgument(int n) { result = getTarget().getTemplateArgument(n) }
176+
Locatable getTemplateArgument(int n) { result = getTarget().getTemplateArgument(n) }
180177

181178
/** Gets the nth template argument value for this call (indexed from 0). */
182-
Expr getTemplateArgumentValue(int n) { result = getTarget().getTemplateArgumentValue(n) }
179+
Locatable getTemplateArgumentKind(int n) { result = getTarget().getTemplateArgumentKind(n) }
183180

184181
/** Holds if any template arguments for this call are implicit / deduced. */
185182
predicate hasImplicitTemplateArguments() {

cpp/ql/test/library-tests/templates/CPP-202/template_args.expected

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
| file://:0:0:0:0 | __va_list_tag | <none> |
2-
| test.cpp:3:8:3:9 | s1<<expression>> | bool |
3-
| test.cpp:3:8:3:9 | s1<<unnamed>> | bool |
2+
| test.cpp:3:8:3:9 | s1<<expression>> | {...} |
3+
| test.cpp:3:8:3:9 | s1<<unnamed>> | (null) |
44
| test.cpp:5:8:5:9 | s2<T> | T |
55
| test.cpp:5:8:5:9 | s2<T> | T |
66
| test.cpp:7:8:7:9 | s3<T, <unnamed>> | (unnamed) |
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import cpp
22

33
from Class c
4-
select c, c.getATemplateArgument(), c.getATemplateArgumentValue()
4+
select c, c.getATemplateArgumentKind(), c.getATemplateArgument()
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import cpp
22

33
from Function f
4-
select f, f.getATemplateArgument(), f.getATemplateArgumentValue()
4+
select f, f.getATemplateArgumentKind(), f.getATemplateArgument()

0 commit comments

Comments
 (0)