Skip to content

Commit 7bea187

Browse files
authored
Merge pull request github#13857 from github/alexdenisov/unresolved-dot-exprs-patterns
Swift: SubExpr may yield unresolved nodes in certain cases while MatchedExpr is always resolved
2 parents 0bd87f9 + 9d643ae commit 7bea187

File tree

6 files changed

+118
-23
lines changed

6 files changed

+118
-23
lines changed

swift/extractor/translators/PatternTranslator.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ codeql::IsPattern PatternTranslator::translateIsPattern(const swift::IsPattern&
5959

6060
codeql::ExprPattern PatternTranslator::translateExprPattern(const swift::ExprPattern& pattern) {
6161
auto entry = dispatcher.createEntry(pattern);
62-
entry.sub_expr = dispatcher.fetchLabel(pattern.getSubExpr());
62+
if (auto match = pattern.getMatchExpr()) {
63+
entry.sub_expr = dispatcher.fetchLabel(match);
64+
} else {
65+
entry.sub_expr = dispatcher.fetchLabel(pattern.getSubExpr());
66+
}
6367
return entry;
6468
}
6569

swift/ql/test/extractor-tests/patterns/CONSISTENCY/CfgConsistency.expected

Lines changed: 0 additions & 2 deletions
This file was deleted.

swift/ql/test/library-tests/ast/CONSISTENCY/CfgConsistency.expected

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,3 @@ multipleSuccessors
88
deadEnd
99
| cfg.swift:33:49:33:60 | call to isZero(x:) |
1010
| cfg.swift:144:18:144:34 | ... .&&(_:_:) ... |
11-
| patterns.swift:16:10:16:14 | =~ ... |
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
| patterns.swift:16:12:16:12 | OverloadedDeclRefExpr | OverloadedDeclRefExpr |

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

Lines changed: 80 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -723,17 +723,32 @@ cfg.swift:
723723
# 143| getResult(): [BooleanLiteralExpr] true
724724
# 141| getLabel(0): [CaseLabelItem] =~ ...
725725
# 141| getPattern(): [ExprPattern] =~ ...
726-
# 141| getSubExpr(): [IntegerLiteralExpr] 0
726+
# 141| getSubExpr(): [BinaryExpr] ... ~=(_:_:) ...
727+
# 141| getFunction(): [DeclRefExpr] ~=(_:_:)
728+
# 141| getArgument(0): [Argument] : 0
729+
# 141| getExpr(): [IntegerLiteralExpr] 0
730+
# 141| getArgument(1): [Argument] : $match
731+
# 141| getExpr(): [DeclRefExpr] $match
727732
# 141| getLabel(1): [CaseLabelItem] =~ ...
728733
# 141| getPattern(): [ExprPattern] =~ ...
729-
# 141| getSubExpr(): [IntegerLiteralExpr] 1
734+
# 141| getSubExpr(): [BinaryExpr] ... ~=(_:_:) ...
735+
# 141| getFunction(): [DeclRefExpr] ~=(_:_:)
736+
# 141| getArgument(0): [Argument] : 1
737+
# 141| getExpr(): [IntegerLiteralExpr] 1
738+
# 141| getArgument(1): [Argument] : $match
739+
# 141| getExpr(): [DeclRefExpr] $match
730740
# 144| getCase(1): [CaseStmt] case ...
731741
# 145| getBody(): [BraceStmt] { ... }
732742
# 145| getElement(0): [ReturnStmt] return ...
733743
# 145| getResult(): [BooleanLiteralExpr] true
734744
# 144| getLabel(0): [CaseLabelItem] =~ ... where ...
735745
# 144| getPattern(): [ExprPattern] =~ ...
736-
# 144| getSubExpr(): [DeclRefExpr] x
746+
# 144| getSubExpr(): [BinaryExpr] ... ~=(_:_:) ...
747+
# 144| getFunction(): [DeclRefExpr] ~=(_:_:)
748+
# 144| getArgument(0): [Argument] : x
749+
# 144| getExpr(): [DeclRefExpr] x
750+
# 144| getArgument(1): [Argument] : $match
751+
# 144| getExpr(): [DeclRefExpr] $match
737752
# 144| getGuard(): [BinaryExpr] ... .&&(_:_:) ...
738753
# 144| getFunction(): [MethodLookupExpr] .&&(_:_:)
739754
# 144| getBase(): [TypeExpr] Bool.Type
@@ -819,6 +834,12 @@ cfg.swift:
819834
# 158| getElse(): [BraceStmt] { ... }
820835
# 159| getElement(0): [ReturnStmt] return ...
821836
# 159| getResult(): [BooleanLiteralExpr] false
837+
# 141| [ConcreteVarDecl] $match
838+
# 141| Type = Int
839+
# 141| [ConcreteVarDecl] $match
840+
# 141| Type = Int
841+
# 144| [ConcreteVarDecl] $match
842+
# 144| Type = Int
822843
# 156| [ConcreteVarDecl] x
823844
# 156| Type = (Int)
824845
# 163| [NamedFunction] testDefer(x:)
@@ -5652,10 +5673,20 @@ patterns.swift:
56525673
# 16| getElement(0): [StringLiteralExpr] expr
56535674
# 16| getLabel(0): [CaseLabelItem] =~ ...
56545675
# 16| getPattern(): [ExprPattern] =~ ...
5655-
# 16| getSubExpr(): [SequenceExpr] SequenceExpr
5656-
# 16| getElement(0): [IntegerLiteralExpr] 1
5657-
# 16| getElement(1): [OverloadedDeclRefExpr] OverloadedDeclRefExpr
5658-
# 16| getElement(2): [IntegerLiteralExpr] 2
5676+
# 16| getSubExpr(): [BinaryExpr] ... ~=(_:_:) ...
5677+
# 16| getFunction(): [DeclRefExpr] ~=(_:_:)
5678+
# 16| getArgument(0): [Argument] : ... .+(_:_:) ...
5679+
# 16| getExpr(): [BinaryExpr] ... .+(_:_:) ...
5680+
# 16| getFunction(): [MethodLookupExpr] .+(_:_:)
5681+
# 16| getBase(): [TypeExpr] Int.Type
5682+
# 16| getTypeRepr(): [TypeRepr] Int
5683+
# 16| getMethodRef(): [DeclRefExpr] +(_:_:)
5684+
# 16| getArgument(0): [Argument] : 1
5685+
# 16| getExpr(): [IntegerLiteralExpr] 1
5686+
# 16| getArgument(1): [Argument] : 2
5687+
# 16| getExpr(): [IntegerLiteralExpr] 2
5688+
# 16| getArgument(1): [Argument] : $match
5689+
# 16| getExpr(): [DeclRefExpr] $match
56595690
# 17| getCase(1): [CaseStmt] case ...
56605691
# 17| getBody(): [BraceStmt] { ... }
56615692
# 17| getElement(0): [StringLiteralExpr]
@@ -5758,6 +5789,8 @@ patterns.swift:
57585789
# 12| Type = Int
57595790
# 12| [ConcreteVarDecl] yy
57605791
# 12| Type = Int
5792+
# 16| [ConcreteVarDecl] $match
5793+
# 16| Type = Int
57615794
# 28| [ConcreteVarDecl] i
57625795
# 28| Type = Int
57635796
# 28| [ConcreteVarDecl] s
@@ -5814,7 +5847,12 @@ patterns.swift:
58145847
# 58| getElement(0): [ConditionElement] (...) = ...
58155848
# 58| getPattern(): [TuplePattern] (...)
58165849
# 58| getElement(0): [ExprPattern] =~ ...
5817-
# 58| getSubExpr(): [DeclRefExpr] a
5850+
# 58| getSubExpr(): [BinaryExpr] ... ~=(_:_:) ...
5851+
# 58| getFunction(): [DeclRefExpr] ~=(_:_:)
5852+
# 58| getArgument(0): [Argument] : a
5853+
# 58| getExpr(): [DeclRefExpr] a
5854+
# 58| getArgument(1): [Argument] : $match
5855+
# 58| getExpr(): [DeclRefExpr] $match
58185856
# 58| getElement(1): [NamedPattern] b
58195857
# 58| getElement(1).getFullyUnresolved(): [BindingPattern] let ...
58205858
# 58| getElement(2): [NamedPattern] c
@@ -5835,7 +5873,12 @@ patterns.swift:
58355873
# 61| getElement(0): [StringLiteralExpr] equals c
58365874
# 61| getLabel(0): [CaseLabelItem] =~ ...
58375875
# 61| getPattern(): [ExprPattern] =~ ...
5838-
# 61| getSubExpr(): [DeclRefExpr] c
5876+
# 61| getSubExpr(): [BinaryExpr] ... ~=(_:_:) ...
5877+
# 61| getFunction(): [DeclRefExpr] ~=(_:_:)
5878+
# 61| getArgument(0): [Argument] : c
5879+
# 61| getExpr(): [DeclRefExpr] c
5880+
# 61| getArgument(1): [Argument] : $match
5881+
# 61| getExpr(): [DeclRefExpr] $match
58395882
# 62| getCase(1): [CaseStmt] case ...
58405883
# 62| getBody(): [BraceStmt] { ... }
58415884
# 62| getElement(0): [StringLiteralExpr] binds c
@@ -5851,8 +5894,12 @@ patterns.swift:
58515894
# 57| Type = Int
58525895
# 57| [ConcreteVarDecl] c
58535896
# 57| Type = Int
5897+
# 58| [ConcreteVarDecl] $match
5898+
# 58| Type = Int
58545899
# 58| [ConcreteVarDecl] b
58555900
# 58| Type = Int
5901+
# 61| [ConcreteVarDecl] $match
5902+
# 61| Type = Int
58565903
# 62| [ConcreteVarDecl] c
58575904
# 62| Type = Int
58585905
# 67| [NamedFunction] source()
@@ -6766,7 +6813,12 @@ statements.swift:
67666813
# 56| getElement(1): [FallthroughStmt] fallthrough
67676814
# 54| getLabel(0): [CaseLabelItem] =~ ...
67686815
# 54| getPattern(): [ExprPattern] =~ ...
6769-
# 54| getSubExpr(): [IntegerLiteralExpr] 1
6816+
# 54| getSubExpr(): [BinaryExpr] ... ~=(_:_:) ...
6817+
# 54| getFunction(): [DeclRefExpr] ~=(_:_:)
6818+
# 54| getArgument(0): [Argument] : 1
6819+
# 54| getExpr(): [IntegerLiteralExpr] 1
6820+
# 54| getArgument(1): [Argument] : $match
6821+
# 54| getExpr(): [DeclRefExpr] $match
67706822
# 57| getCase(1): [CaseStmt] case ...
67716823
# 58| getBody(): [BraceStmt] { ... }
67726824
# 58| getElement(0): [CallExpr] call to print(_:separator:terminator:)
@@ -6783,10 +6835,20 @@ statements.swift:
67836835
# 59| getElement(1): [BreakStmt] break
67846836
# 57| getLabel(0): [CaseLabelItem] =~ ...
67856837
# 57| getPattern(): [ExprPattern] =~ ...
6786-
# 57| getSubExpr(): [IntegerLiteralExpr] 5
6838+
# 57| getSubExpr(): [BinaryExpr] ... ~=(_:_:) ...
6839+
# 57| getFunction(): [DeclRefExpr] ~=(_:_:)
6840+
# 57| getArgument(0): [Argument] : 5
6841+
# 57| getExpr(): [IntegerLiteralExpr] 5
6842+
# 57| getArgument(1): [Argument] : $match
6843+
# 57| getExpr(): [DeclRefExpr] $match
67876844
# 57| getLabel(1): [CaseLabelItem] =~ ...
67886845
# 57| getPattern(): [ExprPattern] =~ ...
6789-
# 57| getSubExpr(): [IntegerLiteralExpr] 10
6846+
# 57| getSubExpr(): [BinaryExpr] ... ~=(_:_:) ...
6847+
# 57| getFunction(): [DeclRefExpr] ~=(_:_:)
6848+
# 57| getArgument(0): [Argument] : 10
6849+
# 57| getExpr(): [IntegerLiteralExpr] 10
6850+
# 57| getArgument(1): [Argument] : $match
6851+
# 57| getExpr(): [DeclRefExpr] $match
67906852
# 60| getCase(2): [CaseStmt] case ...
67916853
# 61| getBody(): [BraceStmt] { ... }
67926854
# 61| getElement(0): [CallExpr] call to print(_:separator:terminator:)
@@ -6802,6 +6864,12 @@ statements.swift:
68026864
# 61| getExpr(): [DefaultArgumentExpr] default terminator
68036865
# 60| getLabel(0): [CaseLabelItem] _
68046866
# 60| getPattern(): [AnyPattern] _
6867+
# 54| [ConcreteVarDecl] $match
6868+
# 54| Type = Int
6869+
# 57| [ConcreteVarDecl] $match
6870+
# 57| Type = Int
6871+
# 57| [ConcreteVarDecl] $match
6872+
# 57| Type = Int
68056873
# 64| [TopLevelCodeDecl] { ... }
68066874
# 64| getBody(): [BraceStmt] { ... }
68076875
# 64| getElement(0): [PatternBindingDecl] var ... = ...

swift/ql/test/library-tests/controlflow/graph/Cfg.expected

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,26 +1458,44 @@ cfg.swift:
14581458
# 141| case ...
14591459
#-----| -> =~ ...
14601460

1461-
# 141| 0
1461+
# 141| $match
1462+
#-----| -> ... ~=(_:_:) ...
1463+
1464+
# 141| ... ~=(_:_:) ...
14621465
#-----| -> =~ ...
14631466

1467+
# 141| 0
1468+
#-----| -> $match
1469+
14641470
# 141| =~ ...
1465-
#-----| -> 0
1471+
#-----| -> ~=(_:_:)
14661472

14671473
# 141| =~ ...
14681474
#-----| no-match -> =~ ...
14691475
#-----| match -> true
14701476

1471-
# 141| 1
1477+
# 141| ~=(_:_:)
1478+
#-----| -> 0
1479+
1480+
# 141| $match
1481+
#-----| -> ... ~=(_:_:) ...
1482+
1483+
# 141| ... ~=(_:_:) ...
14721484
#-----| -> =~ ...
14731485

1486+
# 141| 1
1487+
#-----| -> $match
1488+
14741489
# 141| =~ ...
1475-
#-----| -> 1
1490+
#-----| -> ~=(_:_:)
14761491

14771492
# 141| =~ ...
14781493
#-----| match -> true
14791494
#-----| no-match -> case ...
14801495

1496+
# 141| ~=(_:_:)
1497+
#-----| -> 1
1498+
14811499
# 142| return ...
14821500
#-----| return -> exit patterns(x:) (normal)
14831501

@@ -1487,16 +1505,25 @@ cfg.swift:
14871505
# 144| case ...
14881506
#-----| -> =~ ... where ...
14891507

1508+
# 144| $match
1509+
#-----| -> ... ~=(_:_:) ...
1510+
1511+
# 144| ... ~=(_:_:) ...
1512+
#-----| -> =~ ...
1513+
14901514
# 144| =~ ...
14911515
#-----| match, no-match -> ... .&&(_:_:) ...
14921516
#-----| no-match -> case ...
14931517

14941518
# 144| x
1495-
#-----| -> =~ ...
1519+
#-----| -> $match
14961520

1497-
# 144| =~ ... where ...
1521+
# 144| ~=(_:_:)
14981522
#-----| -> x
14991523

1524+
# 144| =~ ... where ...
1525+
#-----| -> ~=(_:_:)
1526+
15001527
# 144| ... .&&(_:_:) ...
15011528

15021529
# 146| _

0 commit comments

Comments
 (0)