Skip to content

Commit

Permalink
Merge pull request #18606 from jketema/typeref
Browse files Browse the repository at this point in the history
C++: Support mixed `typedef`s and `using`s
  • Loading branch information
jketema authored Jan 30, 2025
2 parents e27e3ae + 37b67dd commit 8f25dbf
Show file tree
Hide file tree
Showing 12 changed files with 10,844 additions and 980 deletions.
2,444 changes: 2,444 additions & 0 deletions cpp/downgrades/e594389175c098d7225683d0fd8cefcc47d84bc1/old.dbscheme

Large diffs are not rendered by default.

2,432 changes: 2,432 additions & 0 deletions cpp/downgrades/e594389175c098d7225683d0fd8cefcc47d84bc1/semmlecode.cpp.dbscheme

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
description: Mix typedefs and usings
compatibility: full
usertypes.rel: run usertypes.qlo
usertype_alias_kind.rel: delete
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class UserType extends @usertype {
string toString() { none() }
}

int getTyperefKind(UserType usertype) {
usertype_alias_kind(usertype, 0) and
result = 5
or
usertype_alias_kind(usertype, 1) and
result = 14
}

bindingset[kind]
int getKind(UserType usertype, int kind) {
if kind = 18 then result = getTyperefKind(usertype) else result = kind
}

from UserType usertype, string name, int kind
where usertypes(usertype, name, kind)
select usertype, name, getKind(usertype, kind)
6 changes: 3 additions & 3 deletions cpp/ql/lib/semmle/code/cpp/TypedefType.qll
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ private import semmle.code.cpp.internal.ResolveClass
* ```
*/
class TypedefType extends UserType {
TypedefType() { usertypes(underlyingElement(this), _, [5, 14]) }
TypedefType() { usertypes(underlyingElement(this), _, 18) }

/**
* Gets the base type of this typedef type.
Expand Down Expand Up @@ -54,7 +54,7 @@ class TypedefType extends UserType {
* ```
*/
class CTypedefType extends TypedefType {
CTypedefType() { usertypes(underlyingElement(this), _, 5) }
CTypedefType() { usertype_alias_kind(underlyingElement(this), 0) }

override string getAPrimaryQlClass() { result = "CTypedefType" }

Expand All @@ -70,7 +70,7 @@ class CTypedefType extends TypedefType {
* ```
*/
class UsingAliasTypedefType extends TypedefType {
UsingAliasTypedefType() { usertypes(underlyingElement(this), _, 14) }
UsingAliasTypedefType() { usertype_alias_kind(underlyingElement(this), 1) }

override string getAPrimaryQlClass() { result = "UsingAliasTypedefType" }

Expand Down
16 changes: 14 additions & 2 deletions cpp/ql/lib/semmlecode.cpp.dbscheme
Original file line number Diff line number Diff line change
Expand Up @@ -776,7 +776,7 @@ case @usertype.kind of
| 2 = @class
| 3 = @union
| 4 = @enum
| 5 = @typedef // classic C: typedef typedef type name
// ... 5 = @typedef deprecated // classic C: typedef typedef type name
// ... 6 = @template deprecated
| 7 = @template_parameter
| 8 = @template_template_parameter
Expand All @@ -785,10 +785,11 @@ case @usertype.kind of
// ... 11 objc_protocol deprecated
// ... 12 objc_category deprecated
| 13 = @scoped_enum
| 14 = @using_alias // a using name = type style typedef
// ... 14 = @using_alias deprecated // a using name = type style typedef
| 15 = @template_struct
| 16 = @template_class
| 17 = @template_union
| 18 = @alias
;
*/

Expand All @@ -811,6 +812,17 @@ usertype_uuid(
string uuid: string ref
);

/*
case @usertype.alias_kind of
| 0 = @typedef
| 1 = @alias
*/

usertype_alias_kind(
int id: @usertype ref,
int alias_kind: int ref
)

nontype_template_parameters(
int id: @expr ref
);
Expand Down
Loading

0 comments on commit 8f25dbf

Please sign in to comment.