Swift: extract ConsumeExpr

This commit is contained in:
Alex Denisov
2023-11-13 14:00:13 +01:00
parent 30e4822fb7
commit d21e27c717
20 changed files with 207 additions and 23 deletions

View File

@@ -202,7 +202,7 @@ MAP(swift::Expr, ExprTag)
MAP(swift::TypeJoinExpr, void) // TODO (introduced in 5.8)
MAP(swift::MacroExpansionExpr, void) // TODO (introduced in 5.8)
MAP(swift::CopyExpr, CopyExprTag)
MAP(swift::ConsumeExpr, void) // TODO (introduced in 5.9)
MAP(swift::ConsumeExpr, ConsumeExprTag)
MAP(swift::MaterializePackExpr, void) // TODO (introduced in 5.9)
MAP(swift::SingleValueStmtExpr, SingleValueStmtExprTag)

View File

@@ -663,4 +663,10 @@ codeql::CopyExpr ExprTranslator::translateCopyExpr(const swift::CopyExpr& expr)
return entry;
}
codeql::ConsumeExpr ExprTranslator::translateConsumeExpr(const swift::ConsumeExpr& expr) {
auto entry = createExprEntry(expr);
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
return entry;
}
} // namespace codeql

View File

@@ -123,6 +123,7 @@ class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
codeql::PackExpansionExpr translatePackExpansionExpr(const swift::PackExpansionExpr& expr);
codeql::PackElementExpr translatePackElementExpr(const swift::PackElementExpr& expr);
codeql::CopyExpr translateCopyExpr(const swift::CopyExpr& expr);
codeql::ConsumeExpr translateConsumeExpr(const swift::ConsumeExpr& expr);
private:
void fillClosureExpr(const swift::AbstractClosureExpr& expr, codeql::ClosureExpr& entry);

View File

@@ -96,6 +96,8 @@ lib/codeql/swift/elements/expr/ConditionalBridgeFromObjCExpr.qll bfe2e7142451c1d
lib/codeql/swift/elements/expr/ConditionalBridgeFromObjCExprConstructor.qll 446d2b437a1b54e0ba3107aad57ea9a12449a70cd9565cc724b395bf88fd9e8b 7f7bd4dd2f6cb717c7868993d183fcf7634c30666a1709b9d1577ed17467f1e7
lib/codeql/swift/elements/expr/ConditionalCheckedCastExpr.qll 61290c72da5609bcefb417a55e9d4338393af057c8634459875500710ffbeebb dadc07129e4b4ed41a8afb19a3e53ac0bf78f5b077be5f09e5609d87659a5869
lib/codeql/swift/elements/expr/ConditionalCheckedCastExprConstructor.qll 14b761095c024474f6e475a66822e9893b4e65e35c4182be9fdc5f801eb2274d 7d62113ae891dff8e371ed89d698e2df225a7580fe371165d69f42bd88ce8ecc
lib/codeql/swift/elements/expr/ConsumeExpr.qll 570b4d2e1fd00d304affc8fdda82e8eb04670caaab9d74a8d97928cc95a2b4e3 2634631565b40dd487face44581d2d28582cc80ae7bb97e39f74241d31a3a5e4
lib/codeql/swift/elements/expr/ConsumeExprConstructor.qll e2fd37095422dcfa7e01fa0e7973db1b4e0f816064a0facd10009b200c941b0e 03c9ef3df9491b4a8438800d9d8c7b6d7fe562f1cc0250748f27933abfa2c989
lib/codeql/swift/elements/expr/CopyExpr.qll f820ef6ae749267bfc198b110fb32a14e910800008eeb955a496a7e80cb8c614 4334f4938e164323d7bc58742b73f7285f16d6d641bd41ac92d5dccaa7af32eb
lib/codeql/swift/elements/expr/CopyExprConstructor.qll 2b4944e504ab0a4884a926d5532c686004147548fc1734922d0a83d23828de56 4ef6c99b3bcc0ba58b8c040339762246eb206a4f89d0ed7ca92421b964bded17
lib/codeql/swift/elements/expr/CovariantFunctionConversionExpr.qll 7726850cac33afed7bb0aad3a0e9d1211d7c287b0c17be4e2056ddcd99d35e86 aae0109a74e369d4d1a567473e24c4aac1e68cd4d4a920f11f8fc3b9db99cf6e
@@ -379,7 +381,7 @@ lib/codeql/swift/elements/type/UnresolvedTypeConstructor.qll 7f75d489b4d7ce65cae
lib/codeql/swift/elements/type/VariadicSequenceTypeConstructor.qll fc74a5a2a2effa28ef24509b20ee4373d97cf6e8c71840121bb031c6adedf584 c9b2effc1d01c13c5e6a74a111122fa79a2f6554dda3cb016d68ba397e566ec4
lib/codeql/swift/elements/type/WeakStorageType.qll edd13dd97b53040684409e187c1f975bcada6807c919e1345d8977144dbebb6f 9434c044d264a7f5f503a6422c106c9b8fedf74aaae314174473a29ea6ed17b9
lib/codeql/swift/elements/type/WeakStorageTypeConstructor.qll 5fdce3716aba6318522174a2c455a63480970222ae81c732fb19c6dd3ae2d271 60ea79d6943e129deba0deccb566cf9d73f78398b0f7f0212674d91287d6b2ae
lib/codeql/swift/elements.qll f1c8fdfa57e5bf9bc19c0ca6ded891c8431c8cd98b2a53e5eb7ce36199c6bab2 f1c8fdfa57e5bf9bc19c0ca6ded891c8431c8cd98b2a53e5eb7ce36199c6bab2
lib/codeql/swift/elements.qll 55d216f8dfeae9871c08ed202b737be068182376870ea18a0f78adb4d035f365 55d216f8dfeae9871c08ed202b737be068182376870ea18a0f78adb4d035f365
lib/codeql/swift/generated/AstNode.qll e00d6a46b16891778531a73722ae0b5842f849328e24aebe88bc30ac9fe438c2 40eaa0072d3ffecbff48d2baf88111daa86ef0f937abf24f032f2495739ef661
lib/codeql/swift/generated/AvailabilityInfo.qll e90fbfc3ec6830390e12a4695698d6efd8da4fa6a8a4189f466489a6dd103586 d9545da9e5d0c160679a4147001b4b1c664d9cb85ae1a169dd639c35046d274d
lib/codeql/swift/generated/AvailabilitySpec.qll 469bbd39d38dc68f1f6fb2e0766cc25b2f813c804fec44962910d5f7777632a2 57a953a8d5cf7031283393af1b3cfbc7f5941c9062e77950b32e5b5c6ae6b191
@@ -395,12 +397,12 @@ lib/codeql/swift/generated/KeyPathComponent.qll 55629a20538d7e8f4f4d4c7484e8bcfd
lib/codeql/swift/generated/Locatable.qll 41f040643ea146c8044be49fddea89bdd79efd2469617c863a4b2da0b1af3364 9a964dcbc7f5ffce2ee006ce0c9a9a99a988976fcd0446af2ba1b202911d7396
lib/codeql/swift/generated/Location.qll 5b37ecde83a871ef2089cf33e4743fc02d9cf8c676aafd9f157c59ffdb776d6b 076d8d3d2313931e8287d196854acf259700124d9c8bc591a6d36017f314260a
lib/codeql/swift/generated/OtherAvailabilitySpec.qll 31f3667ab0dc5f93230ba876b4101898d2a5a4af306925082305eff3ad9c9c0e 31f3667ab0dc5f93230ba876b4101898d2a5a4af306925082305eff3ad9c9c0e
lib/codeql/swift/generated/ParentChild.qll fb015f25cdff4fd65a909b98b3bb213e7948e14e152e14e789f856ec65189c70 dc0b64fc75ac329be4ddd8d69f41cc89d1dfd0f9379b764766b0b9724472907d
lib/codeql/swift/generated/ParentChild.qll 5cf57f71329d520286af1434bdc7549ee9e657f0ca66da15379e4974ced1b1b6 66829a7cb8c7e2657e7db86eabea7495418884b4c7d77bebdc814fc481fe4d24
lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll 3483726f6db9d978e40db75068d6a9ecad8f7c06516157fce783b26424bea729 864fedf2901de91f662a6d75a2eb7e26ed1a2a1a875a2b3c4e699dc7e7c4605e
lib/codeql/swift/generated/PureSynthConstructors.qll 40f5c0c573ce12f16322d9efb12306750f672254cbc36a200c298cb08e504229 40f5c0c573ce12f16322d9efb12306750f672254cbc36a200c298cb08e504229
lib/codeql/swift/generated/Raw.qll d63ca7a4be4795dc6d0693ff91e7057aac20f7bfc92c772b74dd27fce845274e 4c06e31cb9016f2829cf5b67f65dca3ad83b1d7b562e985a4add223f9b5e632c
lib/codeql/swift/generated/Synth.qll 0c32468f13063f3182e57dae315a1140617fec84f20bfe5a1dc18d9ad861747c 9a5853b0ce04b3a03172d38495a8f60702213d1d767e7716ff6e1c5e38ff162d
lib/codeql/swift/generated/SynthConstructors.qll 1384e3f36c64c46294e14eec7998ce219e23271c5f7558a6c9ba40d018e02339 1384e3f36c64c46294e14eec7998ce219e23271c5f7558a6c9ba40d018e02339
lib/codeql/swift/generated/Raw.qll fe51a0a1ba7ecae3338b3f776e5586a0f661083463cfc82c1884ef4971f7763c 65d637456c70a7b01b43301d7b9a19a4b35c53dbe6b792829bcb8d02b00a32e7
lib/codeql/swift/generated/Synth.qll 76e5b9ba4df278843acb8b513ce5796c28b8fdc89234c879c2a124c2a768b2e4 0d5076c1c4dad9bb4e2d5e13e8e62ddef96756f8fc5c028d7cc634d84c1da80b
lib/codeql/swift/generated/SynthConstructors.qll 1e03d6bb048432db4cd701cac70389307d64faf81eab6fa996c2107cac78075a 1e03d6bb048432db4cd701cac70389307d64faf81eab6fa996c2107cac78075a
lib/codeql/swift/generated/UnknownFile.qll 5922b351b55d5becac0c1ad67b8d601bcc9499dce9ee4093b607101e7e299104 5922b351b55d5becac0c1ad67b8d601bcc9499dce9ee4093b607101e7e299104
lib/codeql/swift/generated/UnknownLocation.qll 67b8605ff5aaa0f3a8588fee2527eba5ec4e322562159c9af3d53486b7954ee9 67b8605ff5aaa0f3a8588fee2527eba5ec4e322562159c9af3d53486b7954ee9
lib/codeql/swift/generated/UnspecifiedElement.qll 01182fee4d5c86b551e89c79d0d645f5e85c0aeeeae9dcafcbd7721c3eb3cc14 cb95ab2b13da080ada10e0a3bd1b00577541c4bfe699cbd19ef45f1e00e7c651
@@ -474,6 +476,7 @@ lib/codeql/swift/generated/expr/CollectionExpr.qll 40f0167cbf67bba45be184e9603f9
lib/codeql/swift/generated/expr/CollectionUpcastConversionExpr.qll 9925461069bd584492925baae30ab098d55ec552e557c6357e8bc82ea204d843 6462bd150d2b6dafbbb05c17e970c47e290cc1d1ae704e5ccb381800451a7188
lib/codeql/swift/generated/expr/ConditionalBridgeFromObjCExpr.qll 65bdf5e9a9e98569af93d2212b114c822e9809ad4a43b50e50e8face07268156 c20f1ff1fd6231e7691d50cc1ee0c36edd8ed3a58ce1cc378ce9e03e9423cb6e
lib/codeql/swift/generated/expr/ConditionalCheckedCastExpr.qll be657b986ae9a8ba929d3e5683d101e1a26e8d7995376ed68610477e87f48184 be657b986ae9a8ba929d3e5683d101e1a26e8d7995376ed68610477e87f48184
lib/codeql/swift/generated/expr/ConsumeExpr.qll 1b90630ffefdef29ef57ea1070b6e28580c6245f31e3c6209b5960f7c1409ab7 b0d484bdcd875121ceab93a2fc4af8d320997c1581250bbcd77a29e0cb1765f7
lib/codeql/swift/generated/expr/CopyExpr.qll a25970a0238df0ebcf63d437681b1ba3d5f750f0ab69d7c1bb9f3b600392dc90 4c64344d994a0b1fd6fbf39283d3d87423d2dd13893509b296fdbd280703ad04
lib/codeql/swift/generated/expr/CovariantFunctionConversionExpr.qll 4b48c9d01c5f67bd5a6d2ff609ac9bf87954298cd0719b5a951efb89146fcbe6 43626bf6760dfc8f49362d8f065a8f5339f822c8f76ff9be012b4471e20afde2
lib/codeql/swift/generated/expr/CovariantReturnConversionExpr.qll 0c8dffec9ed1f28902a9679ec29ba33b6a9225460180db923733ad3d14fbdd28 fee3ddce4a699c86770b2a9211e524f764ed9140860b7e6c58ca7f62566cd4ec
@@ -797,6 +800,8 @@ test/extractor-tests/generated/expr/CallExpr/MISSING_SOURCE.txt 66846d526b0bc432
test/extractor-tests/generated/expr/CaptureListExpr/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
test/extractor-tests/generated/expr/CoerceExpr/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
test/extractor-tests/generated/expr/ConditionalCheckedCastExpr/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
test/extractor-tests/generated/expr/CopyExpr/ConsumeExpr.ql 82c89019ed578c83dfa7c7bd04e52bb795facacfc2163c4757a5f43dbc8c7e0c 21a0f3b831daf6067977e3ad150cef085a72c775182e2e280e9bca22432640a6
test/extractor-tests/generated/expr/CopyExpr/ConsumeExpr_getType.ql 18017c131ec3425ec850963fde2239648b0fcb54abc498017bbb36d4f6c2f9f7 248bb50866bc75dad94d15a19aa30a00231abd996e613d4ba3a7d361707f75e6
test/extractor-tests/generated/expr/CopyExpr/CopyExpr.ql 2e80272756531b3d7c65d9efd9474927e5cea719813acb599b61526e1957b220 1982362701e058bd32d3f9dfafbee3770a5016008cc1330237eb102f8459b506
test/extractor-tests/generated/expr/CopyExpr/CopyExpr_getType.ql 33698df9758f9399a0a7492a8432399582d2d52699572ca550c0fcdad839336e 330bd731f686d534769f7fc08d04e60dec83bced96cf39845c4374fa0629eb53
test/extractor-tests/generated/expr/DeclRefExpr/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7

5
swift/ql/.gitattributes generated vendored
View File

@@ -98,6 +98,8 @@
/lib/codeql/swift/elements/expr/ConditionalBridgeFromObjCExprConstructor.qll linguist-generated
/lib/codeql/swift/elements/expr/ConditionalCheckedCastExpr.qll linguist-generated
/lib/codeql/swift/elements/expr/ConditionalCheckedCastExprConstructor.qll linguist-generated
/lib/codeql/swift/elements/expr/ConsumeExpr.qll linguist-generated
/lib/codeql/swift/elements/expr/ConsumeExprConstructor.qll linguist-generated
/lib/codeql/swift/elements/expr/CopyExpr.qll linguist-generated
/lib/codeql/swift/elements/expr/CopyExprConstructor.qll linguist-generated
/lib/codeql/swift/elements/expr/CovariantFunctionConversionExpr.qll linguist-generated
@@ -476,6 +478,7 @@
/lib/codeql/swift/generated/expr/CollectionUpcastConversionExpr.qll linguist-generated
/lib/codeql/swift/generated/expr/ConditionalBridgeFromObjCExpr.qll linguist-generated
/lib/codeql/swift/generated/expr/ConditionalCheckedCastExpr.qll linguist-generated
/lib/codeql/swift/generated/expr/ConsumeExpr.qll linguist-generated
/lib/codeql/swift/generated/expr/CopyExpr.qll linguist-generated
/lib/codeql/swift/generated/expr/CovariantFunctionConversionExpr.qll linguist-generated
/lib/codeql/swift/generated/expr/CovariantReturnConversionExpr.qll linguist-generated
@@ -799,6 +802,8 @@
/test/extractor-tests/generated/expr/CaptureListExpr/MISSING_SOURCE.txt linguist-generated
/test/extractor-tests/generated/expr/CoerceExpr/MISSING_SOURCE.txt linguist-generated
/test/extractor-tests/generated/expr/ConditionalCheckedCastExpr/MISSING_SOURCE.txt linguist-generated
/test/extractor-tests/generated/expr/CopyExpr/ConsumeExpr.ql linguist-generated
/test/extractor-tests/generated/expr/CopyExpr/ConsumeExpr_getType.ql linguist-generated
/test/extractor-tests/generated/expr/CopyExpr/CopyExpr.ql linguist-generated
/test/extractor-tests/generated/expr/CopyExpr/CopyExpr_getType.ql linguist-generated
/test/extractor-tests/generated/expr/DeclRefExpr/MISSING_SOURCE.txt linguist-generated

View File

@@ -91,6 +91,7 @@ import codeql.swift.elements.expr.CollectionExpr
import codeql.swift.elements.expr.CollectionUpcastConversionExpr
import codeql.swift.elements.expr.ConditionalBridgeFromObjCExpr
import codeql.swift.elements.expr.ConditionalCheckedCastExpr
import codeql.swift.elements.expr.ConsumeExpr
import codeql.swift.elements.expr.CopyExpr
import codeql.swift.elements.expr.CovariantFunctionConversionExpr
import codeql.swift.elements.expr.CovariantReturnConversionExpr

View File

@@ -0,0 +1,8 @@
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
/**
* This module provides a hand-modifiable wrapper around the generated class `ConsumeExpr`.
*/
private import codeql.swift.generated.expr.ConsumeExpr
class ConsumeExpr extends Generated::ConsumeExpr { }

View File

@@ -0,0 +1,14 @@
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
/**
* This module defines the hook used internally to tweak the characteristic predicate of
* `ConsumeExpr` synthesized instances.
* INTERNAL: Do not use.
*/
private import codeql.swift.generated.Raw
/**
* The characteristic predicate of `ConsumeExpr` synthesized instances.
* INTERNAL: Do not use.
*/
predicate constructConsumeExpr(Raw::ConsumeExpr id) { any() }

View File

@@ -1201,6 +1201,24 @@ private module Impl {
)
}
private Element getImmediateChildOfConsumeExpr(
ConsumeExpr e, int index, string partialPredicateCall
) {
exists(int b, int bExpr, int n, int nSubExpr |
b = 0 and
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
n = bExpr and
nSubExpr = n + 1 and
(
none()
or
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
or
index = n and result = e.getImmediateSubExpr() and partialPredicateCall = "SubExpr()"
)
)
}
private Element getImmediateChildOfCopyExpr(CopyExpr e, int index, string partialPredicateCall) {
exists(int b, int bExpr, int n, int nSubExpr |
b = 0 and
@@ -5094,6 +5112,8 @@ private module Impl {
or
result = getImmediateChildOfCaptureListExpr(e, index, partialAccessor)
or
result = getImmediateChildOfConsumeExpr(e, index, partialAccessor)
or
result = getImmediateChildOfCopyExpr(e, index, partialAccessor)
or
result = getImmediateChildOfDeclRefExpr(e, index, partialAccessor)

View File

@@ -1119,6 +1119,24 @@ module Raw {
*/
class CollectionExpr extends @collection_expr, Expr { }
/**
* INTERNAL: Do not use.
* An expression that forces value to be moved. In the example below, `consume` marks the move expression:
*
* ```
* let y = ...
* let x = consume y
* ```
*/
class ConsumeExpr extends @consume_expr, Expr {
override string toString() { result = "ConsumeExpr" }
/**
* Gets the sub expression of this consume expression.
*/
Expr getSubExpr() { consume_exprs(this, result) }
}
/**
* INTERNAL: Do not use.
* An expression that forces value to be copied. In the example below, `copy` marks the copy expression:

View File

@@ -279,6 +279,10 @@ module Synth {
TConditionalCheckedCastExpr(Raw::ConditionalCheckedCastExpr id) {
constructConditionalCheckedCastExpr(id)
} or
/**
* INTERNAL: Do not use.
*/
TConsumeExpr(Raw::ConsumeExpr id) { constructConsumeExpr(id) } or
/**
* INTERNAL: Do not use.
*/
@@ -1199,19 +1203,19 @@ module Synth {
*/
class TExpr =
TAnyTryExpr or TAppliedPropertyWrapperExpr or TApplyExpr or TAssignExpr or TBindOptionalExpr or
TCaptureListExpr or TClosureExpr or TCollectionExpr or TCopyExpr or TDeclRefExpr or
TDefaultArgumentExpr or TDiscardAssignmentExpr or TDotSyntaxBaseIgnoredExpr or
TDynamicTypeExpr or TEnumIsCaseExpr or TErrorExpr or TExplicitCastExpr or TForceValueExpr or
TIdentityExpr or TIfExpr or TImplicitConversionExpr or TInOutExpr or
TKeyPathApplicationExpr or TKeyPathDotExpr or TKeyPathExpr or TLazyInitializationExpr or
TLiteralExpr or TLookupExpr or TMakeTemporarilyEscapableExpr or TObjCSelectorExpr or
TOneWayExpr or TOpaqueValueExpr or TOpenExistentialExpr or TOptionalEvaluationExpr or
TOtherInitializerRefExpr or TOverloadedDeclRefExpr or TPackElementExpr or
TPackExpansionExpr or TPropertyWrapperValuePlaceholderExpr or
TRebindSelfInInitializerExpr or TSequenceExpr or TSingleValueStmtExpr or TSuperRefExpr or
TTapExpr or TTupleElementExpr or TTupleExpr or TTypeExpr or TUnresolvedDeclRefExpr or
TUnresolvedDotExpr or TUnresolvedMemberExpr or TUnresolvedPatternExpr or
TUnresolvedSpecializeExpr or TVarargExpansionExpr;
TCaptureListExpr or TClosureExpr or TCollectionExpr or TConsumeExpr or TCopyExpr or
TDeclRefExpr or TDefaultArgumentExpr or TDiscardAssignmentExpr or
TDotSyntaxBaseIgnoredExpr or TDynamicTypeExpr or TEnumIsCaseExpr or TErrorExpr or
TExplicitCastExpr or TForceValueExpr or TIdentityExpr or TIfExpr or
TImplicitConversionExpr or TInOutExpr or TKeyPathApplicationExpr or TKeyPathDotExpr or
TKeyPathExpr or TLazyInitializationExpr or TLiteralExpr or TLookupExpr or
TMakeTemporarilyEscapableExpr or TObjCSelectorExpr or TOneWayExpr or TOpaqueValueExpr or
TOpenExistentialExpr or TOptionalEvaluationExpr or TOtherInitializerRefExpr or
TOverloadedDeclRefExpr or TPackElementExpr or TPackExpansionExpr or
TPropertyWrapperValuePlaceholderExpr or TRebindSelfInInitializerExpr or TSequenceExpr or
TSingleValueStmtExpr or TSuperRefExpr or TTapExpr or TTupleElementExpr or TTupleExpr or
TTypeExpr or TUnresolvedDeclRefExpr or TUnresolvedDotExpr or TUnresolvedMemberExpr or
TUnresolvedPatternExpr or TUnresolvedSpecializeExpr or TVarargExpansionExpr;
/**
* INTERNAL: Do not use.
@@ -1864,6 +1868,13 @@ module Synth {
result = TConditionalCheckedCastExpr(e)
}
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TConsumeExpr`, if possible.
*/
cached
TConsumeExpr convertConsumeExprFromRaw(Raw::Element e) { result = TConsumeExpr(e) }
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TCopyExpr`, if possible.
@@ -3713,6 +3724,8 @@ module Synth {
or
result = convertCollectionExprFromRaw(e)
or
result = convertConsumeExprFromRaw(e)
or
result = convertCopyExprFromRaw(e)
or
result = convertDeclRefExprFromRaw(e)
@@ -4771,6 +4784,13 @@ module Synth {
e = TConditionalCheckedCastExpr(result)
}
/**
* INTERNAL: Do not use.
* Converts a synthesized `TConsumeExpr` to a raw DB element, if possible.
*/
cached
Raw::Element convertConsumeExprToRaw(TConsumeExpr e) { e = TConsumeExpr(result) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TCopyExpr` to a raw DB element, if possible.
@@ -6618,6 +6638,8 @@ module Synth {
or
result = convertCollectionExprToRaw(e)
or
result = convertConsumeExprToRaw(e)
or
result = convertCopyExprToRaw(e)
or
result = convertDeclRefExprToRaw(e)

View File

@@ -64,6 +64,7 @@ import codeql.swift.elements.expr.CoerceExprConstructor
import codeql.swift.elements.expr.CollectionUpcastConversionExprConstructor
import codeql.swift.elements.expr.ConditionalBridgeFromObjCExprConstructor
import codeql.swift.elements.expr.ConditionalCheckedCastExprConstructor
import codeql.swift.elements.expr.ConsumeExprConstructor
import codeql.swift.elements.expr.CopyExprConstructor
import codeql.swift.elements.expr.CovariantFunctionConversionExprConstructor
import codeql.swift.elements.expr.CovariantReturnConversionExprConstructor

View File

@@ -0,0 +1,48 @@
// generated by codegen/codegen.py
/**
* This module provides the generated definition of `ConsumeExpr`.
* INTERNAL: Do not import directly.
*/
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.expr.Expr
module Generated {
/**
* An expression that forces value to be moved. In the example below, `consume` marks the move expression:
*
* ```
* let y = ...
* let x = consume y
* ```
* INTERNAL: Do not reference the `Generated::ConsumeExpr` class directly.
* Use the subclass `ConsumeExpr`, where the following predicates are available.
*/
class ConsumeExpr extends Synth::TConsumeExpr, Expr {
override string getAPrimaryQlClass() { result = "ConsumeExpr" }
/**
* Gets the sub expression of this consume expression.
*
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
* behavior of both the `Immediate` and non-`Immediate` versions.
*/
Expr getImmediateSubExpr() {
result =
Synth::convertExprFromRaw(Synth::convertConsumeExprToRaw(this)
.(Raw::ConsumeExpr)
.getSubExpr())
}
/**
* Gets the sub expression of this consume expression.
*/
final Expr getSubExpr() {
exists(Expr immediate |
immediate = this.getImmediateSubExpr() and
if exists(this.getResolveStep()) then result = immediate else result = immediate.resolve()
)
}
}
}

View File

@@ -734,6 +734,7 @@ arguments( //dir=expr
| @capture_list_expr
| @closure_expr
| @collection_expr
| @consume_expr
| @copy_expr
| @decl_ref_expr
| @default_argument_expr
@@ -860,6 +861,11 @@ capture_list_expr_binding_decls( //dir=expr
| @dictionary_expr
;
consume_exprs( //dir=expr
unique int id: @consume_expr,
int sub_expr: @expr_or_none ref
);
copy_exprs( //dir=expr
unique int id: @copy_expr,
int sub_expr: @expr_or_none ref

View File

@@ -1,2 +1 @@
ERROR: This predicate overrides another predicate but is not marked as 'override' (/opt/GitHub/semmle-code/ql/swift/ql/lib/codeql/swift/generated/expr/BorrowExpr.qll:26,5-35,6)
ERROR: This predicate overrides another predicate but is not marked as 'override' (/opt/GitHub/semmle-code/ql/swift/ql/lib/codeql/swift/generated/Raw.qll:1894,5-1897,53)
| move_semantics.swift:5:9:5:17 | ConsumeExpr | hasType: | yes | getSubExpr: | move_semantics.swift:5:17:5:17 | x |

View File

@@ -0,0 +1,11 @@
// generated by codegen/codegen.py
import codeql.swift.elements
import TestUtils
from ConsumeExpr x, string hasType, Expr getSubExpr
where
toBeTested(x) and
not x.isUnknown() and
(if x.hasType() then hasType = "yes" else hasType = "no") and
getSubExpr = x.getSubExpr()
select x, "hasType:", hasType, "getSubExpr:", getSubExpr

View File

@@ -1,2 +1 @@
ERROR: This predicate overrides another predicate but is not marked as 'override' (/opt/GitHub/semmle-code/ql/swift/ql/lib/codeql/swift/generated/expr/BorrowExpr.qll:26,5-35,6)
ERROR: This predicate overrides another predicate but is not marked as 'override' (/opt/GitHub/semmle-code/ql/swift/ql/lib/codeql/swift/generated/Raw.qll:1894,5-1897,53)
| move_semantics.swift:5:9:5:17 | ConsumeExpr | Int |

View File

@@ -0,0 +1,7 @@
// generated by codegen/codegen.py
import codeql.swift.elements
import TestUtils
from ConsumeExpr x
where toBeTested(x) and not x.isUnknown()
select x, x.getType()

View File

@@ -2,3 +2,4 @@
let x = 42
let _ = copy x
let _ = consume x

View File

@@ -1338,3 +1338,15 @@ class CopyExpr(Expr):
```
"""
sub_expr: Expr | child
@qltest.test_with(CopyExpr)
class ConsumeExpr(Expr):
"""
An expression that forces value to be moved. In the example below, `consume` marks the move expression:
```
let y = ...
let x = consume y
```
"""
sub_expr: Expr | child