Skip to content

Commit 8711232

Browse files
authored
Merge pull request #16069 from jketema/var-templ
C++: Add `VariableTemplateInstantiation` class
2 parents 6cd94cf + 050682c commit 8711232

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,33 @@ class TemplateVariable extends Variable {
590590
Variable getAnInstantiation() { result.isConstructedFrom(this) }
591591
}
592592

593+
/**
594+
* A variable that is an instantiation of a template. For example
595+
* the instantiation `myTemplateVariable<int>` in the following code:
596+
* ```
597+
* template<class T>
598+
* T myTemplateVariable;
599+
*
600+
* void caller(int i) {
601+
* myTemplateVariable<int> = i;
602+
* }
603+
* ```
604+
*/
605+
class VariableTemplateInstantiation extends Variable {
606+
TemplateVariable tv;
607+
608+
VariableTemplateInstantiation() { tv.getAnInstantiation() = this }
609+
610+
override string getAPrimaryQlClass() { result = "VariableTemplateInstantiation" }
611+
612+
/**
613+
* Gets the variable template from which this instantiation was instantiated.
614+
*
615+
* Example: For `int x<int>`, returns `T x`.
616+
*/
617+
TemplateVariable getTemplate() { result = tv }
618+
}
619+
593620
/**
594621
* A non-static local variable or parameter that is not part of an
595622
* uninstantiated template. Uninstantiated templates are purely syntax, and

cpp/ql/test/library-tests/ir/ir/PrintAST.expected

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15605,7 +15605,7 @@ ir.cpp:
1560515605
# 1934| Type = [ClassTemplateInstantiation,Struct] Bar2<int>
1560615606
# 1934| ValueCategory = lvalue
1560715607
# 1935| getStmt(2): [ReturnStmt] return ...
15608-
# 1938| [GlobalVariable] char global_template<char>
15608+
# 1938| [GlobalVariable,VariableTemplateInstantiation] char global_template<char>
1560915609
# 1938| getInitializer(): [Initializer] initializer for global_template
1561015610
# 1938| getExpr(): [Literal] 42
1561115611
# 1938| Type = [IntType] int
@@ -15616,7 +15616,7 @@ ir.cpp:
1561615616
# 1938| Type = [PlainCharType] char
1561715617
# 1938| Value = [CStyleCast] 42
1561815618
# 1938| ValueCategory = prvalue
15619-
# 1938| [GlobalVariable] int global_template<int>
15619+
# 1938| [GlobalVariable,VariableTemplateInstantiation] int global_template<int>
1562015620
# 1938| getInitializer(): [Initializer] initializer for global_template
1562115621
# 1938| getExpr(): [Literal] 42
1562215622
# 1938| Type = [IntType] int

0 commit comments

Comments
 (0)