mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
Merge pull request #19603 from github/idrissrio/comments-using
C++: Add support for getting literals in using declarations
This commit is contained in:
4
cpp/ql/lib/change-notes/2025-05-28-using-template.md
Normal file
4
cpp/ql/lib/change-notes/2025-05-28-using-template.md
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: feature
|
||||
---
|
||||
* Added a predicate `getReferencedMember` to `UsingDeclarationEntry`, which yields a member depending on a type template parameter.
|
||||
@@ -174,7 +174,27 @@ class UsingDeclarationEntry extends UsingEntry {
|
||||
*/
|
||||
Declaration getDeclaration() { usings(underlyingElement(this), unresolveElement(result), _, _) }
|
||||
|
||||
override string toString() { result = "using " + this.getDeclaration().getDescription() }
|
||||
/**
|
||||
* Gets the member that is referenced by this using declaration, where the member depends on a
|
||||
* type template parameter.
|
||||
*
|
||||
* For example:
|
||||
* ```
|
||||
* template <typename T>
|
||||
* class A {
|
||||
* using T::m;
|
||||
* };
|
||||
* ```
|
||||
* Here, `getReferencedMember()` yields the member `m` of `T`. Observe that,
|
||||
* as `T` is not instantiated, `m` is represented by a `Literal` and not
|
||||
* a `Declaration`.
|
||||
*/
|
||||
Literal getReferencedMember() { usings(underlyingElement(this), unresolveElement(result), _, _) }
|
||||
|
||||
override string toString() {
|
||||
result = "using " + this.getDeclaration().getDescription() or
|
||||
result = "using " + this.getReferencedMember()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -9,3 +9,6 @@
|
||||
| multi.c:5:27:5:36 | // Multi 3 | declaration of multi3 |
|
||||
| templates.cpp:3:3:3:8 | // Foo | declaration of foo |
|
||||
| templates.cpp:7:3:7:8 | // Bar | definition of bar |
|
||||
| templates.cpp:16:3:16:20 | // using T::member | using member |
|
||||
| templates.cpp:19:3:19:28 | // using T::nested::member | using member |
|
||||
| templates.cpp:25:3:25:20 | // using T::member | using member |
|
||||
|
||||
@@ -10,3 +10,18 @@ class Cl {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <typename T>
|
||||
class Derived : public T {
|
||||
// using T::member
|
||||
using T::member;
|
||||
|
||||
// using T::nested::member
|
||||
using T::nested::member;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class Base {
|
||||
// using T::member
|
||||
using T::member;
|
||||
};
|
||||
Reference in New Issue
Block a user