Commit Graph

59 Commits

Author SHA1 Message Date
Tom Hvitved
e88d7baa7d Rust: Apply inherent method prioritization inside type inference loop 2025-07-01 10:17:26 +02:00
Kasper Svendsen
9d2dd782d9 Merge remote-tracking branch 'github/main' into kaspersv/overlay-java-annotations 2025-06-26 13:18:25 +02:00
github-actions[bot]
6972c7a872 Post-release preparation for codeql-cli-2.22.1 2025-06-24 12:55:14 +00:00
github-actions[bot]
3e074b2425 Release preparation for version 2.22.1 2025-06-24 08:55:31 +00:00
Kasper Svendsen
81b677a2d9 rename overlay[caller] to overlay[caller?] 2025-06-24 10:25:07 +02:00
Kasper Svendsen
c207cfdeb7 Overlay: Add overlay annotations to Java & shared libraries 2025-06-24 10:25:06 +02:00
Simon Friis Vindum
60c27f8c30 Rust: Address PR feedback 2025-06-23 13:11:15 +02:00
Simon Friis Vindum
a367388326 Shared: Refactor type inference and expose SatisfiesConstraint module 2025-06-23 12:50:45 +02:00
Tom Hvitved
70c3ae4609 Merge pull request #19727 from hvitved/shared/type-inference-doc
Shared: Add elaborate QL doc to `TypeInference.qll`
2025-06-12 16:31:50 +02:00
Tom Hvitved
1ec376073b Update shared/typeinference/codeql/typeinference/internal/TypeInference.qll
Co-authored-by: Geoffrey White <40627776+geoffw0@users.noreply.github.com>
2025-06-12 12:14:52 +02:00
Tom Hvitved
18392a07ce Rust: Also apply adjustedAccessType in RelevantAccess 2025-06-11 15:00:35 +02:00
Tom Hvitved
eeaccc5a9a Update shared/typeinference/codeql/typeinference/internal/TypeInference.qll
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-11 12:48:06 +02:00
Tom Hvitved
b90e8679a9 Shared: Add elaborate QL doc to TypeInference.qll 2025-06-11 12:38:04 +02:00
Tom Hvitved
3c9cbf186e Rust: Fix bad join in typeParametersEqualFromIndex
Before
```
Pipeline standard for TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndex/6#6471ea48@9c099swn was evaluated in 375 iterations totaling 154ms (delta sizes total: 0).
        16307861   ~1%    {5} r1 = JOIN `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev_delta` WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypes/3#3b2e26a8#prev` ON FIRST 1 OUTPUT Rhs.2, Lhs.1, Lhs.0, Lhs.2, Rhs.1

           37736   ~1%    {7} r2 = JOIN r1 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789_0312#join_rhs` ON FIRST 2 OUTPUT Lhs.2, Lhs.3, Lhs.4, Lhs.0, Rhs.2, Rhs.3, _
                          {6}    | REWRITE WITH Tmp.6 := 0, TEST InOut.5 != Tmp.6 KEEPING 6
               0   ~0%    {7}    | SCAN OUTPUT In.0, In.2, In.3, In.4, In.1, _, In.5
               0   ~0%    {7}    | REWRITE WITH Tmp.5 := 1, Out.5 := (InOut.6 - Tmp.5)
               0   ~0%    {6}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndex/6#6471ea48#prev` ON FIRST 6 OUTPUT Lhs.0, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.6

               0   ~0%    {8} r3 = JOIN `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndex/6#6471ea48#prev_delta` WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypes/3#3b2e26a8#prev` ON FIRST 3 OUTPUT Lhs.0, Lhs.1, Lhs.2, Lhs.3, Lhs.4, _, Lhs.5, _
                          {6}    | REWRITE WITH Tmp.5 := 1, Out.5 := (Tmp.5 + In.6), Tmp.7 := 0, TEST Out.5 != Tmp.7 KEEPING 6
               0   ~0%    {6}    | SCAN OUTPUT In.2, In.3, In.5, In.0, In.1, In.4
               0   ~0%    {7}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789` ON FIRST 3 OUTPUT Lhs.3, Rhs.3, Lhs.5, Lhs.4, Lhs.0, Lhs.1, Lhs.2
               0   ~0%    {6}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 3 OUTPUT Lhs.0, Lhs.3, Lhs.4, Lhs.5, Lhs.2, Lhs.6

        12808446   ~1%    {5} r4 = JOIN `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypes/3#3b2e26a8#prev_delta` WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 1 OUTPUT Lhs.2, Rhs.1, Lhs.0, Lhs.1, Rhs.2

           22081   ~1%    {7} r5 = JOIN r4 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789_0312#join_rhs` ON FIRST 2 OUTPUT Lhs.2, Lhs.3, Lhs.0, Lhs.4, Rhs.2, Rhs.3, _
                          {6}    | REWRITE WITH Tmp.6 := 0, TEST InOut.5 != Tmp.6 KEEPING 6
               0   ~0%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.4, In.3, In.5
               0   ~0%    {8}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndex/6#6471ea48#prev` ON FIRST 5 OUTPUT Lhs.0, Lhs.1, Lhs.2, Lhs.4, Lhs.3, Lhs.5, Rhs.5, _
                          {8}    | REWRITE WITH Tmp.7 := 1, Out.7 := (InOut.5 - Tmp.7), TEST Out.7 = InOut.6
               0   ~0%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.4, In.3, In.5

           22081   ~1%    {8} r6 = JOIN r4 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789_0312#join_rhs` ON FIRST 2 OUTPUT Lhs.2, Lhs.3, Lhs.0, Lhs.1, Lhs.4, Rhs.2, Rhs.3, _
                          {7}    | REWRITE WITH Tmp.7 := 0, TEST InOut.6 = Tmp.7 KEEPING 7
           22081   ~0%    {7}    | SCAN OUTPUT In.2, In.5, _, In.3, In.0, In.1, In.4
           22081   ~0%    {7}    | REWRITE WITH Out.2 := 0
           22081   ~0%    {5}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789` ON FIRST 4 OUTPUT Lhs.0, Lhs.1, Lhs.4, Lhs.5, Lhs.6
               0   ~0%    {6}    | JOIN WITH `project#TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789#3` ON FIRST 2 OUTPUT Lhs.2, Lhs.3, Lhs.0, Lhs.1, Lhs.4, _
               0   ~0%    {6}    | REWRITE WITH Out.5 := 0

           37736   ~1%    {8} r7 = JOIN r1 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789_0312#join_rhs` ON FIRST 2 OUTPUT Lhs.2, Lhs.1, Lhs.3, Lhs.4, Lhs.0, Rhs.2, Rhs.3, _
                          {7}    | REWRITE WITH Tmp.7 := 0, TEST InOut.6 = Tmp.7 KEEPING 7
           37736   ~0%    {7}    | SCAN OUTPUT In.4, In.5, _, In.1, In.0, In.2, In.3
           37736   ~0%    {7}    | REWRITE WITH Out.2 := 0
           37736   ~1%    {5}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789` ON FIRST 4 OUTPUT Lhs.0, Lhs.1, Lhs.4, Lhs.5, Lhs.6
               0   ~0%    {6}    | JOIN WITH `project#TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789#3` ON FIRST 2 OUTPUT Lhs.2, Lhs.4, Lhs.0, Lhs.1, Lhs.3, _
               0   ~0%    {6}    | REWRITE WITH Out.5 := 0

               0   ~0%    {6} r8 = r2 UNION r3 UNION r5 UNION r6 UNION r7
               0   ~0%    {6}    | AND NOT `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndex/6#6471ea48#prev`(FIRST 6)
                          return r8
```

After
```
Pipeline standard for TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndex/6#6471ea48@81728ywe was evaluated in 375 iterations totaling 2ms (delta sizes total: 0).
            0   ~0%    {6} r1 = JOIN `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndexBase/5#56e8595e#reorder_0_4_1_2_3#prev_delta` WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 2 OUTPUT Lhs.0, Lhs.2, Lhs.3, Lhs.4, Rhs.2, _
            0   ~0%    {6}    | REWRITE WITH Out.5 := 0

            0   ~0%    {6} r2 = JOIN `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev_delta` WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndexBase/5#56e8595e#reorder_0_4_1_2_3#prev` ON FIRST 2 OUTPUT Lhs.0, Rhs.2, Rhs.3, Rhs.4, Lhs.2, _
            0   ~0%    {6}    | REWRITE WITH Out.5 := 0

        66609   ~1%    {3} r3 = SCAN `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev_delta` OUTPUT In.0, In.2, In.1
            0   ~0%    {9}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndex/6#6471ea48#reorder_0_4_1_2_3_5#prev` ON FIRST 2 OUTPUT Lhs.0, Lhs.2, Lhs.1, Rhs.2, Rhs.3, Rhs.4, _, Rhs.5, _
                       {7}    | REWRITE WITH Tmp.6 := 1, Out.6 := (Tmp.6 + In.7), Tmp.8 := 0, TEST Out.6 != Tmp.8 KEEPING 7
            0   ~0%    {7}    | SCAN OUTPUT In.4, In.5, In.6, In.1, In.0, In.2, In.3
            0   ~0%    {6}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789` ON FIRST 4 OUTPUT Lhs.4, Lhs.6, Lhs.0, Lhs.1, Lhs.5, Lhs.2

            0   ~0%    {8} r4 = SCAN `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndex/6#6471ea48#prev_delta` OUTPUT In.0, In.1, In.2, In.3, In.4, _, In.5, _
                       {6}    | REWRITE WITH Tmp.5 := 1, Out.5 := (Tmp.5 + In.6), Tmp.7 := 0, TEST Out.5 != Tmp.7 KEEPING 6
            0   ~0%    {6}    | SCAN OUTPUT In.2, In.3, In.5, In.0, In.1, In.4
            0   ~0%    {7}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthTypeParameterPath/3#c3ea2789` ON FIRST 3 OUTPUT Lhs.3, Rhs.3, Lhs.5, Lhs.4, Lhs.0, Lhs.1, Lhs.2
            0   ~0%    {6}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 3 OUTPUT Lhs.0, Lhs.3, Lhs.4, Lhs.5, Lhs.2, Lhs.6

            0   ~0%    {6} r5 = r1 UNION r2 UNION r3 UNION r4
            0   ~0%    {6}    | AND NOT `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::typeParametersEqualFromIndex/6#6471ea48#prev`(FIRST 6)
                       return r5
```
2025-06-11 10:23:57 +02:00
Tom Hvitved
79e1af04df Rust: Fix bad join in satisfiesConstraintTypeMention
Before
```
Pipeline standard for TypeInference::CallExprBaseMatching::AccessConstraint::satisfiesConstraintTypeMention/6#69a92324@e8671rw7 was evaluated in 378 iterations totaling 313ms (delta sizes total: 168323).
          462477    ~1%    {7} r1 = JOIN `TypeInference::CallExprBaseMatching::AccessConstraint::hasConstraintMention/5#8730ee97#prev_delta` WITH TypeInference::CallExprBaseMatching::AccessConstraint::MkRelevantAccess#8a6252ad#reorder_3_0_1_2#prev ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.4, Lhs.3, Rhs.1, Rhs.2, Rhs.3
          993561    ~2%    {9}    | JOIN WITH `TypeInference::M2::BaseTypes::conditionSatisfiesConstraintTypeAt/5#e92dcc7a` ON FIRST 3 OUTPUT Lhs.0, Lhs.1, Lhs.2, Rhs.3, Rhs.4, Lhs.3, Lhs.4, Lhs.5, Lhs.6
          993561   ~38%    {7}    | JOIN WITH `TypeInference::M2::BaseTypes::conditionSatisfiesConstraintTypeAt/5#e92dcc7a` ON FIRST 5 OUTPUT Lhs.0, Lhs.4, Lhs.5, Lhs.6, Lhs.7, Lhs.8, Lhs.3
                           {7}    | AND NOT `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0`(FIRST 2)
          772102  ~427%    {6}    | SCAN OUTPUT In.3, In.4, In.5, In.2, In.6, In.1

           56885    ~1%    {4} r2 = SCAN TypeInference::CallExprBaseMatching::AccessConstraint::MkRelevantAccess#8a6252ad#prev_delta OUTPUT In.3, In.0, In.1, In.2

               0    ~0%    {7} r3 = JOIN r2 WITH `TypeInference::CallExprBaseMatching::AccessConstraint::hasConstraintMention/5#8730ee97#prev` ON FIRST 1 OUTPUT Rhs.1, Rhs.2, Rhs.4, Lhs.1, Lhs.2, Lhs.3, Rhs.3
               0    ~0%    {9}    | JOIN WITH `TypeInference::M2::BaseTypes::conditionSatisfiesConstraintTypeAt/5#e92dcc7a` ON FIRST 3 OUTPUT Lhs.0, Lhs.1, Lhs.2, Rhs.3, Rhs.4, Lhs.3, Lhs.4, Lhs.5, Lhs.6
               0    ~0%    {7}    | JOIN WITH `TypeInference::M2::BaseTypes::conditionSatisfiesConstraintTypeAt/5#e92dcc7a` ON FIRST 5 OUTPUT Lhs.0, Lhs.4, Lhs.5, Lhs.6, Lhs.7, Lhs.8, Lhs.3
                           {7}    | AND NOT `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0`(FIRST 2)
               0    ~0%    {6}    | SCAN OUTPUT In.2, In.3, In.4, In.5, In.6, In.1

          462477    ~1%    {8} r4 = JOIN `TypeInference::CallExprBaseMatching::AccessConstraint::hasConstraintMention/5#8730ee97#prev_delta` WITH TypeInference::CallExprBaseMatching::AccessConstraint::MkRelevantAccess#8a6252ad#reorder_3_0_1_2#prev ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.4, Lhs.0, Lhs.3, Rhs.1, Rhs.2, Rhs.3
          993561   ~39%    {9}    | JOIN WITH `TypeInference::M2::BaseTypes::conditionSatisfiesConstraintTypeAt/5#e92dcc7a` ON FIRST 3 OUTPUT Lhs.0, Rhs.4, Lhs.3, Lhs.1, Lhs.4, Lhs.5, Lhs.6, Lhs.7, Rhs.3
           23413    ~1%    {8}    | JOIN WITH `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0` ON FIRST 2 OUTPUT Lhs.3, Lhs.1, Lhs.2, Lhs.4, Lhs.5, Lhs.6, Lhs.7, Lhs.8
            2817    ~7%    {7}    | JOIN WITH `TypeMention::TypeMention.resolveTypeAt/1#dispred#a125c821#bff#reorder_0_2_1` ON FIRST 2 OUTPUT Lhs.2, Lhs.3, Lhs.4, Lhs.5, Lhs.6, Lhs.7, Rhs.2
           11550    ~0%    {9}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5, Rhs.2, _, Lhs.6, Rhs.1
                           {7}    | REWRITE WITH Tmp.6 := "", Out.6 := InverseAppend(In.7,Tmp.6,In.8) KEEPING 7
            2397    ~1%    {11}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.5, _, _, In.4, In.6, _, _
                           {7}    | REWRITE WITH Out.5 := (In.7 ++ In.8), Tmp.6 := (In.7 ++ In.8), Tmp.9 := "[0-9]+", Tmp.10 := "", Out.6 := regexpReplaceAll(Tmp.6,Tmp.9,Tmp.10) KEEPING 7
            2397    ~1%    {9}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, _, In.6, _
                           {7}    | REWRITE WITH Out.6 := length(In.7), Tmp.8 := 10, TEST Out.6 <= Tmp.8 KEEPING 7
            2397    ~1%    {6}    | SCAN OUTPUT In.1, In.2, In.3, In.0, In.5, In.4

           66727    ~0%    {6} r5 = JOIN `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev_delta` WITH TypeInference::CallExprBaseMatching::AccessConstraint::MkRelevantAccess#8a6252ad#reorder_3_0_1_2#prev ON FIRST 1 OUTPUT Lhs.0, Lhs.1, Lhs.2, Rhs.1, Rhs.2, Rhs.3
        19305359    ~0%    {9}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::hasConstraintMention/5#8730ee97#prev` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5, Rhs.2, Rhs.3, Rhs.4
         3454881    ~1%    {10}    | JOIN WITH `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0` ON FIRST 1 OUTPUT Lhs.0, Lhs.6, Lhs.8, Rhs.1, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5, Lhs.7
          753104    ~1%    {9}    | JOIN WITH `TypeInference::M2::BaseTypes::conditionSatisfiesConstraintTypeAt/5#e92dcc7a_01243#join_rhs` ON FIRST 4 OUTPUT Lhs.1, Lhs.3, Lhs.4, Lhs.5, Lhs.6, Lhs.7, Lhs.8, Lhs.9, Rhs.4
           32040   ~18%    {9}    | JOIN WITH `TypeMention::TypeMention.resolveTypeAt/1#dispred#a125c821#bff#reorder_0_2_1` ON FIRST 2 OUTPUT Lhs.3, Lhs.4, Lhs.5, Lhs.6, Lhs.7, Lhs.8, _, Rhs.2, Lhs.2
                           {7}    | REWRITE WITH Tmp.6 := "", Out.6 := InverseAppend(In.7,Tmp.6,In.8) KEEPING 7
           13192   ~54%    {11}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, _, _, In.5, In.6, _, _
                           {7}    | REWRITE WITH Out.5 := (In.7 ++ In.8), Tmp.6 := (In.7 ++ In.8), Tmp.9 := "[0-9]+", Tmp.10 := "", Out.6 := regexpReplaceAll(Tmp.6,Tmp.9,Tmp.10) KEEPING 7
           13192   ~54%    {9}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, _, In.6, _
                           {7}    | REWRITE WITH Out.6 := length(In.7), Tmp.8 := 10, TEST Out.6 <= Tmp.8 KEEPING 7
           13192   ~55%    {6}    | SCAN OUTPUT In.1, In.2, In.3, In.4, In.5, In.0

               0    ~0%    {8} r6 = JOIN r2 WITH `TypeInference::CallExprBaseMatching::AccessConstraint::hasConstraintMention/5#8730ee97#prev` ON FIRST 1 OUTPUT Rhs.1, Rhs.2, Rhs.4, Lhs.1, Lhs.2, Lhs.3, Lhs.0, Rhs.3
               0    ~0%    {9}    | JOIN WITH `TypeInference::M2::BaseTypes::conditionSatisfiesConstraintTypeAt/5#e92dcc7a` ON FIRST 3 OUTPUT Lhs.0, Rhs.4, Lhs.3, Lhs.4, Lhs.5, Lhs.6, Lhs.1, Lhs.7, Rhs.3
               0    ~0%    {8}    | JOIN WITH `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0` ON FIRST 2 OUTPUT Lhs.6, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5, Lhs.7, Lhs.8
               0    ~0%    {7}    | JOIN WITH `TypeMention::TypeMention.resolveTypeAt/1#dispred#a125c821#bff#reorder_0_2_1` ON FIRST 2 OUTPUT Lhs.5, Lhs.2, Lhs.3, Lhs.4, Lhs.6, Lhs.7, Rhs.2
               0    ~0%    {9}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5, Rhs.2, _, Lhs.6, Rhs.1
                           {7}    | REWRITE WITH Tmp.6 := "", Out.6 := InverseAppend(In.7,Tmp.6,In.8) KEEPING 7
               0    ~0%    {11}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.5, _, _, In.4, In.6, _, _
                           {7}    | REWRITE WITH Out.5 := (In.7 ++ In.8), Tmp.6 := (In.7 ++ In.8), Tmp.9 := "[0-9]+", Tmp.10 := "", Out.6 := regexpReplaceAll(Tmp.6,Tmp.9,Tmp.10) KEEPING 7
               0    ~0%    {9}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, _, In.6, _
                           {7}    | REWRITE WITH Out.6 := length(In.7), Tmp.8 := 10, TEST Out.6 <= Tmp.8 KEEPING 7
               0    ~0%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.5, In.4

          787691  ~403%    {6} r7 = r1 UNION r3 UNION r4 UNION r5 UNION r6
          212766   ~54%    {6}    | AND NOT `TypeInference::CallExprBaseMatching::AccessConstraint::satisfiesConstraintTypeMention/6#69a92324#prev`(FIRST 6)
                           return r7
```

After
```
Pipeline standard for TypeInference::CallExprBaseMatching::AccessConstraint::satisfiesConstraintTypeMention/6#69a92324@9c099xwn was evaluated in 380 iterations totaling 11ms (delta sizes total: 153004).
        768937    ~1%    {7} r1 = SCAN `TypeInference::CallExprBaseMatching::AccessConstraint::satisfiesConstraintTypeMention0/9#c82a4f76#prev_delta` OUTPUT In.5, In.8, In.1, In.2, In.3, In.4, In.7
                         {7}    | AND NOT `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0`(FIRST 2)
        745524  ~423%    {6}    | SCAN OUTPUT In.2, In.3, In.4, In.5, In.6, In.1

         26916    ~0%    {9} r2 = JOIN `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev_delta` WITH `TypeInference::CallExprBaseMatching::AccessConstraint::satisfiesConstraintTypeMention1/7#b265d17e#prev` ON FIRST 1 OUTPUT Lhs.2, Rhs.1, Rhs.2, Rhs.3, Rhs.4, Rhs.5, _, Rhs.6, Lhs.1
                         {7}    | REWRITE WITH Tmp.6 := "", Out.6 := InverseAppend(In.7,Tmp.6,In.8) KEEPING 7
          8530    ~1%    {11}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, _, _, In.5, In.6, _, _
                         {7}    | REWRITE WITH Out.5 := (In.7 ++ In.8), Tmp.6 := (In.7 ++ In.8), Tmp.9 := "[0-9]+", Tmp.10 := "", Out.6 := regexpReplaceAll(Tmp.6,Tmp.9,Tmp.10) KEEPING 7
          8530    ~1%    {9}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, _, In.6, _
                         {7}    | REWRITE WITH Out.6 := length(In.7), Tmp.8 := 10, TEST Out.6 <= Tmp.8 KEEPING 7
          8530    ~1%    {6}    | SCAN OUTPUT In.1, In.2, In.3, In.4, In.5, In.0

         11763    ~1%    {9} r3 = JOIN `TypeInference::CallExprBaseMatching::AccessConstraint::satisfiesConstraintTypeMention1/7#b265d17e#prev_delta` WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5, Rhs.2, _, Lhs.6, Rhs.1
                         {7}    | REWRITE WITH Tmp.6 := "", Out.6 := InverseAppend(In.7,Tmp.6,In.8) KEEPING 7
          2461    ~1%    {11}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.5, _, _, In.4, In.6, _, _
                         {7}    | REWRITE WITH Out.5 := (In.7 ++ In.8), Tmp.6 := (In.7 ++ In.8), Tmp.9 := "[0-9]+", Tmp.10 := "", Out.6 := regexpReplaceAll(Tmp.6,Tmp.9,Tmp.10) KEEPING 7
          2461    ~1%    {9}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, _, In.6, _
                         {7}    | REWRITE WITH Out.6 := length(In.7), Tmp.8 := 10, TEST Out.6 <= Tmp.8 KEEPING 7
          2461    ~1%    {6}    | SCAN OUTPUT In.0, In.1, In.2, In.3, In.5, In.4

        756515  ~396%    {6} r4 = r1 UNION r2 UNION r3
        155599    ~6%    {6}    | AND NOT `TypeInference::CallExprBaseMatching::AccessConstraint::satisfiesConstraintTypeMention/6#69a92324#prev`(FIRST 6)
                         return r4
```
2025-06-11 10:04:15 +02:00
Tom Hvitved
f9915e66a7 Rust: Fix bad join in satisfiesConcreteTypesFromIndex
Before

```
Pipeline standard for TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9@061312x0 was evaluated in 367 iterations totaling 3484ms (delta sizes total: 563408).
            66609   ~0%    {3} r1 = SCAN `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev_delta` OUTPUT In.1, In.2, In.0
        867138261   ~1%    {4}    | JOIN WITH `TypeMention::TypeMention.resolveTypeAt/1#dispred#a125c821#bff#reorder_0_2_1_210#join_rhs` ON FIRST 2 OUTPUT Lhs.2, Rhs.2, Lhs.0, Lhs.1
            29320   ~0%    {5}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput::potentialInstantiationOf/3#1239e45f#reorder_0_2_1#prev` ON FIRST 2 OUTPUT Rhs.2, Lhs.3, Lhs.0, Lhs.2, Lhs.1
                           {5}    | AND NOT `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0`(FIRST 2)
            29320   ~1%    {4}    | SCAN OUTPUT In.4, In.3, In.2, In.0

            29320   ~0%    {5} r2 = JOIN r1 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthPath/2#8b978a80_021#join_rhs` ON FIRST 2 OUTPUT Lhs.2, Lhs.0, Lhs.3, Rhs.2, _
                           {4}    | REWRITE WITH Tmp.4 := 0, TEST InOut.3 != Tmp.4 KEEPING 4
            29320   ~0%    {5}    | SCAN OUTPUT In.0, In.2, In.1, _, In.3
            29320   ~0%    {5}    | REWRITE WITH Tmp.3 := 1, Out.3 := (InOut.4 - Tmp.3)
            29296   ~1%    {4}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9#prev` ON FIRST 4 OUTPUT Lhs.0, Lhs.1, Lhs.2, Lhs.4

            29320   ~0%    {6} r3 = JOIN r1 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthPath/2#8b978a80_021#join_rhs` ON FIRST 2 OUTPUT Lhs.2, Lhs.1, Lhs.0, Lhs.3, Rhs.2, _
                           {5}    | REWRITE WITH Tmp.5 := 0, TEST InOut.4 = Tmp.5 KEEPING 5
                0   ~0%    {5}    | SCAN OUTPUT In.2, _, In.1, In.0, In.3
                0   ~0%    {5}    | REWRITE WITH Out.1 := 0
                0   ~0%    {4}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthPath/2#8b978a80` ON FIRST 3 OUTPUT Lhs.3, Lhs.4, Lhs.0, _
                0   ~0%    {4}    | REWRITE WITH Out.3 := 0

           563353   ~1%    {4} r4 = SCAN `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9#prev_delta` OUTPUT In.0, In.2, In.1, In.3
           563353   ~1%    {6}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput::potentialInstantiationOf/3#1239e45f#reorder_0_2_1#prev` ON FIRST 3 OUTPUT Lhs.0, Lhs.2, Lhs.1, _, Lhs.3, _
                           {4}    | REWRITE WITH Tmp.3 := 1, Out.3 := (Tmp.3 + In.4), Tmp.5 := 0, TEST Out.3 != Tmp.5 KEEPING 4
           563353   ~0%    {4}    | SCAN OUTPUT In.2, In.3, In.0, In.1

           258647   ~1%    {5} r5 = JOIN r4 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthPath/2#8b978a80` ON FIRST 2 OUTPUT Lhs.3, Lhs.2, Lhs.0, Lhs.1, Rhs.2
           102998   ~1%    {6}    | JOIN WITH `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0` ON FIRST 1 OUTPUT Lhs.2, Rhs.1, Lhs.4, Lhs.1, Lhs.0, Lhs.3
            52485   ~1%    {6}    | JOIN WITH `TypeMention::TypeMention.resolveTypeAt/1#dispred#a125c821#bff#reorder_0_2_1` ON FIRST 3 OUTPUT Lhs.0, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5

           258647   ~0%    {5} r6 = JOIN r4 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthPath/2#8b978a80` ON FIRST 2 OUTPUT Lhs.0, Rhs.2, Lhs.2, Lhs.3, Lhs.1
           259340   ~1%    {6}    | JOIN WITH `TypeMention::TypeMention.resolveTypeAt/1#dispred#a125c821#bff#reorder_0_2_1_021#join_rhs` ON FIRST 2 OUTPUT Lhs.2, Lhs.1, Rhs.2, Lhs.3, Lhs.0, Lhs.4
            16033   ~0%    {6}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 3 OUTPUT Lhs.3, Lhs.2, Lhs.0, Lhs.4, Lhs.5, Lhs.1
                           {6}    | AND NOT `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0`(FIRST 2)
            15992   ~1%    {6}    | SCAN OUTPUT In.3, In.1, In.5, In.2, In.0, In.4

            68477   ~1%    {6} r7 = r5 UNION r6
            68477   ~0%    {4}    | JOIN WITH `TypeMention::TypeMention.resolveTypeAt/1#dispred#a125c821#bff#reorder_0_2_1` ON FIRST 3 OUTPUT Lhs.3, Lhs.4, Lhs.0, Lhs.5

           465635   ~0%    {3} r8 = SCAN `TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput::potentialInstantiationOf/3#1239e45f#reorder_0_2_1#prev_delta` OUTPUT In.1, In.0, In.2

           465635   ~0%    {5} r9 = JOIN r8 WITH `_TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAc__#join_rhs` ON FIRST 1 OUTPUT Lhs.0, _, Rhs.2, Lhs.1, Lhs.2
           465635   ~1%    {5}    | REWRITE WITH Out.1 := 0

           465635   ~1%    {5} r10 = JOIN r9 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthPath/2#8b978a80` ON FIRST 3 OUTPUT Lhs.4, Lhs.0, _, Lhs.2, Lhs.3
           465635   ~1%    {5}    | REWRITE WITH Out.2 := 0

           275069   ~0%    {5} r11 = JOIN r8 WITH `_TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAc__#join_rhs#1` ON FIRST 1 OUTPUT Lhs.1, Lhs.2, Lhs.0, Rhs.1, Rhs.2
                0   ~0%    {7}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9#prev` ON FIRST 3 OUTPUT Lhs.2, Lhs.3, Lhs.4, Lhs.0, Lhs.1, Rhs.3, _
                0   ~0%    {7}    | REWRITE WITH Tmp.6 := 1, Out.6 := (InOut.1 - Tmp.6), TEST Out.6 = InOut.5

                0   ~0%    {5} r12 = SCAN r11 OUTPUT In.4, In.0, In.1, In.2, In.3

           465635   ~1%    {5} r13 = r10 UNION r12
            94444   ~1%    {6}    | JOIN WITH `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0` ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Lhs.3, Lhs.2, Lhs.4, Lhs.0
                6  ~20%    {6}    | JOIN WITH `TypeMention::TypeMention.resolveTypeAt/1#dispred#a125c821#bff#reorder_0_2_1` ON FIRST 3 OUTPUT Lhs.0, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5

           465635   ~0%    {5} r14 = JOIN r9 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::AwaitExprMatching::AccessConstraint::RelevantAccess,TypeInference::AwaitExprMatching::AccessConstraint::IsInstantiationOfInput>::getNthPath/2#8b978a80` ON FIRST 3 OUTPUT Lhs.0, Lhs.2, _, Lhs.3, Lhs.4
           465635   ~1%    {5}    | REWRITE WITH Out.2 := 0

                0   ~0%    {5} r15 = SCAN r11 OUTPUT In.0, In.2, In.1, In.3, In.4

           465635   ~1%    {5} r16 = r14 UNION r15
           465635   ~0%    {6}    | JOIN WITH `TypeMention::TypeMention.resolveTypeAt/1#dispred#a125c821#bff#reorder_0_2_1_021#join_rhs` ON FIRST 2 OUTPUT Lhs.3, Lhs.1, Rhs.2, Lhs.0, Lhs.2, Lhs.4
           465635   ~0%    {6}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 3 OUTPUT Lhs.5, Lhs.2, Lhs.3, Lhs.4, Lhs.1, Lhs.0
                           {6}    | AND NOT `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0`(FIRST 2)
           465629   ~1%    {6}    | SCAN OUTPUT In.2, In.1, In.4, In.3, In.5, In.0

           465635   ~1%    {6} r17 = r13 UNION r16
           465635   ~1%    {4}    | JOIN WITH `TypeMention::TypeMention.resolveTypeAt/1#dispred#a125c821#bff#reorder_0_2_1` ON FIRST 3 OUTPUT Lhs.4, Lhs.5, Lhs.0, Lhs.3

           563408   ~1%    {4} r18 = r2 UNION r3 UNION r7 UNION r17
           563408   ~1%    {4}    | AND NOT `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9#prev`(FIRST 4)
                           return r18
```

After

```
Pipeline standard for TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9@e8671bx7 was evaluated in 376 iterations totaling 245ms (delta sizes total: 563353).
        563353   ~1%    {6} r1 = SCAN `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9#prev_delta` OUTPUT In.0, In.1, In.2, _, In.3, _
        563353   ~1%    {4}    | REWRITE WITH Tmp.3 := 1, Out.3 := (Tmp.3 + In.4), Tmp.5 := 0, TEST Out.3 != Tmp.5 KEEPING 4

        259340   ~1%    {5} r2 = JOIN r1 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::resolveTypeAt/5#77e2181d#prev` ON FIRST 4 OUTPUT Lhs.1, Rhs.5, Lhs.0, Lhs.2, Lhs.3
         52485   ~0%    {4}    | JOIN WITH `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0` ON FIRST 2 OUTPUT Lhs.2, Lhs.0, Lhs.3, Lhs.4

        259340   ~1%    {6} r3 = JOIN r1 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::resolveTypeAt/5#77e2181d#prev` ON FIRST 4 OUTPUT Lhs.0, Rhs.4, Rhs.5, Lhs.1, Lhs.2, Lhs.3
         16033   ~0%    {5}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 3 OUTPUT Lhs.3, Lhs.2, Lhs.0, Lhs.4, Lhs.5
                        {5}    | AND NOT `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0`(FIRST 2)
         15992   ~0%    {4}    | SCAN OUTPUT In.2, In.0, In.3, In.4

        741397   ~1%    {7} r4 = SCAN `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::resolveTypeAt/5#77e2181d#prev_delta` OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, _
        465635   ~1%    {6}    | REWRITE WITH Tmp.6 := 0, TEST InOut.3 = Tmp.6 KEEPING 6

        465635   ~1%    {5} r5 = SCAN r4 OUTPUT In.1, In.5, In.0, In.2, _
        465635   ~0%    {5}    | REWRITE WITH Out.4 := 0

        741397   ~1%    {7} r6 = SCAN `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::resolveTypeAt/5#77e2181d#prev_delta` OUTPUT In.0, In.1, In.2, In.3, In.4, In.5, _
        275762   ~1%    {6}    | REWRITE WITH Tmp.6 := 0, TEST InOut.3 != Tmp.6 KEEPING 6

             0   ~0%    {7} r7 = JOIN r6 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9#prev` ON FIRST 3 OUTPUT Lhs.0, Lhs.1, Lhs.2, Lhs.3, Lhs.5, Rhs.3, _
                        {7}    | REWRITE WITH Tmp.6 := 1, Out.6 := (InOut.3 - Tmp.6), TEST Out.6 = InOut.5
             0   ~0%    {5}    | SCAN OUTPUT In.1, In.4, In.0, In.2, In.3

        465635   ~0%    {5} r8 = r5 UNION r7
             6   ~0%    {4}    | JOIN WITH `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0` ON FIRST 2 OUTPUT Lhs.2, Lhs.0, Lhs.3, Lhs.4

         29310   ~0%    {5} r9 = JOIN `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev_delta` WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::resolveTypeAt/5#77e2181d#reorder_0_4_5_1_2_3#prev` ON FIRST 3 OUTPUT Lhs.0, Lhs.2, Rhs.3, Rhs.4, Rhs.5

         29310   ~0%    {6} r10 = SCAN r9 OUTPUT In.0, In.1, In.2, In.3, In.4, _
                        {5}    | REWRITE WITH Tmp.5 := 0, TEST InOut.4 = Tmp.5 KEEPING 5
             0   ~0%    {5}    | SCAN OUTPUT In.2, In.1, In.0, In.3, _
             0   ~0%    {5}    | REWRITE WITH Out.4 := 0

         29310   ~0%    {6} r11 = SCAN r9 OUTPUT In.0, In.1, In.2, In.3, In.4, _
                        {5}    | REWRITE WITH Tmp.5 := 0, TEST InOut.4 != Tmp.5 KEEPING 5
         29310   ~1%    {6}    | SCAN OUTPUT In.0, In.2, In.3, _, In.1, In.4
         29310   ~1%    {6}    | REWRITE WITH Tmp.3 := 1, Out.3 := (InOut.5 - Tmp.3)
         29241   ~0%    {5}    | JOIN WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9#prev` ON FIRST 4 OUTPUT Lhs.1, Lhs.4, Lhs.0, Lhs.2, Lhs.5

         29241   ~0%    {5} r12 = r10 UNION r11
                        {5}    | AND NOT `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0`(FIRST 2)
         29241   ~1%    {4}    | SCAN OUTPUT In.2, In.0, In.3, In.4

        465635   ~0%    {6} r13 = SCAN r4 OUTPUT In.0, In.4, In.5, In.1, In.2, _
        465635   ~1%    {6}    | REWRITE WITH Out.5 := 0

             0   ~0%    {8} r14 = JOIN r6 WITH `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9#prev` ON FIRST 3 OUTPUT Lhs.0, Lhs.1, Lhs.2, Lhs.3, Lhs.4, Lhs.5, Rhs.3, _
                        {8}    | REWRITE WITH Tmp.7 := 1, Out.7 := (InOut.3 - Tmp.7), TEST Out.7 = InOut.6
             0   ~0%    {6}    | SCAN OUTPUT In.0, In.4, In.5, In.1, In.2, In.3

        465635   ~1%    {6} r15 = r13 UNION r14
        465635   ~0%    {5}    | JOIN WITH `TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess.getTypeAt/1#dispred#3a89868c#prev` ON FIRST 3 OUTPUT Lhs.3, Lhs.2, Lhs.0, Lhs.4, Lhs.5
                        {5}    | AND NOT `Type::TypeAbstraction.getATypeParameter/0#dispred#030257a0`(FIRST 2)
        465629   ~1%    {4}    | SCAN OUTPUT In.2, In.0, In.3, In.4

        563353   ~1%    {4} r16 = r2 UNION r3 UNION r8 UNION r12 UNION r15
        563353   ~1%    {4}    | AND NOT `TypeInference::M2::IsInstantiationOf<TypeInference::CallExprBaseMatching::AccessConstraint::RelevantAccess,TypeInference::CallExprBaseMatching::AccessConstraint::IsInstantiationOfInput>::satisfiesConcreteTypesFromIndex/4#716280b9#prev`(FIRST 4)
                        return r16
```
2025-06-11 09:15:17 +02:00
Tom Hvitved
bc60d033e5 Rust: Fix bad join in inferAccessType
Before
```
Pipeline standard for TypeInference::CallExprBaseMatching::inferAccessType/3#be4695a4@202c46xq was evaluated in 600 iterations totaling 2282ms (delta sizes total: 5827084).
        120407742    ~1%    {4} r1 = JOIN `TypeInference::CallExprBaseMatchingInput::Access.getTarget/0#dispred#29d66fd1#prev_delta` WITH `TypeInference::CallExprBaseMatchingInput::accessDeclarationPositionMatch/2#6c58c89d` CARTESIAN PRODUCT OUTPUT Lhs.1, Rhs.1, Rhs.0, Lhs.0
          6495868  ~109%    {4}    | JOIN WITH `TypeInference::CallExprBaseMatchingInput::Declaration.getDeclaredType/2#dispred#325b693f` ON FIRST 2 OUTPUT Rhs.3, Lhs.2, Lhs.3, Rhs.2
                            {4}    | AND NOT Type::TypeParameter#f85657da(FIRST 1)
          3049994   ~10%    {4}    | SCAN OUTPUT In.2, In.1, In.3, In.0

             7891    ~0%    {5} r2 = SCAN `TypeInference::CallExprBaseMatching::explicitTypeMatch/5#98ce2c39#prev_delta` OUTPUT In.1, In.4, In.0, In.2, In.3
             4445    ~3%    {9}    | JOIN WITH `_TypeInference::CallExprBaseMatchingInput::Declaration.getDeclaredType/2#dispred#325b693f_1023#join___#join_rhs` ON FIRST 2 OUTPUT Rhs.2, Lhs.2, Lhs.4, _, _, Rhs.3, Lhs.3, _, _
                            {5}    | REWRITE WITH Out.3 := (In.5 ++ In.6), Tmp.4 := (In.5 ++ In.6), Tmp.7 := "[0-9]+", Tmp.8 := "", Out.4 := regexpReplaceAll(Tmp.4,Tmp.7,Tmp.8) KEEPING 5
             4445    ~3%    {7}    | SCAN OUTPUT In.0, In.1, In.2, In.3, _, In.4, _
                            {5}    | REWRITE WITH Out.4 := length(In.5), Tmp.6 := 10, TEST Out.4 <= Tmp.6 KEEPING 5
             4445    ~5%    {4}    | SCAN OUTPUT In.1, In.0, In.3, In.2

          3553075    ~1%    {5} r3 = SCAN `TypeInference::CallExprBaseMatching::directTypeMatch/5#319f8680#prev_delta` OUTPUT In.1, In.4, In.0, In.2, In.3
          6860451   ~16%    {9}    | JOIN WITH `_TypeInference::CallExprBaseMatchingInput::Declaration.getDeclaredType/2#dispred#325b693f_1023#join___#join_rhs` ON FIRST 2 OUTPUT Rhs.2, Lhs.2, Lhs.4, _, _, Rhs.3, Lhs.3, _, _
                            {5}    | REWRITE WITH Out.3 := (In.5 ++ In.6), Tmp.4 := (In.5 ++ In.6), Tmp.7 := "[0-9]+", Tmp.8 := "", Out.4 := regexpReplaceAll(Tmp.4,Tmp.7,Tmp.8) KEEPING 5
          6860451   ~19%    {7}    | SCAN OUTPUT In.0, In.1, In.2, In.3, _, In.4, _
                            {5}    | REWRITE WITH Out.4 := length(In.5), Tmp.6 := 10, TEST Out.4 <= Tmp.6 KEEPING 5
          6211129   ~20%    {4}    | SCAN OUTPUT In.1, In.0, In.3, In.2

           115218    ~1%    {5} r4 = SCAN `TypeInference::CallExprBaseMatching::typeConstraintBaseTypeMatch/5#ebeb4216#prev_delta` OUTPUT In.1, In.4, In.0, In.2, In.3
           181668    ~2%    {9}    | JOIN WITH `_TypeInference::CallExprBaseMatchingInput::Declaration.getDeclaredType/2#dispred#325b693f_1023#join___#join_rhs` ON FIRST 2 OUTPUT Rhs.2, Lhs.2, Lhs.4, _, _, Rhs.3, Lhs.3, _, _
                            {5}    | REWRITE WITH Out.3 := (In.5 ++ In.6), Tmp.4 := (In.5 ++ In.6), Tmp.7 := "[0-9]+", Tmp.8 := "", Out.4 := regexpReplaceAll(Tmp.4,Tmp.7,Tmp.8) KEEPING 5
           181668    ~0%    {7}    | SCAN OUTPUT In.0, In.1, In.2, In.3, _, In.4, _
                            {5}    | REWRITE WITH Out.4 := length(In.5), Tmp.6 := 10, TEST Out.4 <= Tmp.6 KEEPING 5
           181668    ~0%    {4}    | SCAN OUTPUT In.1, In.0, In.3, In.2

          9447236   ~16%    {4} r5 = r1 UNION r2 UNION r3 UNION r4
          5902300    ~4%    {4}    | AND NOT `TypeInference::CallExprBaseMatching::inferAccessType/3#be4695a4#prev`(FIRST 4)
                            return r5
```

Afer
```
Pipeline standard for TypeInference::CallExprBaseMatching::inferAccessType/3#be4695a4@061316x0 was evaluated in 600 iterations totaling 1727ms (delta sizes total: 5918371).
         1323162    ~0%    {2} r1 = SCAN `TypeInference::CallExprBaseMatchingInput::Access.getTarget/0#dispred#29d66fd1#prev_delta` OUTPUT In.1, In.0
         5316637  ~152%    {4}    | JOIN WITH `_Type::TypeParameter#f85657da_TypeInference::CallExprBaseMatchingInput::Declaration.getDeclaredType/__#join_rhs#1` ON FIRST 1 OUTPUT Lhs.1, Rhs.1, Rhs.2, Rhs.3

            7891    ~0%    {5} r2 = SCAN `TypeInference::CallExprBaseMatching::explicitTypeMatch/5#98ce2c39#prev_delta` OUTPUT In.1, In.4, In.0, In.2, In.3
            4445    ~3%    {9}    | JOIN WITH `_TypeInference::CallExprBaseMatchingInput::Declaration.getDeclaredType/2#dispred#325b693f_1023#join___#join_rhs` ON FIRST 2 OUTPUT Rhs.2, Lhs.2, Lhs.4, _, _, Rhs.3, Lhs.3, _, _
                           {5}    | REWRITE WITH Out.3 := (In.5 ++ In.6), Tmp.4 := (In.5 ++ In.6), Tmp.7 := "[0-9]+", Tmp.8 := "", Out.4 := regexpReplaceAll(Tmp.4,Tmp.7,Tmp.8) KEEPING 5
            4445    ~3%    {7}    | SCAN OUTPUT In.0, In.1, In.2, In.3, _, In.4, _
                           {5}    | REWRITE WITH Out.4 := length(In.5), Tmp.6 := 10, TEST Out.4 <= Tmp.6 KEEPING 5
            4445    ~5%    {4}    | SCAN OUTPUT In.1, In.0, In.3, In.2

         3553075    ~1%    {5} r3 = SCAN `TypeInference::CallExprBaseMatching::directTypeMatch/5#319f8680#prev_delta` OUTPUT In.1, In.4, In.0, In.2, In.3
         6860451   ~16%    {9}    | JOIN WITH `_TypeInference::CallExprBaseMatchingInput::Declaration.getDeclaredType/2#dispred#325b693f_1023#join___#join_rhs` ON FIRST 2 OUTPUT Rhs.2, Lhs.2, Lhs.4, _, _, Rhs.3, Lhs.3, _, _
                           {5}    | REWRITE WITH Out.3 := (In.5 ++ In.6), Tmp.4 := (In.5 ++ In.6), Tmp.7 := "[0-9]+", Tmp.8 := "", Out.4 := regexpReplaceAll(Tmp.4,Tmp.7,Tmp.8) KEEPING 5
         6860451   ~19%    {7}    | SCAN OUTPUT In.0, In.1, In.2, In.3, _, In.4, _
                           {5}    | REWRITE WITH Out.4 := length(In.5), Tmp.6 := 10, TEST Out.4 <= Tmp.6 KEEPING 5
         6211129   ~20%    {4}    | SCAN OUTPUT In.1, In.0, In.3, In.2

          115218    ~1%    {5} r4 = SCAN `TypeInference::CallExprBaseMatching::typeConstraintBaseTypeMatch/5#ebeb4216#prev_delta` OUTPUT In.1, In.4, In.0, In.2, In.3
          181668    ~2%    {9}    | JOIN WITH `_TypeInference::CallExprBaseMatchingInput::Declaration.getDeclaredType/2#dispred#325b693f_1023#join___#join_rhs` ON FIRST 2 OUTPUT Rhs.2, Lhs.2, Lhs.4, _, _, Rhs.3, Lhs.3, _, _
                           {5}    | REWRITE WITH Out.3 := (In.5 ++ In.6), Tmp.4 := (In.5 ++ In.6), Tmp.7 := "[0-9]+", Tmp.8 := "", Out.4 := regexpReplaceAll(Tmp.4,Tmp.7,Tmp.8) KEEPING 5
          181668    ~0%    {7}    | SCAN OUTPUT In.0, In.1, In.2, In.3, _, In.4, _
                           {5}    | REWRITE WITH Out.4 := length(In.5), Tmp.6 := 10, TEST Out.4 <= Tmp.6 KEEPING 5
          181668    ~0%    {4}    | SCAN OUTPUT In.1, In.0, In.3, In.2

        11713879   ~62%    {4} r5 = r1 UNION r2 UNION r3 UNION r4
         6210333   ~10%    {4}    | AND NOT `TypeInference::CallExprBaseMatching::inferAccessType/3#be4695a4#prev`(FIRST 4)
                           return r5
```
2025-06-11 09:15:16 +02:00
Tom Hvitved
c6efc05de1 Rust: Reimplement type inference for impl Traits and await expressions 2025-06-10 12:39:20 +02:00
github-actions[bot]
21463a9653 Post-release preparation for codeql-cli-2.22.0 2025-06-09 18:50:20 +00:00
github-actions[bot]
88ba02edf8 Release preparation for version 2.22.0 2025-06-09 18:14:51 +00:00
github-actions[bot]
d2c6875eac Post-release preparation for codeql-cli-2.21.4 2025-05-27 18:16:21 +00:00
github-actions[bot]
bfb91e95e3 Release preparation for version 2.21.4 2025-05-27 17:22:05 +00:00
Simon Friis Vindum
96cba8b8c2 Rust: Add inconsistency check for type mentions without a root type 2025-05-27 09:33:59 +02:00
Tom Hvitved
05288d3952 Type inference: Simplify internal representation of type paths 2025-05-23 13:36:58 +02:00
Tom Hvitved
13861b81a8 Address review comments 2025-05-21 14:10:32 +02:00
Tom Hvitved
3fa4ea4da3 Rust: Improve performance of type inference 2025-05-20 10:23:18 +02:00
Simon Friis Vindum
eb5d4efb26 Merge branch 'main' into rust-ti-implementing-type-method 2025-05-20 09:53:51 +02:00
Simon Friis Vindum
98c6783ed9 Rust: Rename predicate and inline predicate only used once 2025-05-20 09:20:35 +02:00
Simon Friis Vindum
654d410485 Rust: Address PR feedback 2025-05-19 15:50:29 +02:00
github-actions[bot]
5f9dd75d7d Post-release preparation for codeql-cli-2.21.3 2025-05-13 21:49:43 +00:00
github-actions[bot]
2de4a01c86 Release preparation for version 2.21.3 2025-05-13 21:14:27 +00:00
Simon Friis Vindum
0cf60c4e2d Rust: Address comments on documentation 2025-05-12 11:07:46 +02:00
Simon Friis Vindum
06cfa9a89c Rust: Address format fixes suggested in review 2025-05-05 15:21:50 -04:00
Simon Friis Vindum
e45b5c557d Rust: Implement type inference support for non-universal impl blocks 2025-05-01 11:59:15 +02:00
github-actions[bot]
2e0699ab2b Post-release preparation for codeql-cli-2.21.2 2025-04-28 14:03:28 +00:00
github-actions[bot]
625354c46e Release preparation for version 2.21.2 2025-04-28 10:55:22 +00:00
github-actions[bot]
d78736b1bf Post-release preparation for codeql-cli-2.21.1 2025-04-15 16:33:15 +00:00
github-actions[bot]
b961c5961d Release preparation for version 2.21.1 2025-04-14 09:53:06 +00:00
github-actions[bot]
10205cb990 Post-release preparation for codeql-cli-2.21.0 2025-04-01 11:30:43 +00:00
github-actions[bot]
84f6564cc0 Release preparation for version 2.21.0 2025-03-31 17:35:15 +00:00
Simon Friis Vindum
989c14485d Rust: Minor doc tweaks based on PR comments 2025-03-28 13:39:42 +01:00
Simon Friis Vindum
623bc232bf Rust: Address PR comments 2025-03-28 13:04:55 +01:00
Simon Friis Vindum
520e27ccfa Shared: Fix typos in qldoc 2025-03-25 15:49:03 +01:00
Simon Friis Vindum
54e7bb7f1a Rust: Fix a bad join by adding bindingset to resolveTypeMentionRoot 2025-03-25 14:26:24 +01:00
Simon Friis Vindum
06c8963f70 Shared: Infer types for type parameters with contraints 2025-03-25 09:03:44 +01:00
Simon Friis Vindum
ba9edf8d25 Shared: Refactor type inference 2025-03-25 06:32:36 +01:00
Simon Friis Vindum
7dc49da6b0 Shared: Fix path in qldoc
Co-authored-by: Anders Schack-Mulligen <aschackmull@users.noreply.github.com>
2025-03-24 11:38:15 +01:00
Simon Friis Vindum
e0ef24154a Rust: Small tweaks to doc comments based on PR feedback 2025-03-21 08:30:14 +01:00
Simon Friis Vindum
b2fc4f80fb Rust: Adjustments to type inference 2025-03-20 16:38:06 +01:00
Simon Friis Vindum
0d770c8c91 Rust: Improve handling of type parameters with trait bounds 2025-03-19 16:34:23 +01:00