Skip to content

Commit 6ccd208

Browse files
committed
C++: Prevent incomplete classes from being Types
Raw classes from the database that are incomplete and should be represented by their complete twin are now allowed to be `Element`s for performance reasons, but this commit prevents them from being `Type`s. It was causing confusion in test results and might also cause confusion in queries.
1 parent 0e0ab1e commit 6ccd208

File tree

3 files changed

+9
-2
lines changed

3 files changed

+9
-2
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ private import semmle.code.cpp.internal.ResolveClass
1212
*/
1313
class Class extends UserType {
1414
Class() {
15-
isClass(this.underlying()) and
16-
this = resolveClass(_)
15+
isClass(this.underlying())
1716
}
1817

1918
override @element unresolve() {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ private import semmle.code.cpp.internal.ResolveClass
77
* A C/C++ type.
88
*/
99
class Type extends Locatable, @type {
10+
Type() { isType(this.underlying()) }
11+
1012
/**
1113
* Gets the name of this type.
1214
*/

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,10 @@ cached private module Cached {
5454
(usertypes(t,_,1) or usertypes(t,_,2) or usertypes(t,_,3) or usertypes(t,_,6)
5555
or usertypes(t,_,10) or usertypes(t,_,11) or usertypes(t,_,12))
5656
}
57+
58+
cached predicate isType(@type t) {
59+
not isClass(t)
60+
or
61+
t = resolveClass(_)
62+
}
5763
}

0 commit comments

Comments
 (0)