Skip to content

Commit 537fedd

Browse files
committed
C++: Introduce usertypes for structs and unions
1 parent 060161c commit 537fedd

File tree

10 files changed

+16
-28
lines changed

10 files changed

+16
-28
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ class AbstractClass extends Class {
869869
* `FullClassTemplateSpecialization`.
870870
*/
871871
class TemplateClass extends Class {
872-
TemplateClass() { usertypes(underlyingElement(this), _, 6) }
872+
TemplateClass() { usertypes(underlyingElement(this), _, [15, 16, 17]) }
873873

874874
/**
875875
* Gets a class instantiated from this template.

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import semmle.code.cpp.Class
2020
* ```
2121
*/
2222
class Struct extends Class {
23-
Struct() { usertypes(underlyingElement(this), _, 1) or usertypes(underlyingElement(this), _, 3) }
23+
Struct() { usertypes(underlyingElement(this), _, [1, 3, 15, 17]) }
2424

2525
override string getAPrimaryQlClass() { result = "Struct" }
2626

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

+1-3
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,7 @@ deprecated class TemplateParameter = TypeTemplateParameter;
5252
* ```
5353
*/
5454
class TypeTemplateParameter extends UserType, TemplateParameterImpl {
55-
TypeTemplateParameter() {
56-
usertypes(underlyingElement(this), _, 7) or usertypes(underlyingElement(this), _, 8)
57-
}
55+
TypeTemplateParameter() { usertypes(underlyingElement(this), _, [7, 8]) }
5856

5957
override string getAPrimaryQlClass() { result = "TypeTemplateParameter" }
6058

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

+1-4
Original file line numberDiff line numberDiff line change
@@ -406,10 +406,7 @@ class IntegralOrEnumType extends Type {
406406
isIntegralType(underlyingElement(this), _)
407407
or
408408
// Enum type
409-
(
410-
usertypes(underlyingElement(this), _, 4) or
411-
usertypes(underlyingElement(this), _, 13)
412-
)
409+
usertypes(underlyingElement(this), _, [4, 13])
413410
}
414411
}
415412

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

+1-4
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ private import semmle.code.cpp.internal.ResolveClass
1313
* ```
1414
*/
1515
class TypedefType extends UserType {
16-
TypedefType() {
17-
usertypes(underlyingElement(this), _, 5) or
18-
usertypes(underlyingElement(this), _, 14)
19-
}
16+
TypedefType() { usertypes(underlyingElement(this), _, [5, 14]) }
2017

2118
/**
2219
* Gets the base type of this typedef type.

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import semmle.code.cpp.Struct
1515
* ```
1616
*/
1717
class Union extends Struct {
18-
Union() { usertypes(underlyingElement(this), _, 3) }
18+
Union() { usertypes(underlyingElement(this), _, [3, 17]) }
1919

2020
override string getAPrimaryQlClass() { result = "Union" }
2121

cpp/ql/lib/semmle/code/cpp/internal/QualifiedName.qll

+2-2
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,11 @@ class ProxyClass extends UserType {
227227
}
228228

229229
class TypeTemplateParameter extends UserType {
230-
TypeTemplateParameter() { usertypes(this, _, 7) or usertypes(this, _, 8) }
230+
TypeTemplateParameter() { usertypes(this, _, [7, 8]) }
231231
}
232232

233233
class TemplateClass extends UserType {
234-
TemplateClass() { usertypes(this, _, 6) }
234+
TemplateClass() { usertypes(this, _, [15, 16, 17]) }
235235

236236
UserType getAnInstantiation() {
237237
class_instantiation(result, this) and

cpp/ql/lib/semmle/code/cpp/internal/ResolveClass.qll

+1-9
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,7 @@ private module Cached {
114114
* Holds if `t` is a struct, class, union, or template.
115115
*/
116116
cached
117-
predicate isClass(@usertype t) {
118-
usertypes(t, _, 1) or
119-
usertypes(t, _, 2) or
120-
usertypes(t, _, 3) or
121-
usertypes(t, _, 6) or
122-
usertypes(t, _, 10) or
123-
usertypes(t, _, 11) or
124-
usertypes(t, _, 12)
125-
}
117+
predicate isClass(@usertype t) { usertypes(t, _, [1, 2, 3, 15, 16, 17]) }
126118

127119
cached
128120
predicate isType(@type t) {

cpp/ql/lib/semmlecode.cpp.dbscheme

+6-2
Original file line numberDiff line numberDiff line change
@@ -771,12 +771,13 @@ decltypes(
771771

772772
/*
773773
case @usertype.kind of
774-
1 = @struct
774+
| 0 = @unknown_usertype
775+
| 1 = @struct
775776
| 2 = @class
776777
| 3 = @union
777778
| 4 = @enum
778779
| 5 = @typedef // classic C: typedef typedef type name
779-
| 6 = @template
780+
// ... 6 = @template deprecated
780781
| 7 = @template_parameter
781782
| 8 = @template_template_parameter
782783
| 9 = @proxy_class // a proxy class associated with a template parameter
@@ -785,6 +786,9 @@ case @usertype.kind of
785786
// ... 12 objc_category deprecated
786787
| 13 = @scoped_enum
787788
| 14 = @using_alias // a using name = type style typedef
789+
| 15 = @template_struct
790+
| 16 = @template_class
791+
| 17 = @template_union
788792
;
789793
*/
790794

cpp/ql/src/Architecture/Refactoring Opportunities/ClassesWithManyFields.ql

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ string kindstr(Class c) {
2121
or
2222
kind = 2 and result = "Class"
2323
or
24-
kind = 6 and result = "Template class"
24+
kind = [15, 16] and result = "Template class"
2525
)
2626
}
2727

0 commit comments

Comments
 (0)