Skip to content

Commit 3a4c0a2

Browse files
authored
Merge pull request github#12389 from jketema/more-deprecated
C++: Add `deprecated` to predicates that are deprecated according to the QLDoc
2 parents 9b02eb7 + c9bccd9 commit 3a4c0a2

File tree

10 files changed

+108
-102
lines changed

10 files changed

+108
-102
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ class Declaration extends Locatable, @declaration {
186186
predicate hasDefinition() { exists(this.getDefinition()) }
187187

188188
/** DEPRECATED: Use `hasDefinition` instead. */
189-
predicate isDefined() { this.hasDefinition() }
189+
deprecated predicate isDefined() { this.hasDefinition() }
190190

191191
/** Gets the preferred location of this declaration, if any. */
192192
override Location getLocation() { none() }

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class Function extends Declaration, ControlFlowNode, AccessHolder, @function {
4141
* `min<int>(int, int) -> int`, and the full signature of the uninstantiated
4242
* template on the first line would be `min<T>(T, T) -> T`.
4343
*/
44-
string getFullSignature() {
44+
deprecated string getFullSignature() {
4545
exists(string name, string templateArgs, string args |
4646
result = name + templateArgs + args + " -> " + this.getType().toString() and
4747
name = this.getQualifiedName() and

cpp/ql/lib/semmle/code/cpp/commons/Alloc.qll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ predicate freeFunction(Function f, int argNum) { argNum = f.(DeallocationFunctio
1212
*
1313
* DEPRECATED: Use `DeallocationExpr` instead (this also includes `delete` expressions).
1414
*/
15-
predicate freeCall(FunctionCall fc, Expr arg) { arg = fc.(DeallocationExpr).getFreedExpr() }
15+
deprecated predicate freeCall(FunctionCall fc, Expr arg) {
16+
arg = fc.(DeallocationExpr).getFreedExpr()
17+
}
1618

1719
/**
1820
* Is e some kind of allocation or deallocation (`new`, `alloc`, `realloc`, `delete`, `free` etc)?

cpp/ql/src/experimental/Security/CWE/CWE-415/DoubleFree.ql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ import cpp
1414

1515
from FunctionCall fc, FunctionCall fc2, LocalScopeVariable v
1616
where
17-
freeCall(fc, v.getAnAccess()) and
18-
freeCall(fc2, v.getAnAccess()) and
17+
fc.(DeallocationExpr).getFreedExpr() = v.getAnAccess() and
18+
fc2.(DeallocationExpr).getFreedExpr() = v.getAnAccess() and
1919
fc != fc2 and
2020
fc.getASuccessor*() = fc2 and
2121
not exists(Expr exptmp |
Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
| CPP-205.cpp:0:0:0:0 | CPP-205.cpp | |
22
| CPP-205.cpp:1:20:1:20 | T | |
33
| CPP-205.cpp:1:20:1:20 | definition of T | |
4-
| CPP-205.cpp:2:5:2:5 | definition of fn | function declaration entry for fn<int>(int) -> int |
5-
| CPP-205.cpp:2:5:2:5 | fn | function fn<int>(int) -> int |
6-
| CPP-205.cpp:2:5:2:6 | definition of fn | function declaration entry for fn<T>(T) -> int |
7-
| CPP-205.cpp:2:5:2:6 | fn | function fn<T>(T) -> int |
8-
| CPP-205.cpp:2:10:2:12 | definition of out | parameter declaration entry for fn<T>(T) -> int |
9-
| CPP-205.cpp:2:10:2:12 | definition of out | parameter declaration entry for fn<int>(int) -> int |
10-
| CPP-205.cpp:2:10:2:12 | out | parameter for fn<T>(T) -> int |
11-
| CPP-205.cpp:2:10:2:12 | out | parameter for fn<int>(int) -> int |
4+
| CPP-205.cpp:2:5:2:5 | definition of fn | function declaration entry for int fn<int>(int) |
5+
| CPP-205.cpp:2:5:2:5 | fn | function int fn<int>(int) |
6+
| CPP-205.cpp:2:5:2:6 | definition of fn | function declaration entry for int fn<T>(T) |
7+
| CPP-205.cpp:2:5:2:6 | fn | function int fn<T>(T) |
8+
| CPP-205.cpp:2:10:2:12 | definition of out | parameter declaration entry for int fn<T>(T) |
9+
| CPP-205.cpp:2:10:2:12 | definition of out | parameter declaration entry for int fn<int>(int) |
10+
| CPP-205.cpp:2:10:2:12 | out | parameter for int fn<T>(T) |
11+
| CPP-205.cpp:2:10:2:12 | out | parameter for int fn<int>(int) |
1212
| CPP-205.cpp:2:15:5:1 | { ... } | |
1313
| CPP-205.cpp:2:15:5:1 | { ... } | |
1414
| CPP-205.cpp:3:3:3:33 | declaration | |
@@ -20,16 +20,16 @@
2020
| CPP-205.cpp:4:3:4:11 | return ... | |
2121
| CPP-205.cpp:4:10:4:10 | 0 | |
2222
| CPP-205.cpp:4:10:4:10 | 0 | |
23-
| CPP-205.cpp:7:5:7:8 | definition of main | function declaration entry for main() -> int |
24-
| CPP-205.cpp:7:5:7:8 | main | function main() -> int |
23+
| CPP-205.cpp:7:5:7:8 | definition of main | function declaration entry for int main() |
24+
| CPP-205.cpp:7:5:7:8 | main | function int main() |
2525
| CPP-205.cpp:7:12:9:1 | { ... } | |
2626
| CPP-205.cpp:8:3:8:15 | return ... | |
2727
| CPP-205.cpp:8:10:8:11 | call to fn | |
2828
| CPP-205.cpp:8:13:8:13 | 0 | |
29-
| file://:0:0:0:0 | (unnamed parameter 0) | parameter for __va_list_tag::operator=(__va_list_tag &&) -> __va_list_tag & |
30-
| file://:0:0:0:0 | (unnamed parameter 0) | parameter for __va_list_tag::operator=(const __va_list_tag &) -> __va_list_tag & |
29+
| file://:0:0:0:0 | (unnamed parameter 0) | parameter for __va_list_tag& __va_list_tag::operator=(__va_list_tag const&) |
30+
| file://:0:0:0:0 | (unnamed parameter 0) | parameter for __va_list_tag& __va_list_tag::operator=(__va_list_tag&&) |
3131
| file://:0:0:0:0 | __super | |
3232
| file://:0:0:0:0 | __va_list_tag | |
33-
| file://:0:0:0:0 | operator= | function __va_list_tag::operator=(__va_list_tag &&) -> __va_list_tag & |
34-
| file://:0:0:0:0 | operator= | function __va_list_tag::operator=(const __va_list_tag &) -> __va_list_tag & |
33+
| file://:0:0:0:0 | operator= | function __va_list_tag& __va_list_tag::operator=(__va_list_tag const&) |
34+
| file://:0:0:0:0 | operator= | function __va_list_tag& __va_list_tag::operator=(__va_list_tag&&) |
3535
| file://:0:0:0:0 | y | |

cpp/ql/test/library-tests/CPP-205/elements.ql

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
import cpp
2+
import semmle.code.cpp.Print
23

34
string describe(Element e) {
4-
result = "function " + e.(Function).getFullSignature()
5+
e instanceof Function and
6+
result = "function " + getIdentityString(e)
57
or
68
result =
79
"function declaration entry for " +
8-
e.(FunctionDeclarationEntry).getFunction().getFullSignature()
10+
getIdentityString(e.(FunctionDeclarationEntry).getFunction())
911
or
10-
result = "parameter for " + e.(Parameter).getFunction().getFullSignature()
12+
result = "parameter for " + getIdentityString(e.(Parameter).getFunction())
1113
or
1214
result =
1315
"parameter declaration entry for " +
14-
e.(ParameterDeclarationEntry).getFunctionDeclarationEntry().getFunction().getFullSignature()
16+
getIdentityString(e.(ParameterDeclarationEntry).getFunctionDeclarationEntry().getFunction())
1517
}
1618

1719
from Element e

cpp/ql/test/library-tests/allocators/allocators.expected

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,51 @@
11
newExprs
2-
| allocators.cpp:49:3:49:9 | new | int | operator new(unsigned long) -> void * | 4 | 4 | | |
3-
| allocators.cpp:50:3:50:15 | new | int | operator new(size_t, float) -> void * | 4 | 4 | | |
4-
| allocators.cpp:51:3:51:11 | new | int | operator new(unsigned long) -> void * | 4 | 4 | | |
5-
| allocators.cpp:52:3:52:14 | new | String | operator new(unsigned long) -> void * | 8 | 8 | | |
6-
| allocators.cpp:53:3:53:27 | new | String | operator new(size_t, float) -> void * | 8 | 8 | | |
7-
| allocators.cpp:54:3:54:17 | new | Overaligned | operator new(unsigned long, align_val_t) -> void * | 256 | 128 | aligned | |
8-
| allocators.cpp:55:3:55:25 | new | Overaligned | operator new(size_t, align_val_t, float) -> void * | 256 | 128 | aligned | |
9-
| allocators.cpp:107:3:107:18 | new | FailedInit | FailedInit::operator new(size_t) -> void * | 1 | 1 | | |
10-
| allocators.cpp:109:3:109:35 | new | FailedInitOveraligned | FailedInitOveraligned::operator new(size_t, align_val_t, float) -> void * | 128 | 128 | aligned | |
11-
| allocators.cpp:129:3:129:21 | new | int | operator new(size_t, void *) -> void * | 4 | 4 | | & ... |
12-
| allocators.cpp:135:3:135:26 | new | int | operator new(size_t, const nothrow_t &) -> void * | 4 | 4 | | |
2+
| allocators.cpp:49:3:49:9 | new | int | void* operator new(unsigned long) | 4 | 4 | | |
3+
| allocators.cpp:50:3:50:15 | new | int | void* operator new(size_t, float) | 4 | 4 | | |
4+
| allocators.cpp:51:3:51:11 | new | int | void* operator new(unsigned long) | 4 | 4 | | |
5+
| allocators.cpp:52:3:52:14 | new | String | void* operator new(unsigned long) | 8 | 8 | | |
6+
| allocators.cpp:53:3:53:27 | new | String | void* operator new(size_t, float) | 8 | 8 | | |
7+
| allocators.cpp:54:3:54:17 | new | Overaligned | void* operator new(unsigned long, std::align_val_t) | 256 | 128 | aligned | |
8+
| allocators.cpp:55:3:55:25 | new | Overaligned | void* operator new(size_t, std::align_val_t, float) | 256 | 128 | aligned | |
9+
| allocators.cpp:107:3:107:18 | new | FailedInit | void* FailedInit::operator new(size_t) | 1 | 1 | | |
10+
| allocators.cpp:109:3:109:35 | new | FailedInitOveraligned | void* FailedInitOveraligned::operator new(size_t, std::align_val_t, float) | 128 | 128 | aligned | |
11+
| allocators.cpp:129:3:129:21 | new | int | void* operator new(std::size_t, void*) | 4 | 4 | | & ... |
12+
| allocators.cpp:135:3:135:26 | new | int | void* operator new(std::size_t, std::nothrow_t const&) | 4 | 4 | | |
1313
newArrayExprs
14-
| allocators.cpp:68:3:68:12 | new[] | int[] | int | operator new[](unsigned long) -> void * | 4 | 4 | | n | |
15-
| allocators.cpp:69:3:69:18 | new[] | int[] | int | operator new[](size_t, float) -> void * | 4 | 4 | | n | |
16-
| allocators.cpp:70:3:70:15 | new[] | String[] | String | operator new[](unsigned long) -> void * | 8 | 8 | | n | |
17-
| allocators.cpp:71:3:71:20 | new[] | Overaligned[] | Overaligned | operator new[](unsigned long, align_val_t) -> void * | 256 | 128 | aligned | n | |
18-
| allocators.cpp:72:3:72:16 | new[] | String[10] | String | operator new[](unsigned long) -> void * | 8 | 8 | | | |
19-
| allocators.cpp:108:3:108:19 | new[] | FailedInit[] | FailedInit | FailedInit::operator new[](size_t) -> void * | 1 | 1 | | n | |
20-
| allocators.cpp:110:3:110:37 | new[] | FailedInitOveraligned[10] | FailedInitOveraligned | FailedInitOveraligned::operator new[](size_t, align_val_t, float) -> void * | 128 | 128 | aligned | | |
21-
| allocators.cpp:132:3:132:17 | new[] | int[1] | int | operator new[](size_t, void *) -> void * | 4 | 4 | | | buf |
22-
| allocators.cpp:136:3:136:26 | new[] | int[2] | int | operator new[](size_t, const nothrow_t &) -> void * | 4 | 4 | | | |
23-
| allocators.cpp:142:13:142:27 | new[] | char[][10] | char[10] | operator new[](unsigned long) -> void * | 10 | 1 | | x | |
24-
| allocators.cpp:143:13:143:28 | new[] | char[20][20] | char[20] | operator new[](unsigned long) -> void * | 20 | 1 | | | |
25-
| allocators.cpp:144:13:144:31 | new[] | char[][30][30] | char[30][30] | operator new[](unsigned long) -> void * | 900 | 1 | | x | |
14+
| allocators.cpp:68:3:68:12 | new[] | int[] | int | void* operator new[](unsigned long) | 4 | 4 | | n | |
15+
| allocators.cpp:69:3:69:18 | new[] | int[] | int | void* operator new[](size_t, float) | 4 | 4 | | n | |
16+
| allocators.cpp:70:3:70:15 | new[] | String[] | String | void* operator new[](unsigned long) | 8 | 8 | | n | |
17+
| allocators.cpp:71:3:71:20 | new[] | Overaligned[] | Overaligned | void* operator new[](unsigned long, std::align_val_t) | 256 | 128 | aligned | n | |
18+
| allocators.cpp:72:3:72:16 | new[] | String[10] | String | void* operator new[](unsigned long) | 8 | 8 | | | |
19+
| allocators.cpp:108:3:108:19 | new[] | FailedInit[] | FailedInit | void* FailedInit::operator new[](size_t) | 1 | 1 | | n | |
20+
| allocators.cpp:110:3:110:37 | new[] | FailedInitOveraligned[10] | FailedInitOveraligned | void* FailedInitOveraligned::operator new[](size_t, std::align_val_t, float) | 128 | 128 | aligned | | |
21+
| allocators.cpp:132:3:132:17 | new[] | int[1] | int | void* operator new[](std::size_t, void*) | 4 | 4 | | | buf |
22+
| allocators.cpp:136:3:136:26 | new[] | int[2] | int | void* operator new[](std::size_t, std::nothrow_t const&) | 4 | 4 | | | |
23+
| allocators.cpp:142:13:142:27 | new[] | char[][10] | char[10] | void* operator new[](unsigned long) | 10 | 1 | | x | |
24+
| allocators.cpp:143:13:143:28 | new[] | char[20][20] | char[20] | void* operator new[](unsigned long) | 20 | 1 | | | |
25+
| allocators.cpp:144:13:144:31 | new[] | char[][30][30] | char[30][30] | void* operator new[](unsigned long) | 900 | 1 | | x | |
2626
newExprDeallocators
27-
| allocators.cpp:52:3:52:14 | new | String | operator delete(void *, unsigned long) -> void | 8 | 8 | sized |
28-
| allocators.cpp:53:3:53:27 | new | String | operator delete(void *, float) -> void | 8 | 8 | |
29-
| allocators.cpp:107:3:107:18 | new | FailedInit | FailedInit::operator delete(void *, size_t) -> void | 1 | 1 | sized |
30-
| allocators.cpp:109:3:109:35 | new | FailedInitOveraligned | FailedInitOveraligned::operator delete(void *, align_val_t, float) -> void | 128 | 128 | aligned |
27+
| allocators.cpp:52:3:52:14 | new | String | void operator delete(void*, unsigned long) | 8 | 8 | sized |
28+
| allocators.cpp:53:3:53:27 | new | String | void operator delete(void*, float) | 8 | 8 | |
29+
| allocators.cpp:107:3:107:18 | new | FailedInit | void FailedInit::operator delete(void*, size_t) | 1 | 1 | sized |
30+
| allocators.cpp:109:3:109:35 | new | FailedInitOveraligned | void FailedInitOveraligned::operator delete(void*, std::align_val_t, float) | 128 | 128 | aligned |
3131
newArrayExprDeallocators
32-
| allocators.cpp:70:3:70:15 | new[] | String | operator delete[](void *, unsigned long) -> void | 8 | 8 | sized |
33-
| allocators.cpp:72:3:72:16 | new[] | String | operator delete[](void *, unsigned long) -> void | 8 | 8 | sized |
34-
| allocators.cpp:108:3:108:19 | new[] | FailedInit | FailedInit::operator delete[](void *, size_t) -> void | 1 | 1 | sized |
35-
| allocators.cpp:110:3:110:37 | new[] | FailedInitOveraligned | FailedInitOveraligned::operator delete[](void *, align_val_t, float) -> void | 128 | 128 | aligned |
32+
| allocators.cpp:70:3:70:15 | new[] | String | void operator delete[](void*, unsigned long) | 8 | 8 | sized |
33+
| allocators.cpp:72:3:72:16 | new[] | String | void operator delete[](void*, unsigned long) | 8 | 8 | sized |
34+
| allocators.cpp:108:3:108:19 | new[] | FailedInit | void FailedInit::operator delete[](void*, size_t) | 1 | 1 | sized |
35+
| allocators.cpp:110:3:110:37 | new[] | FailedInitOveraligned | void FailedInitOveraligned::operator delete[](void*, std::align_val_t, float) | 128 | 128 | aligned |
3636
deleteExprs
37-
| allocators.cpp:59:3:59:35 | delete | int | operator delete(void *, unsigned long) -> void | 4 | 4 | sized |
38-
| allocators.cpp:60:3:60:38 | delete | String | operator delete(void *, unsigned long) -> void | 8 | 8 | sized |
39-
| allocators.cpp:61:3:61:44 | delete | SizedDealloc | SizedDealloc::operator delete(void *, size_t) -> void | 32 | 1 | sized |
40-
| allocators.cpp:62:3:62:43 | delete | Overaligned | operator delete(void *, unsigned long, align_val_t) -> void | 256 | 128 | sized aligned |
41-
| allocators.cpp:64:3:64:44 | delete | const String | operator delete(void *, unsigned long) -> void | 8 | 8 | sized |
37+
| allocators.cpp:59:3:59:35 | delete | int | void operator delete(void*, unsigned long) | 4 | 4 | sized |
38+
| allocators.cpp:60:3:60:38 | delete | String | void operator delete(void*, unsigned long) | 8 | 8 | sized |
39+
| allocators.cpp:61:3:61:44 | delete | SizedDealloc | void SizedDealloc::operator delete(void*, size_t) | 32 | 1 | sized |
40+
| allocators.cpp:62:3:62:43 | delete | Overaligned | void operator delete(void*, unsigned long, std::align_val_t) | 256 | 128 | sized aligned |
41+
| allocators.cpp:64:3:64:44 | delete | const String | void operator delete(void*, unsigned long) | 8 | 8 | sized |
4242
deleteArrayExprs
43-
| allocators.cpp:78:3:78:37 | delete[] | int | operator delete[](void *, unsigned long) -> void | 4 | 4 | sized |
44-
| allocators.cpp:79:3:79:40 | delete[] | String | operator delete[](void *, unsigned long) -> void | 8 | 8 | sized |
45-
| allocators.cpp:80:3:80:46 | delete[] | SizedDealloc | SizedDealloc::operator delete[](void *, size_t) -> void | 32 | 1 | sized |
46-
| allocators.cpp:81:3:81:45 | delete[] | Overaligned | operator delete[](void *, unsigned long, align_val_t) -> void | 256 | 128 | sized aligned |
47-
| allocators.cpp:82:3:82:49 | delete[] | PolymorphicBase | operator delete[](void *, unsigned long) -> void | 8 | 8 | sized |
48-
| allocators.cpp:83:3:83:23 | delete[] | int | operator delete[](void *, unsigned long) -> void | 4 | 4 | sized |
43+
| allocators.cpp:78:3:78:37 | delete[] | int | void operator delete[](void*, unsigned long) | 4 | 4 | sized |
44+
| allocators.cpp:79:3:79:40 | delete[] | String | void operator delete[](void*, unsigned long) | 8 | 8 | sized |
45+
| allocators.cpp:80:3:80:46 | delete[] | SizedDealloc | void SizedDealloc::operator delete[](void*, size_t) | 32 | 1 | sized |
46+
| allocators.cpp:81:3:81:45 | delete[] | Overaligned | void operator delete[](void*, unsigned long, std::align_val_t) | 256 | 128 | sized aligned |
47+
| allocators.cpp:82:3:82:49 | delete[] | PolymorphicBase | void operator delete[](void*, unsigned long) | 8 | 8 | sized |
48+
| allocators.cpp:83:3:83:23 | delete[] | int | void operator delete[](void*, unsigned long) | 4 | 4 | sized |
4949
allocationFunctions
5050
| allocators.cpp:7:7:7:18 | operator new | getSizeArg = 0, requiresDealloc |
5151
| allocators.cpp:8:7:8:20 | operator new[] | getSizeArg = 0, requiresDealloc |

cpp/ql/test/library-tests/allocators/allocators.ql

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import cpp
22
import semmle.code.cpp.models.implementations.Allocation
3+
import semmle.code.cpp.Print
34

45
query predicate newExprs(
56
NewExpr expr, string type, string sig, int size, int alignment, string form, string placement
67
) {
78
exists(Function allocator, Type allocatedType |
89
expr.getAllocator() = allocator and
9-
sig = allocator.getFullSignature() and
10+
sig = getIdentityString(allocator) and
1011
allocatedType = expr.getAllocatedType() and
1112
type = allocatedType.toString() and
1213
size = allocatedType.getSize() and
@@ -24,7 +25,7 @@ query predicate newArrayExprs(
2425
) {
2526
exists(Function allocator, Type arrayType, Type elementType |
2627
expr.getAllocator() = allocator and
27-
sig = allocator.getFullSignature() and
28+
sig = getIdentityString(allocator) and
2829
arrayType = expr.getAllocatedType() and
2930
t1 = arrayType.toString() and
3031
elementType = expr.getAllocatedElementType() and
@@ -44,7 +45,7 @@ query predicate newExprDeallocators(
4445
) {
4546
exists(Function deallocator, Type allocatedType |
4647
expr.getDeallocator() = deallocator and
47-
sig = deallocator.getFullSignature() and
48+
sig = getIdentityString(deallocator) and
4849
allocatedType = expr.getAllocatedType() and
4950
type = allocatedType.toString() and
5051
size = allocatedType.getSize() and
@@ -62,7 +63,7 @@ query predicate newArrayExprDeallocators(
6263
) {
6364
exists(Function deallocator, Type elementType |
6465
expr.getDeallocator() = deallocator and
65-
sig = deallocator.getFullSignature() and
66+
sig = getIdentityString(deallocator) and
6667
elementType = expr.getAllocatedElementType() and
6768
type = elementType.toString() and
6869
size = elementType.getSize() and
@@ -80,7 +81,7 @@ query predicate deleteExprs(
8081
) {
8182
exists(Function deallocator, Type deletedType |
8283
expr.getDeallocator() = deallocator and
83-
sig = deallocator.getFullSignature() and
84+
sig = getIdentityString(deallocator) and
8485
deletedType = expr.getDeletedObjectType() and
8586
type = deletedType.toString() and
8687
size = deletedType.getSize() and
@@ -98,7 +99,7 @@ query predicate deleteArrayExprs(
9899
) {
99100
exists(Function deallocator, Type elementType |
100101
expr.getDeallocator() = deallocator and
101-
sig = deallocator.getFullSignature() and
102+
sig = getIdentityString(deallocator) and
102103
elementType = expr.getDeletedElementType() and
103104
type = elementType.toString() and
104105
size = elementType.getSize() and

0 commit comments

Comments
 (0)