Skip to content

Commit 99880bc

Browse files
committed
CPP: Add syntax examples for Class.qll.
1 parent 7e90728 commit 99880bc

File tree

1 file changed

+116
-18
lines changed

1 file changed

+116
-18
lines changed

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

Lines changed: 116 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,22 @@ private import semmle.code.cpp.internal.ResolveClass
88
* A class type [N4140 9].
99
*
1010
* While this does include types declared with the `class` keyword, it also
11-
* includes types declared with the `struct` and `union` keywords.
11+
* includes types declared with the `struct` and `union` keywords. For example:
12+
* ```
13+
* class MyClass {
14+
* public:
15+
* MyClass();
16+
* };
17+
*
18+
* struct MyStruct {
19+
* int x, y, z;
20+
* };
21+
*
22+
* union MyUnion {
23+
* int i;
24+
* float f;
25+
* };
26+
* ```
1227
*/
1328
class Class extends UserType {
1429
Class() {
@@ -818,7 +833,16 @@ class ClassDerivation extends Locatable, @derivation {
818833
}
819834
}
820835

821-
/** A class that is directly enclosed by a function. */
836+
/**
837+
* A class that is directly enclosed by a function. For example the `struct` in
838+
* the following code is a `LocalClass`:
839+
* ```
840+
* void myFunction()
841+
* {
842+
* struct { int x; int y; } vec = { 1, 2 };
843+
* };
844+
* ```
845+
*/
822846
class LocalClass extends Class {
823847
LocalClass() {
824848
isLocal()
@@ -833,7 +857,18 @@ class LocalClass extends Class {
833857
}
834858

835859
/**
836-
* A nested class [4140 9.7].
860+
* A nested class [4140 9.7]. For example the struct `PairT` in the following
861+
* code is a nested class:
862+
* ```
863+
* template<class T>
864+
* class MyTemplateClass
865+
* {
866+
* public:
867+
* struct PairT {
868+
* T first, second;
869+
* };
870+
* };
871+
* ```
837872
*/
838873
class NestedClass extends Class {
839874
NestedClass() {
@@ -867,8 +902,16 @@ class AbstractClass extends Class {
867902
}
868903

869904
/**
870-
* A class template. (This class also finds partial specializations
871-
* of class templates).
905+
* A class template (this class also finds partial specializations
906+
* of class templates). For example in the following code there is a
907+
* `MyTemplateClass<T>` template:
908+
* ```
909+
* template<class T>
910+
* class MyTemplateClass
911+
* {
912+
* ...
913+
* };
914+
* ```
872915
*/
873916
class TemplateClass extends Class {
874917
TemplateClass() { usertypes(underlyingElement(this),_,6) }
@@ -881,7 +924,17 @@ class TemplateClass extends Class {
881924
}
882925

883926
/**
884-
* A class that is an instantiation of a template.
927+
* A class that is an instantiation of a template. For example in the following
928+
* code there is a `MyTemplateClass<int>` instantiation:
929+
* ```
930+
* template<class T>
931+
* class MyTemplateClass
932+
* {
933+
* ...
934+
* };
935+
*
936+
* MyTemplateClass<int> instance;
937+
* ```
885938
*/
886939
class ClassTemplateInstantiation extends Class {
887940
TemplateClass tc;
@@ -895,15 +948,16 @@ class ClassTemplateInstantiation extends Class {
895948
/**
896949
* Gets the class template from which this instantiation was instantiated.
897950
*
898-
* Example: For `std::vector<float>`, returns `std::vector<T>`.
951+
* For example: For `std::vector<float>`, the result is `std::vector<T>`.
899952
*/
900953
TemplateClass getTemplate() {
901954
result = tc
902955
}
903956
}
904957

905958
/**
906-
* A specialization of a class template.
959+
* A specialization of a class template (this may be a full or partial template
960+
* specialization).
907961
*/
908962
abstract class ClassTemplateSpecialization extends Class {
909963
/**
@@ -928,7 +982,14 @@ abstract class ClassTemplateSpecialization extends Class {
928982
}
929983

930984
/**
931-
* A full specialization of a class template.
985+
* A full specialization of a class template. For example:
986+
* ```
987+
* template<>
988+
* class MyTemplateClass<int>
989+
* {
990+
* ...
991+
* };
992+
* ```
932993
*/
933994
class FullClassTemplateSpecialization extends ClassTemplateSpecialization {
934995
FullClassTemplateSpecialization() {
@@ -947,7 +1008,14 @@ class FullClassTemplateSpecialization extends ClassTemplateSpecialization {
9471008
}
9481009

9491010
/**
950-
* A partial specialization of a class template.
1011+
* A partial specialization of a class template. For example:
1012+
* ```
1013+
* template<class T>
1014+
* class MyTemplateClass<int, T>
1015+
* {
1016+
* ...
1017+
* };
1018+
* ```
9511019
*/
9521020
class PartialClassTemplateSpecialization extends ClassTemplateSpecialization {
9531021
PartialClassTemplateSpecialization() {
@@ -973,8 +1041,17 @@ class PartialClassTemplateSpecialization extends ClassTemplateSpecialization {
9731041
}
9741042

9751043
/**
976-
* An "interface", in other words a class that only contains pure virtual
977-
* functions.
1044+
* An "interface" is a class that only contains pure virtual functions (and contains
1045+
* at least one such function). For example:
1046+
* ```
1047+
* class MyInterfaceClass
1048+
* {
1049+
* public:
1050+
* virtual void myMethod1() = 0;
1051+
* virtual void myMethod2() = 0;
1052+
* };
1053+
* ```
1054+
*
9781055
*/
9791056
class Interface extends Class {
9801057
Interface() {
@@ -985,8 +1062,14 @@ class Interface extends Class {
9851062
}
9861063

9871064
/**
988-
* A class derivation that is virtual, for example
989-
* "class X : --> virtual public Y &lt;--."
1065+
* A class derivation that is virtual. For example the derivation in the following
1066+
* code is a `VirtualClassDerivation`:
1067+
* ```
1068+
* class MyClass : public virtual MyBaseClass
1069+
* {
1070+
* ...
1071+
* };
1072+
* ```
9901073
*/
9911074
class VirtualClassDerivation extends ClassDerivation {
9921075
VirtualClassDerivation() {
@@ -997,7 +1080,19 @@ class VirtualClassDerivation extends ClassDerivation {
9971080
}
9981081

9991082
/**
1000-
* A class that is the base of some virtual class derivation.
1083+
* A class that is the base of some virtual class derivation. For example
1084+
* `MyBaseClass` in the following code is a `VirtualBaseClass`:
1085+
* ```
1086+
* class MyBaseClass
1087+
* {
1088+
* ...
1089+
* };
1090+
*
1091+
* class MyClass : public virtual MyBaseClass
1092+
* {
1093+
* ...
1094+
* };
1095+
* ```
10011096
*/
10021097
class VirtualBaseClass extends Class {
10031098
VirtualBaseClass() {
@@ -1020,10 +1115,13 @@ class VirtualBaseClass extends Class {
10201115
/**
10211116
* The proxy class (where needed) associated with a template parameter, as
10221117
* in the following code:
1023-
*
1024-
* template &lt;typename T>
1118+
* ```
1119+
* template <typename T>
10251120
* struct S : T // the type of this T is a proxy class
1026-
* {};
1121+
* {
1122+
* ...
1123+
* };
1124+
* ```
10271125
*/
10281126
class ProxyClass extends UserType {
10291127
ProxyClass() {

0 commit comments

Comments
 (0)