Skip to content

Commit c2f2522

Browse files
authored
Merge pull request #19490 from github/redsun82/swift-type-value-expr-cfg
Swift: add new `TypeValueExpr` to CFG
2 parents ef4c921 + 4709eac commit c2f2522

File tree

9 files changed

+232
-66
lines changed

9 files changed

+232
-66
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* `TypeValueExpr` experimental AST leaf is now implemented in the control flow library

swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll

+4
Original file line numberDiff line numberDiff line change
@@ -1884,6 +1884,10 @@ module Exprs {
18841884
}
18851885
}
18861886

1887+
private class TypeValueTree extends AstLeafTree {
1888+
override TypeValueExpr ast;
1889+
}
1890+
18871891
module Conversions {
18881892
class ConversionOrIdentity =
18891893
Synth::TIdentityExpr or Synth::TExplicitCastExpr or Synth::TImplicitConversionExpr or
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
| cfg.swift:591:13:591:13 | missing type from TypeRepr | UnspecifiedElement |
2+
| cfg.swift:595:13:595:13 | missing type from TypeRepr | UnspecifiedElement |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
| cfg.swift:591:13:591:13 | missing type from TypeRepr |
2+
| cfg.swift:595:13:595:13 | missing type from TypeRepr |

swift/ql/test/library-tests/ast/PrintAst.expected

+111-29
Original file line numberDiff line numberDiff line change
@@ -521,15 +521,15 @@ cfg.swift:
521521
# 113| Type = Int
522522
# 114| getVariable(4): [ConcreteVarDecl] n4
523523
# 114| Type = Int
524-
# 116| getVariable(5): [ConcreteVarDecl] n5
524+
# 115| getVariable(5): [ConcreteVarDecl] n5
525+
# 115| Type = Int
526+
# 116| getVariable(6): [ConcreteVarDecl] n6
525527
# 116| Type = Int
526-
# 117| getVariable(6): [ConcreteVarDecl] n6
527-
# 117| Type = Int
528-
# 118| getVariable(7): [ConcreteVarDecl] n7
528+
# 118| getVariable(7): [ConcreteVarDecl] n8
529529
# 118| Type = Int
530-
# 119| getVariable(8): [ConcreteVarDecl] n8
531-
# 119| Type = Int
532-
# 121| getVariable(9): [ConcreteVarDecl] n9
530+
# 120| getVariable(8): [ConcreteVarDecl] n9
531+
# 120| Type = Int
532+
# 121| getVariable(9): [ConcreteVarDecl] n7
533533
# 121| Type = Int
534534
# 122| getVariable(10): [ConcreteVarDecl] n10
535535
# 122| Type = Int
@@ -584,33 +584,33 @@ cfg.swift:
584584
# 114| getBase().getFullyConverted(): [DotSelfExpr] .self
585585
# 114| getMethodRef(): [DeclRefExpr] getMyInt()
586586
# 114| getPattern(0): [NamedPattern] n4
587-
# 116| getElement(5): [PatternBindingDecl] var ... = ...
587+
# 115| getElement(5): [PatternBindingDecl] var ... = ...
588+
# 115| getInit(0): [MemberRefExpr] .myInt
589+
# 115| getBase(): [DeclRefExpr] param
590+
# 115| getPattern(0): [NamedPattern] n5
591+
# 116| getElement(6): [PatternBindingDecl] var ... = ...
588592
# 116| getInit(0): [MemberRefExpr] .myInt
589593
# 116| getBase(): [DeclRefExpr] param
590-
# 116| getPattern(0): [NamedPattern] n5
591-
# 117| getElement(6): [PatternBindingDecl] var ... = ...
592-
# 117| getInit(0): [MemberRefExpr] .myInt
593-
# 117| getBase(): [DeclRefExpr] param
594-
# 117| getBase().getFullyConverted(): [DotSelfExpr] .self
595-
# 117| getPattern(0): [NamedPattern] n6
594+
# 116| getBase().getFullyConverted(): [DotSelfExpr] .self
595+
# 116| getPattern(0): [NamedPattern] n6
596596
# 118| getElement(7): [PatternBindingDecl] var ... = ...
597597
# 118| getInit(0): [CallExpr] call to getMyInt()
598598
# 118| getFunction(): [MethodLookupExpr] .getMyInt()
599599
# 118| getBase(): [DeclRefExpr] param
600+
# 118| getBase().getFullyConverted(): [DotSelfExpr] .self
600601
# 118| getMethodRef(): [DeclRefExpr] getMyInt()
601-
# 118| getPattern(0): [NamedPattern] n7
602-
# 119| getElement(8): [PatternBindingDecl] var ... = ...
603-
# 119| getInit(0): [CallExpr] call to getMyInt()
604-
# 119| getFunction(): [MethodLookupExpr] .getMyInt()
605-
# 119| getBase(): [DeclRefExpr] param
606-
# 119| getBase().getFullyConverted(): [DotSelfExpr] .self
607-
# 119| getMethodRef(): [DeclRefExpr] getMyInt()
608-
# 119| getPattern(0): [NamedPattern] n8
602+
# 118| getPattern(0): [NamedPattern] n8
603+
# 120| getElement(8): [PatternBindingDecl] var ... = ...
604+
# 120| getInit(0): [MemberRefExpr] .myInt
605+
# 120| getBase(): [DeclRefExpr] inoutParam
606+
# 120| getBase().getFullyConverted(): [LoadExpr] (C) ...
607+
# 120| getPattern(0): [NamedPattern] n9
609608
# 121| getElement(9): [PatternBindingDecl] var ... = ...
610-
# 121| getInit(0): [MemberRefExpr] .myInt
611-
# 121| getBase(): [DeclRefExpr] inoutParam
612-
# 121| getBase().getFullyConverted(): [LoadExpr] (C) ...
613-
# 121| getPattern(0): [NamedPattern] n9
609+
# 121| getInit(0): [CallExpr] call to getMyInt()
610+
# 121| getFunction(): [MethodLookupExpr] .getMyInt()
611+
# 121| getBase(): [DeclRefExpr] param
612+
# 121| getMethodRef(): [DeclRefExpr] getMyInt()
613+
# 121| getPattern(0): [NamedPattern] n7
614614
# 122| getElement(10): [PatternBindingDecl] var ... = ...
615615
# 122| getInit(0): [MemberRefExpr] .myInt
616616
# 122| getBase(): [DeclRefExpr] inoutParam
@@ -3307,11 +3307,13 @@ cfg.swift:
33073307
# 533| getBase().getFullyConverted(): [LoadExpr] (AsyncStream<Int>) ...
33083308
#-----| getMethodRef(): [DeclRefExpr] makeAsyncIterator()
33093309
# 533| getPattern(0): [NamedPattern] $i$generator
3310-
# 533| getNextCall(): [CallExpr] call to next()
3311-
# 533| getFunction(): [MethodLookupExpr] .next()
3310+
# 533| getNextCall(): [CallExpr] call to next(isolation:)
3311+
# 533| getFunction(): [MethodLookupExpr] .next(isolation:)
33123312
# 533| getBase(): [DeclRefExpr] $i$generator
33133313
# 533| getBase().getFullyConverted(): [InOutExpr] &...
3314-
#-----| getMethodRef(): [DeclRefExpr] next()
3314+
#-----| getMethodRef(): [DeclRefExpr] next(isolation:)
3315+
# 533| getArgument(0): [Argument] isolation: CurrentContextIsolationExpr
3316+
# 533| getExpr(): [CurrentContextIsolationExpr] CurrentContextIsolationExpr
33153317
# 533| getNextCall().getFullyConverted(): [AwaitExpr] await ...
33163318
# 533| getBody(): [BraceStmt] { ... }
33173319
# 534| getElement(0): [CallExpr] call to print(_:separator:terminator:)
@@ -3326,6 +3328,7 @@ cfg.swift:
33263328
# 534| getArgument(2): [Argument] terminator: default terminator
33273329
# 534| getExpr(): [DefaultArgumentExpr] default terminator
33283330
# 525| [NilLiteralExpr] nil
3331+
# 533| [NilLiteralExpr] nil
33293332
# 538| [NamedFunction] testNilCoalescing(x:)
33303333
# 538| InterfaceType = (Int?) -> Int
33313334
# 538| getParam(0): [ParamDecl] x
@@ -3543,6 +3546,85 @@ cfg.swift:
35433546
# 582| Type = Int
35443547
# 587| [Comment] // ---
35453548
# 587|
3549+
# 589| [Comment] //codeql-extractor-options: -enable-experimental-feature ValueGenerics -disable-availability-checking
3550+
# 589|
3551+
# 590| [StructDecl] ValueGenericsStruct
3552+
# 590| getGenericTypeParam(0): [GenericTypeParamDecl] N
3553+
# 591| getMember(0): [PatternBindingDecl] var ... = ...
3554+
# 591| getInit(0): [TypeValueExpr] TypeValueExpr
3555+
# 591| getTypeRepr(): (no string representation)
3556+
# 591| getPattern(0): [NamedPattern] x
3557+
# 591| getMember(1): [ConcreteVarDecl] x
3558+
# 591| Type = Int
3559+
# 591| getAccessor(0): [Accessor] get
3560+
# 591| InterfaceType = <let N : Int> (ValueGenericsStruct<N>) -> () -> Int
3561+
# 591| getSelfParam(): [ParamDecl] self
3562+
# 591| Type = ValueGenericsStruct<N>
3563+
# 591| getBody(): [BraceStmt] { ... }
3564+
#-----| getElement(0): [ReturnStmt] return ...
3565+
#-----| getResult(): [MemberRefExpr] .x
3566+
#-----| getBase(): [DeclRefExpr] self
3567+
# 591| getAccessor(1): [Accessor] set
3568+
# 591| InterfaceType = <let N : Int> (inout ValueGenericsStruct<N>) -> (Int) -> ()
3569+
# 591| getSelfParam(): [ParamDecl] self
3570+
# 591| Type = ValueGenericsStruct<N>
3571+
# 591| getParam(0): [ParamDecl] value
3572+
# 591| Type = Int
3573+
# 591| getBody(): [BraceStmt] { ... }
3574+
#-----| getElement(0): [AssignExpr] ... = ...
3575+
#-----| getDest(): [MemberRefExpr] .x
3576+
#-----| getBase(): [DeclRefExpr] self
3577+
#-----| getSource(): [DeclRefExpr] value
3578+
# 591| getAccessor(2): [Accessor] _modify
3579+
# 591| InterfaceType = <let N : Int> (inout ValueGenericsStruct<N>) -> () -> ()
3580+
# 591| getSelfParam(): [ParamDecl] self
3581+
# 591| Type = ValueGenericsStruct<N>
3582+
# 591| getBody(): [BraceStmt] { ... }
3583+
# 591| getElement(0): [YieldStmt] yield ...
3584+
#-----| getResult(0): [MemberRefExpr] .x
3585+
#-----| getBase(): [DeclRefExpr] self
3586+
#-----| getResult(0).getFullyConverted(): [InOutExpr] &...
3587+
# 590| getMember(2): [Initializer] ValueGenericsStruct<N>.init(x:)
3588+
# 590| InterfaceType = <let N : Int> (ValueGenericsStruct<N>.Type) -> (Int) -> ValueGenericsStruct<N>
3589+
# 590| getSelfParam(): [ParamDecl] self
3590+
# 590| Type = ValueGenericsStruct<N>
3591+
# 590| getParam(0): [ParamDecl] x
3592+
# 590| Type = Int
3593+
# 590| getMember(3): [Initializer] ValueGenericsStruct<N>.init()
3594+
# 590| InterfaceType = <let N : Int> (ValueGenericsStruct<N>.Type) -> () -> ValueGenericsStruct<N>
3595+
# 590| getSelfParam(): [ParamDecl] self
3596+
# 590| Type = ValueGenericsStruct<N>
3597+
# 590| getBody(): [BraceStmt] { ... }
3598+
# 590| getElement(0): [ReturnStmt] return
3599+
# 591| [UnspecifiedElement] missing type from TypeRepr
3600+
# 594| [NamedFunction] valueGenericsFn(_:)
3601+
# 594| InterfaceType = <let N : Int> (ValueGenericsStruct<N>) -> ()
3602+
# 594| getGenericTypeParam(0): [GenericTypeParamDecl] N
3603+
# 594| getParam(0): [ParamDecl] value
3604+
# 594| Type = ValueGenericsStruct<N>
3605+
# 594| getBody(): [BraceStmt] { ... }
3606+
# 595| getVariable(0): [ConcreteVarDecl] x
3607+
# 595| Type = Int
3608+
# 595| getElement(0): [PatternBindingDecl] var ... = ...
3609+
# 595| getInit(0): [TypeValueExpr] TypeValueExpr
3610+
# 595| getTypeRepr(): (no string representation)
3611+
# 595| getPattern(0): [NamedPattern] x
3612+
# 596| getElement(1): [CallExpr] call to print(_:separator:terminator:)
3613+
# 596| getFunction(): [DeclRefExpr] print(_:separator:terminator:)
3614+
# 596| getArgument(0): [Argument] : [...]
3615+
# 596| getExpr(): [VarargExpansionExpr] [...]
3616+
# 596| getSubExpr(): [ArrayExpr] [...]
3617+
# 596| getElement(0): [DeclRefExpr] x
3618+
# 596| getElement(0).getFullyConverted(): [ErasureExpr] (Any) ...
3619+
# 596| getSubExpr(): [LoadExpr] (Int) ...
3620+
# 596| getArgument(1): [Argument] separator: default separator
3621+
# 596| getExpr(): [DefaultArgumentExpr] default separator
3622+
# 596| getArgument(2): [Argument] terminator: default terminator
3623+
# 596| getExpr(): [DefaultArgumentExpr] default terminator
3624+
# 597| getElement(2): [AssignExpr] ... = ...
3625+
# 597| getDest(): [DiscardAssignmentExpr] _
3626+
# 597| getSource(): [DeclRefExpr] value
3627+
# 595| [UnspecifiedElement] missing type from TypeRepr
35463628
declarations.swift:
35473629
# 1| [StructDecl] Foo
35483630
# 2| getMember(0): [PatternBindingDecl] var ... = ...

swift/ql/test/library-tests/ast/cfg.swift

+13-2
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,13 @@ func testMemberRef(param : C, inoutParam : inout C, opt : C?) {
112112
let n2 = c.self.myInt
113113
let n3 = c.getMyInt()
114114
let n4 = c.self.getMyInt()
115-
116115
let n5 = param.myInt
117116
let n6 = param.self.myInt
118-
let n7 = param.getMyInt()
117+
119118
let n8 = param.self.getMyInt()
120119

121120
let n9 = inoutParam.myInt
121+
let n7 = param.getMyInt()
122122
let n10 = inoutParam.self.myInt
123123
let n11 = inoutParam.getMyInt()
124124
let n12 = inoutParam.self.getMyInt()
@@ -585,3 +585,14 @@ func singleStmtExpr(_ x: Int) {
585585
let b = if (x < 42) { 1 } else { 2 }
586586
}
587587
// ---
588+
589+
//codeql-extractor-options: -enable-experimental-feature ValueGenerics -disable-availability-checking
590+
struct ValueGenericsStruct<let N: Int> {
591+
var x = N;
592+
}
593+
594+
func valueGenericsFn<let N: Int>(_ value: ValueGenericsStruct<N>) {
595+
var x = N;
596+
print(x);
597+
_ = value;
598+
}

0 commit comments

Comments
 (0)