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.
This commit is contained in:
Jonas Jensen
2018-09-26 14:02:15 +02:00
parent 0e0ab1ea97
commit 6ccd208d4e
3 changed files with 9 additions and 2 deletions

View File

@@ -12,8 +12,7 @@ private import semmle.code.cpp.internal.ResolveClass
*/
class Class extends UserType {
Class() {
isClass(this.underlying()) and
this = resolveClass(_)
isClass(this.underlying())
}
override @element unresolve() {

View File

@@ -7,6 +7,8 @@ private import semmle.code.cpp.internal.ResolveClass
* A C/C++ type.
*/
class Type extends Locatable, @type {
Type() { isType(this.underlying()) }
/**
* Gets the name of this type.
*/

View File

@@ -54,4 +54,10 @@ cached private module Cached {
(usertypes(t,_,1) or usertypes(t,_,2) or usertypes(t,_,3) or usertypes(t,_,6)
or usertypes(t,_,10) or usertypes(t,_,11) or usertypes(t,_,12))
}
cached predicate isType(@type t) {
not isClass(t)
or
t = resolveClass(_)
}
}