Skip to content

Commit

Permalink
Merge pull request #18362 from github/jketema/template-parameters-4
Browse files Browse the repository at this point in the history
C++: Support concept templates
  • Loading branch information
jketema authored Jan 7, 2025
2 parents b18230a + 0f5b70a commit 0258ce7
Show file tree
Hide file tree
Showing 11 changed files with 10,227 additions and 316 deletions.
2,377 changes: 2,377 additions & 0 deletions cpp/downgrades/f786eb3f5dfddb0ac914ab09551bf1c5c64b47c0/old.dbscheme

Large diffs are not rendered by default.

2,358 changes: 2,358 additions & 0 deletions cpp/downgrades/f786eb3f5dfddb0ac914ab09551bf1c5c64b47c0/semmlecode.cpp.dbscheme

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
description: Support concept templates
compatibility: full
concept_templates.rel: delete
concept_template_argument.rel: delete
concept_template_argument_value.rel: delete
5 changes: 5 additions & 0 deletions cpp/ql/lib/change-notes/2024-12-23-concept-template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
category: feature
---
* A new class `Concept` was introduced, which represents C++20 concepts.
* The `getTemplateArgumentType` and `getTemplateArgumentValue` predicates of the `Declaration` class now also yield template arguments of concepts.
29 changes: 29 additions & 0 deletions cpp/ql/lib/semmle/code/cpp/Concept.qll
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,32 @@ class ConceptIdExpr extends RequirementExpr, @concept_id {

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

/**
* A C++ concept.
*
* For example:
* ```cpp
* template<class T>
* concept C = std::is_same<T, int>::value;
* ```
*/
class Concept extends Declaration, @concept_template {
override string getAPrimaryQlClass() { result = "Concept" }

override Location getLocation() { concept_templates(underlyingElement(this), _, result) }

override string getName() { concept_templates(underlyingElement(this), result, _) }

/**
* Gets the constraint expression of the concept.
*
* For example, in
* ```cpp
* template<class T>
* concept C = std::is_same<T, int>::value;
* ```
* the constraint expression is `std::is_same<T, int>::value`.
*/
Expr getExpr() { result.getParent() = this }
}
4 changes: 4 additions & 0 deletions cpp/ql/lib/semmle/code/cpp/Declaration.qll
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,8 @@ class Declaration extends Locatable, @declaration {
variable_template_argument(underlyingElement(this), index, unresolveElement(result))
or
template_template_argument(underlyingElement(this), index, unresolveElement(result))
or
concept_template_argument(underlyingElement(this), index, unresolveElement(result))
}

private Expr getTemplateArgumentValue(int index) {
Expand All @@ -289,6 +291,8 @@ class Declaration extends Locatable, @declaration {
variable_template_argument_value(underlyingElement(this), index, unresolveElement(result))
or
template_template_argument_value(underlyingElement(this), index, unresolveElement(result))
or
concept_template_argument_value(underlyingElement(this), index, unresolveElement(result))
}
}

Expand Down
21 changes: 20 additions & 1 deletion cpp/ql/lib/semmlecode.cpp.dbscheme
Original file line number Diff line number Diff line change
Expand Up @@ -876,6 +876,24 @@ template_template_argument_value(
int arg_value: @expr ref
);

@concept = @concept_template | @concept_id;

concept_templates(
unique int concept_id: @concept_template,
string name: string ref,
int location: @location_default ref
);
concept_template_argument(
int concept_id: @concept ref,
int index: int ref,
int arg_type: @type ref
);
concept_template_argument_value(
int concept_id: @concept ref,
int index: int ref,
int arg_value: @expr ref
);

routinetypes(
unique int id: @routinetype,
int return_type: @type ref
Expand Down Expand Up @@ -1106,7 +1124,8 @@ frienddecls(
| @declaredtype
| @variable
| @enumconstant
| @frienddecl;
| @frienddecl
| @concept_template;

@member = @membervariable
| @function
Expand Down
Loading

0 comments on commit 0258ce7

Please sign in to comment.