@@ -22408,43 +22408,41 @@ \subsection{Subtypes}
22408
22408
}
22409
22409
22410
22410
\LMHash{}%
22411
- %% TODO(eernst): Introduce these specialized intersection types
22412
- %% in a suitable location where type promotion is specified.
22413
- Types of the form
22414
- \IndexCustom{$X \& S$}{type!of the form $X \& S$}%
22415
- \IndexExtraEntry{\&@$X \& S$}
22416
- arise during static analysis due to type promotion
22411
+ Intersection types
22412
+ (\commentary{types of the form \code{$X$\,\&\,$S$}}),
22413
+ may arise during static analysis due to type promotion
22417
22414
(\ref{typePromotion}).
22418
22415
They never occur during execution,
22419
- they are never a type argument of another type,
22420
- nor a return type or a formal parameter type,
22421
- and it is always the case that $S$ is a subtype of the bound of $X$.
22422
- \commentary{%
22423
- The motivation for $X \& S$ is that it represents
22424
- the type of a local variable $v$
22425
- whose type is declared to be the type variable $X$,
22426
- and which is known to have type $S$ due to promotion.
22427
- Similarly, $X \& S$ may be seen as an intersection type,
22428
- which is a subtype of $X$ and also a subtype of $S$.
22429
- Intersection types are \emph{not} supported in general,
22430
- only in this special case.%
22431
- }
22432
- Every other form of type may occur during static analysis
22433
- as well as during execution,
22434
- and the subtype relationship is always determined in the same way.
22416
+ and there are many other restrictions on where they can occur
22417
+ (\ref{intersectionTypes}).
22418
+ However, their subtype relations are specified without restrictions.
22419
+ \commentary{%
22420
+ It causes no problems that these rules will not be used
22421
+ in their full generality.%
22422
+ }
22435
22423
22424
+ !!! Renumber!
22436
22425
% Subtype Rule Numbering
22437
22426
\newcommand{\SrnReflexivity}{1}
22438
- \newcommand{\SrnTop}{2}
22439
- \newcommand{\SrnBottom}{3}
22440
- \newcommand{\SrnNull}{4}
22441
- \newcommand{\SrnLeftTypeAlias}{5}
22442
- \newcommand{\SrnRightTypeAlias}{6}
22427
+ \newcommand{\SrnRightTop}{2}
22428
+ \newcommand{\SrnLeftTop}{3}
22429
+ \newcommand{\SrnBottom}{4}
22430
+ \newcommand{\SrnRightObjectOne}{5.1}
22431
+ \newcommand{\SrnRightObjectTwo}{5.2}
22432
+ \newcommand{\SrnRightObjectThree}{5.3}
22433
+ \newcommand{\SrnRightObjectFour}{5.4}
22434
+ \newcommand{\SrnNullOne}{6.1}
22435
+ \newcommand{\SrnNullTwo}{6.2}
22443
22436
\newcommand{\SrnLeftFutureOr}{7}
22437
+ \newcommand{\SrnLeftNullable}{7b}
22444
22438
\newcommand{\SrnTypeVariableReflexivityA}{8}
22445
22439
\newcommand{\SrnRightPromotedVariable}{9}
22446
22440
\newcommand{\SrnRightFutureOrA}{10}
22447
22441
\newcommand{\SrnRightFutureOrB}{11}
22442
+ \newcommand{\SrnRightNullableOne}{11b.1}
22443
+ \newcommand{\SrnRightNullableTwo}{11b.2}
22444
+ \newcommand{\SrnRightNullableThree}{11b.3}
22445
+ \newcommand{\SrnRightNullableFour}{11b.4}
22448
22446
\newcommand{\SrnLeftPromotedVariable}{12}
22449
22447
\newcommand{\SrnLeftVariableBound}{13}
22450
22448
\newcommand{\SrnRightFunction}{14}
@@ -22465,34 +22463,47 @@ \subsection{Subtypes}
22465
22463
\def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
22466
22464
%
22467
22465
\begin{minipage}[c]{0.49\textwidth}
22468
- \Axiom{\SrnReflexivity}{Reflexivity}{S}{S}
22469
- \Axiom{\SrnBottom}{Left Bottom}{\bot}{T}
22466
+ \Axiom{\SrnReflexivity}{Reflexivity}{T}{T}
22467
+ \Axiom{\SrnBottom}{Left Bottom}{\code{Never}}{T}
22468
+ \RuleRaw{\SrnRightObjectTwo}{Right Object 2}{%
22469
+ \SubtypeStd{S}{\code{Object}}}{\code{$X$\,\&\,$S$}}{\code{Object}}
22470
+ \RuleRaw{\SrnRightObjectThree}{Right Object 3}{%
22471
+ \SubtypeStd{S}{\code{Object}}}{\code{FutureOr<$S$>}}{\code{Object}}
22472
+ \Axiom{\SrnNullOne}{Left Null One}{\code{Null}}{\code{$T$?}}
22470
22473
\end{minipage}
22471
22474
\begin{minipage}[c]{0.49\textwidth}
22472
- \RuleRaw{\SrnTop}{Right Top}{T \in \{\code{Object}, \DYNAMIC, \VOID\}}{S}{T}
22473
- \RuleRaw{\SrnNull}{Left Null}{T \not= \bot}{\code{Null}}{T}
22475
+ \RuleRaw{\SrnRightTop}{Right Top}{%
22476
+ T \in \{\code{Object?}, \DYNAMIC, \VOID\}}{S}{T}
22477
+ \RuleRaw{\SrnLeftTop}{Left Top}{%
22478
+ S \in \{\DYNAMIC, \VOID\} & \SubtypeStd{\code{Object?}}{T}}{S}{T}
22479
+ \RuleRaw{\SrnRightObjectOne}{Right Object 1}{%
22480
+ \code{$X$\,\EXTENDS\,$B$} & \SubtypeStd{B}{\code{Object}}%
22481
+ }{X}{\code{Object}}
22482
+ \RuleRaw{\SrnRightObjectFour}{Right Object 4}{%
22483
+ $S$\,\not\in \{\code{Null}, \DYNAMIC, \VOID\}\\
22484
+ \mbox{$S$ is not of the form \code{$U$?}, $X$, %
22485
+ \code{$X$\,\&\,$U$}, \code{FutureOr<$U$>}}}{S}{\code{Object}}
22486
+ \Rule{\SrnNullTwo}{Left Null Two}{\code{Null}}{T}{%
22487
+ \code{Null}}{\code{FutureOr<$T$>}}
22474
22488
\end{minipage}
22475
22489
22476
- \ExtraVSP
22477
- \RuleRaw{\SrnLeftTypeAlias}{Type Alias Left}{%
22478
- \code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
22479
- \SubtypeStd{[S_1/X_1,\ldots,S_s/X_s]U}{T}}{\code{$F$<\List{S}{1}{s}>}}{T}
22480
- \RuleRaw{\SrnRightTypeAlias}{Type Alias Right}{%
22481
- \code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
22482
- \SubtypeStd{S}{[T_1/X_1,\ldots,T_s/X_s]U}}{S}{\code{$F$<\List{T}{1}{s}>}}
22483
-
22484
22490
\begin{minipage}[c]{0.49\textwidth}
22485
22491
\RuleTwo{\SrnLeftFutureOr}{Left FutureOr}{S}{T}{%
22486
22492
\code{Future<$S$>}}{T}{\code{FutureOr<$S$>}}{T}
22487
22493
\RuleTwo{\SrnRightPromotedVariable}{Right Promoted Variable}{S}{X}{S}{T}{%
22488
22494
S}{X \& T}
22489
22495
\Rule{\SrnRightFutureOrB}{Right FutureOr B}{S}{T}{S}{\code{FutureOr<$T$>}}
22496
+ \Rule{\SrnRightNullableTwo}{Right Nullable 2}{S}{\code{Null}}{S}{%
22497
+ \code{$T$?}}
22490
22498
\Rule{\SrnLeftVariableBound}{Left Variable Bound}{\Delta(X)}{T}{X}{T}
22491
22499
\end{minipage}
22492
22500
\begin{minipage}[c]{0.49\textwidth}
22501
+ \RuleTwo{\SrnLeftNullable}{Left Nullable}{S}{T}{\code{Null}}{T}{
22502
+ \code{$S$?}}{T}
22493
22503
\Axiom{\SrnTypeVariableReflexivityA}{Left Promoted Variable A}{X \& S}{X}
22494
22504
\Rule{\SrnRightFutureOrA}{Right FutureOr A}{S}{\code{Future<$T$>}}{%
22495
22505
S}{\code{FutureOr<$T$>}}
22506
+ \Rule{\SrnRightNullableOne}{Right Nullable 1}{S}{T}{S}{\code{$T$?}}
22496
22507
\Rule{\SrnLeftPromotedVariable}{Left Promoted Variable B}{S}{T}{X \& S}{T}
22497
22508
\RuleRaw{\SrnRightFunction}{Right Function}{T\mbox{ is a function type}}{%
22498
22509
T}{\FUNCTION}
@@ -22528,6 +22539,7 @@ \subsection{Subtypes}
22528
22539
\forall j \in 1 .. s\!:\;\SubtypeStd{S_j}{T_j}}{%
22529
22540
\code{$C$<\List{S}{1}{s}>}}{\code{$C$<\List{T}{1}{s}>}}
22530
22541
\ExtraVSP
22542
+ %% !!! Should include mixins (and other non-class interface types, if any).
22531
22543
\RuleRaw{\SrnSuperinterface}{Superinterface}{%
22532
22544
\code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}}\\
22533
22545
\Superinterface{\code{$D$<\List{T}{1}{m}>}}{C} &
@@ -22579,10 +22591,9 @@ \subsubsection{Subtype Rules}
22579
22591
Whenever a rule contains one or more meta-variables,
22580
22592
that rule can be used by
22581
22593
\IndexCustom{instantiating}{instantiation!subtype rule}
22582
- it, that is, by consistently replacing
22583
- each occurrence of a given meta-variable by
22584
- concrete syntax denoting the same type
22585
- (\ref{typeType}).
22594
+ it, that is, by choosing a specific type $T$ and metavariable $\cal V$,
22595
+ and then consistently replacing all occurrences of $\cal V$ by
22596
+ concrete syntax denoting $T$.
22586
22597
22587
22598
\commentary{%
22588
22599
In general, this means that two or more occurrences of
@@ -22595,11 +22606,12 @@ \subsubsection{Subtype Rules}
22595
22606
can be used to conclude
22596
22607
\Subtype{\emptyset}{\code{int}}{\code{int}},
22597
22608
where $\emptyset$ denotes the empty environment
22598
- (any environment would suffice because no type variables occur).
22609
+ (any environment would suffice because no type variables occur).%
22610
+ }
22599
22611
22600
- However, the wording `denoting the same type' above covers
22601
- additional situations as well :
22602
- For instance, we may use rule~\SrnReflexivity{}
22612
+ \commentary{%
22613
+ The phrases `same type' and `identical syntax' deserves some extra scrutiny :
22614
+ We may, e.g., use rule~\SrnReflexivity{}
22603
22615
to show that \code{p1.C} is a subtype of
22604
22616
\code{p2.C} when \code{C} is a class declared in a
22605
22617
library $L$ which is imported by libraries $L_1$ and $L_2$ and
@@ -22628,8 +22640,27 @@ \subsubsection{Subtype Rules}
22628
22640
}
22629
22641
22630
22642
\LMHash{}%
22631
- Every \synt{typeName} used in a type mentioned in this section is assumed to
22632
- have no compile-time error and denote a type.
22643
+ In this section,
22644
+ the notion of two types $T_1$ and $T_2$ being the same type
22645
+ is taken to mean that $T_1$ and $T_2$ have the same canonical syntax
22646
+ (\ref{standardUpperBoundsAndStandardLowerBounds}).
22647
+
22648
+ \commentary{%
22649
+ In other words, we eliminate the difficulties associated with
22650
+ different syntax denoting the same type,
22651
+ and different types denoted by the same syntax,
22652
+ by assuming that every type in the program has been expressed
22653
+ in a manner where those situations never occur,
22654
+ because each type is denoted by the same globally unique syntax everywhere.
22655
+ Note that `same canonical syntax' also requires
22656
+ transitive expansion of all type aliases
22657
+ (\ref{typedef}).%
22658
+ }
22659
+
22660
+ \LMHash{}%
22661
+ Every \synt{typeName} used in a type mentioned in this section
22662
+ is assumed to have no compile-time error,
22663
+ and it is assumed to denote a type.
22633
22664
22634
22665
\commentary{%
22635
22666
That is, no subtyping relationship can be proven for
@@ -22677,9 +22708,11 @@ \subsubsection{Subtype Rules}
22677
22708
So
22678
22709
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double} \} \uplus
22679
22710
\{ \code{Z} \mapsto \code{Object} \} =
22680
- \{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, \code{Z} \mapsto \code{Object} \}$
22711
+ \{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, %
22712
+ \code{Z} \mapsto \code{Object} \}$
22681
22713
and
22682
- $\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{FutureOr<List<double>{}>} \} \uplus
22714
+ $\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto %
22715
+ \code{FutureOr<List<double>{}>} \} \uplus
22683
22716
\{ \code{Y} \mapsto \code{int} \} =
22684
22717
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{int} \}$.
22685
22718
Note that operator $\uplus$ is concerned with scopes and shadowing,
@@ -22729,28 +22762,6 @@ \subsubsection{Being a subtype}
22729
22762
each of the premises of $R$,
22730
22763
continuing until a rule with no premises is reached.
22731
22764
22732
- \LMHash{}%
22733
- The first premise in the
22734
- rules~\SrnLeftTypeAlias{} and~\SrnRightTypeAlias{}
22735
- is a type alias declaration.
22736
- This premise is satisfied in each of the following situations:
22737
-
22738
- \begin{itemize}
22739
- \item A non-generic type alias named $F$ is declared.
22740
- In this case $s$ is zero,
22741
- no assumptions are made about the existence
22742
- of any formal type parameters,
22743
- and actual type argument lists are omitted everywhere in the rule.
22744
- \item We may choose $s$ and \List{X}{1}{s} such that the following holds:
22745
- A generic type alias named $F$ is declared,
22746
- with formal type parameters \List{X}{1}{s}.
22747
- \commentary{%
22748
- Each formal type parameter $X_j$ may have a bound,
22749
- but the bounds are never used in this context,
22750
- so we do not introduce metavariables for them.%
22751
- }
22752
- \end{itemize}
22753
-
22754
22765
\LMHash{}%
22755
22766
Rule~\SrnRightFunction{} has as a premise that `$T$ is a function type'.
22756
22767
This means that $T$ is a type of one of the forms introduced in
@@ -22859,7 +22870,7 @@ \subsubsection{Informal Subtype Rule Descriptions}
22859
22870
the rule is also valid in any environment
22860
22871
and the environment is never used explicitly,
22861
22872
so we will not repeat that.
22862
- \Item{\SrnTop }{Top}
22873
+ \Item{\SrnRightTop }{Top}
22863
22874
Every type is a subtype of \code{Object},
22864
22875
every type is a subtype of \DYNAMIC,
22865
22876
and every type is a subtype of \VOID.
@@ -22871,19 +22882,11 @@ \subsubsection{Informal Subtype Rule Descriptions}
22871
22882
(\ref{superBoundedTypes}).
22872
22883
\Item{\SrnBottom}{Bottom}
22873
22884
Every type is a supertype of $\bot$.
22874
- \Item{\SrnNull}{Null}
22875
- Every type other than $\bot$ is a supertype of \code{Null}.
22876
- \Item{\SrnLeftTypeAlias}{Type Alias Left}
22877
- An application of a type alias to some actual type arguments is
22878
- a subtype of another type $T$
22879
- if the expansion of the type alias to the type that it denotes
22880
- is a subtype of $T$.
22881
- Note that a non-generic type alias is handled by letting $s = 0$.
22882
- \Item{\SrnRightTypeAlias}{Type Alias Right}
22883
- A type $S$ is a subtype of an application of a type alias
22884
- if $S$ is a subtype of
22885
- the expansion of the type alias to the type that it denotes.
22886
- Note that a non-generic type alias is handled by letting $s = 0$.
22885
+ \Item{\SrnNullOne}{Null 1}
22886
+ \code{Null} is a subtype of every type of the form \code{$T$?}.
22887
+ \Item{\SrnNullTwo}{Null 2}
22888
+ \code{Null} is a subtype of \code{FutureOr<$T$>}
22889
+ if \code{Null} is a subtype of $T$.
22887
22890
\Item{\SrnLeftFutureOr}{Left FutureOr}
22888
22891
The type \code{FutureOr<$S$>} is a subtype of a given type $T$
22889
22892
if $S$ is a subtype of $T$ and \code{Future<$S$>} is a subtype of $T$,
@@ -23354,11 +23357,10 @@ \subsection{Type Normalization}
23354
23357
(such as \code{Never} and $X$).
23355
23358
23356
23359
In particular, \SubtypeNE{S}{T} and \SubtypeNE{T}{S} holds if and only if
23357
- \NormalizedTypeOf{$T$} is syntactically equal to \NormalizedTypeOf{$S$},
23358
- modulo replacement of atomic top types,
23359
- and modulo replacement of terms derived from \synt{typeName}
23360
- denoting the same type
23361
- (such as \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
23360
+ \NormalizedTypeOf{$T$} has the same canonical syntax as \NormalizedTypeOf{$S$}
23361
+ (\ref{standardUpperBoundsAndStandardLowerBounds}),
23362
+ modulo replacement of atomic top types
23363
+ (e.g., \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
23362
23364
}
23363
23365
23364
23366
\LMHash{}%
@@ -23566,8 +23568,8 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23566
23568
}
23567
23569
23568
23570
\LMHash{}%
23569
- Consequently, when we say that two types $T_1$ and $T_2$ are
23570
- \IndexCustom{syntactically equal }{type!syntactically equal },
23571
+ Consequently, when we say that two types $T_1$ and $T_2$ have the
23572
+ \IndexCustom{same canonical syntax }{type!same canonical syntax },
23571
23573
it refers to the situation where both $T_1$ and $T_2$ have been
23572
23574
transformed in the above sense
23573
23575
(\commentary{by alpha-renaming, alias expansion, and canonical naming}).
@@ -23801,7 +23803,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23801
23803
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
23802
23804
23803
23805
\noindent
23804
- such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types ,
23806
+ such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax ,
23805
23807
and both have the same number of required positional parameters.
23806
23808
Let $q$ be $\metavar{min}(k, l)$,
23807
23809
let $T_3$ be \UpperBoundType{$T_1$}{$T_2$},
@@ -23831,7 +23833,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23831
23833
and consider the case where the following is satisfied:
23832
23834
23833
23835
\begin{itemize}
23834
- \item Each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
23836
+ \item Each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
23835
23837
\item For each required entry named $n$ in $\metavar{Named}_1$,
23836
23838
$\metavar{Named}_2$ contains an entry named $n$
23837
23839
(\commentary{which may or may not be required}).
@@ -24056,7 +24058,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
24056
24058
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
24057
24059
24058
24060
\noindent
24059
- such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
24061
+ such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
24060
24062
Let $q$ be $\metavar{max}(k, l)$,
24061
24063
let $T_3$ be \LowerBoundType{$T_1$}{$T_2$},
24062
24064
let $B_{3i}$ be $B_{1i}$, and
@@ -24093,7 +24095,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
24093
24095
where $\metavar{Named}_j$ declares a non-empty set of named parameters
24094
24096
with names $\metavar{NamesOfNamed}_j$, $j \in 1 .. 2$,
24095
24097
and consider the case where
24096
- each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
24098
+ each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
24097
24099
Then \DefEqualsNewline{\LowerBoundType{$U_1$}{$U_2$}}{%U_3}, where $U_3$ is
24098
24100
\code{$T_3$\,\FUNCTION<$X_1$\,\EXTENDS\,$B_{31}$,\,\ldots,\,$X_m$\,%
24099
24101
\EXTENDS\,$B_{3m}$>($P_{31}$,\,\ldots,\,$P_{3k}$,\,$\metavar{Named}_3$)}},
@@ -24637,9 +24639,10 @@ \subsection{Intersection Types}
24637
24639
24638
24640
\commentary{%
24639
24641
An intersection type will never occur as a nested type, that is,
24640
- it will never occurs as
24642
+ it never occurs as or in
24641
24643
an actual type argument in a parameterized type,
24642
- as a parameter type or a return type in a function type,
24644
+ a parameter type or a return type in a function type,
24645
+ a type parameter bound,
24643
24646
as the right operand of another intersection type,
24644
24647
or as the operand of the nullable type operator \lit{?}.%
24645
24648
}
@@ -24800,24 +24803,8 @@ \subsection{Type Type}
24800
24803
and let $S_j$ be \NormalizedTypeOf{$U_j$}, for $j \in 1 .. 2$
24801
24804
(\ref{typeNormalization}).
24802
24805
We then say that $T_1$ and $T_2$ are the \Index{same type}
24803
- if{}f $S_1$ and $S_2$ are syntactically equal,
24804
- up to equivalence of bound variables,
24805
- and up to replacement of identifiers or qualified identifiers
24806
- resolving to the same type declaration
24807
- (\commentary{%
24808
- e.g., \code{C} and \code{prefix.C} could resolve to
24809
- the same class declaration%
24810
- }),
24811
- and excluding the case where two identifiers or qualified identifiers
24812
- occurring at corresponding positions in $S_1$ and $S_2$
24813
- are syntactically identical,
24814
- but resolve to different declarations
24815
- (\commentary{%
24816
- e.g., one occurrence of \code{C} could resolve to a
24817
- class declaration imported from a library $L_1$,
24818
- and another occurrence of \code{C} could resolve to a
24819
- class declaration imported from a different library $L_2$%
24820
- }).
24806
+ if{}f $S_1$ and $S_2$ are have the same canonical syntax
24807
+ (\ref{standardUpperBoundsAndStandardLowerBounds}).
24821
24808
24822
24809
\LMHash{}%
24823
24810
A reified type identifies the underlying type in the sense that
@@ -26227,7 +26214,7 @@ \section*{Appendix: Algorithmic Subtyping}
26227
26214
\end{minipage}
26228
26215
%
26229
26216
\caption{Algorithmic subtype rules.
26230
- Rules \SrnTop --\SrnSuperinterface{} are unchanged and hence omitted here.}
26217
+ Rules \SrnRightTop --\SrnSuperinterface{} are unchanged and hence omitted here.}
26231
26218
\label{fig:algorithmicSubtypeRules}
26232
26219
\end{figure}
26233
26220
@@ -26288,7 +26275,7 @@ \section*{Appendix: Algorithmic Subtyping}
26288
26275
followed by the rule whose number is $N+1$.
26289
26276
\commentary{%
26290
26277
So the order is
26291
- \AppSrnReflexivity, \SrnTop --\SrnTypeVariableReflexivityA,
26278
+ \AppSrnReflexivity, \SrnRightTop --\SrnTypeVariableReflexivityA,
26292
26279
\AppSrnTypeVariableReflexivityB, \AppSrnTypeVariableReflexivityC,
26293
26280
\AppSrnTypeVariableReflexivityD,
26294
26281
\SrnRightPromotedVariable, and so on.%
0 commit comments