@@ -21960,43 +21960,41 @@ \subsection{Subtypes}
21960
21960
}
21961
21961
21962
21962
\LMHash{}%
21963
- %% TODO(eernst): Introduce these specialized intersection types
21964
- %% in a suitable location where type promotion is specified.
21965
- Types of the form
21966
- \IndexCustom{$X \& S$}{type!of the form $X \& S$}%
21967
- \IndexExtraEntry{\&@$X \& S$}
21968
- arise during static analysis due to type promotion
21963
+ Intersection types
21964
+ (\commentary{types of the form \code{$X$\,\&\,$S$}}),
21965
+ may arise during static analysis due to type promotion
21969
21966
(\ref{typePromotion}).
21970
21967
They never occur during execution,
21971
- they are never a type argument of another type,
21972
- nor a return type or a formal parameter type,
21973
- and it is always the case that $S$ is a subtype of the bound of $X$.
21974
- \commentary{%
21975
- The motivation for $X \& S$ is that it represents
21976
- the type of a local variable $v$
21977
- whose type is declared to be the type variable $X$,
21978
- and which is known to have type $S$ due to promotion.
21979
- Similarly, $X \& S$ may be seen as an intersection type,
21980
- which is a subtype of $X$ and also a subtype of $S$.
21981
- Intersection types are \emph{not} supported in general,
21982
- only in this special case.%
21983
- }
21984
- Every other form of type may occur during static analysis
21985
- as well as during execution,
21986
- and the subtype relationship is always determined in the same way.
21968
+ and there are many other restrictions on where they can occur
21969
+ (\ref{intersectionTypes}).
21970
+ However, their subtype relations are specified without restrictions.
21971
+ \commentary{%
21972
+ It causes no problems that these rules will not be used
21973
+ in their full generality.%
21974
+ }
21987
21975
21976
+ !!! Renumber!
21988
21977
% Subtype Rule Numbering
21989
21978
\newcommand{\SrnReflexivity}{1}
21990
- \newcommand{\SrnTop}{2}
21991
- \newcommand{\SrnBottom}{3}
21992
- \newcommand{\SrnNull}{4}
21993
- \newcommand{\SrnLeftTypeAlias}{5}
21994
- \newcommand{\SrnRightTypeAlias}{6}
21979
+ \newcommand{\SrnRightTop}{2}
21980
+ \newcommand{\SrnLeftTop}{3}
21981
+ \newcommand{\SrnBottom}{4}
21982
+ \newcommand{\SrnRightObjectOne}{5.1}
21983
+ \newcommand{\SrnRightObjectTwo}{5.2}
21984
+ \newcommand{\SrnRightObjectThree}{5.3}
21985
+ \newcommand{\SrnRightObjectFour}{5.4}
21986
+ \newcommand{\SrnNullOne}{6.1}
21987
+ \newcommand{\SrnNullTwo}{6.2}
21995
21988
\newcommand{\SrnLeftFutureOr}{7}
21989
+ \newcommand{\SrnLeftNullable}{7b}
21996
21990
\newcommand{\SrnTypeVariableReflexivityA}{8}
21997
21991
\newcommand{\SrnRightPromotedVariable}{9}
21998
21992
\newcommand{\SrnRightFutureOrA}{10}
21999
21993
\newcommand{\SrnRightFutureOrB}{11}
21994
+ \newcommand{\SrnRightNullableOne}{11b.1}
21995
+ \newcommand{\SrnRightNullableTwo}{11b.2}
21996
+ \newcommand{\SrnRightNullableThree}{11b.3}
21997
+ \newcommand{\SrnRightNullableFour}{11b.4}
22000
21998
\newcommand{\SrnLeftPromotedVariable}{12}
22001
21999
\newcommand{\SrnLeftVariableBound}{13}
22002
22000
\newcommand{\SrnRightFunction}{14}
@@ -22017,34 +22015,47 @@ \subsection{Subtypes}
22017
22015
\def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
22018
22016
%
22019
22017
\begin{minipage}[c]{0.49\textwidth}
22020
- \Axiom{\SrnReflexivity}{Reflexivity}{S}{S}
22021
- \Axiom{\SrnBottom}{Left Bottom}{\bot}{T}
22018
+ \Axiom{\SrnReflexivity}{Reflexivity}{T}{T}
22019
+ \Axiom{\SrnBottom}{Left Bottom}{\code{Never}}{T}
22020
+ \RuleRaw{\SrnRightObjectTwo}{Right Object 2}{%
22021
+ \SubtypeStd{S}{\code{Object}}}{\code{$X$\,\&\,$S$}}{\code{Object}}
22022
+ \RuleRaw{\SrnRightObjectThree}{Right Object 3}{%
22023
+ \SubtypeStd{S}{\code{Object}}}{\code{FutureOr<$S$>}}{\code{Object}}
22024
+ \Axiom{\SrnNullOne}{Left Null One}{\code{Null}}{\code{$T$?}}
22022
22025
\end{minipage}
22023
22026
\begin{minipage}[c]{0.49\textwidth}
22024
- \RuleRaw{\SrnTop}{Right Top}{T \in \{\code{Object}, \DYNAMIC, \VOID\}}{S}{T}
22025
- \RuleRaw{\SrnNull}{Left Null}{T \not= \bot}{\code{Null}}{T}
22027
+ \RuleRaw{\SrnRightTop}{Right Top}{%
22028
+ T \in \{\code{Object?}, \DYNAMIC, \VOID\}}{S}{T}
22029
+ \RuleRaw{\SrnLeftTop}{Left Top}{%
22030
+ S \in \{\DYNAMIC, \VOID\} & \SubtypeStd{\code{Object?}}{T}}{S}{T}
22031
+ \RuleRaw{\SrnRightObjectOne}{Right Object 1}{%
22032
+ \code{$X$\,\EXTENDS\,$B$} & \SubtypeStd{B}{\code{Object}}%
22033
+ }{X}{\code{Object}}
22034
+ \RuleRaw{\SrnRightObjectFour}{Right Object 4}{%
22035
+ $S$\,\not\in \{\code{Null}, \DYNAMIC, \VOID\}\\
22036
+ \mbox{$S$ is not of the form \code{$U$?}, $X$, %
22037
+ \code{$X$\,\&\,$U$}, \code{FutureOr<$U$>}}}{S}{\code{Object}}
22038
+ \Rule{\SrnNullTwo}{Left Null Two}{\code{Null}}{T}{%
22039
+ \code{Null}}{\code{FutureOr<$T$>}}
22026
22040
\end{minipage}
22027
22041
22028
- \ExtraVSP
22029
- \RuleRaw{\SrnLeftTypeAlias}{Type Alias Left}{%
22030
- \code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
22031
- \SubtypeStd{[S_1/X_1,\ldots,S_s/X_s]U}{T}}{\code{$F$<\List{S}{1}{s}>}}{T}
22032
- \RuleRaw{\SrnRightTypeAlias}{Type Alias Right}{%
22033
- \code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
22034
- \SubtypeStd{S}{[T_1/X_1,\ldots,T_s/X_s]U}}{S}{\code{$F$<\List{T}{1}{s}>}}
22035
-
22036
22042
\begin{minipage}[c]{0.49\textwidth}
22037
22043
\RuleTwo{\SrnLeftFutureOr}{Left FutureOr}{S}{T}{%
22038
22044
\code{Future<$S$>}}{T}{\code{FutureOr<$S$>}}{T}
22039
22045
\RuleTwo{\SrnRightPromotedVariable}{Right Promoted Variable}{S}{X}{S}{T}{%
22040
22046
S}{X \& T}
22041
22047
\Rule{\SrnRightFutureOrB}{Right FutureOr B}{S}{T}{S}{\code{FutureOr<$T$>}}
22048
+ \Rule{\SrnRightNullableTwo}{Right Nullable 2}{S}{\code{Null}}{S}{%
22049
+ \code{$T$?}}
22042
22050
\Rule{\SrnLeftVariableBound}{Left Variable Bound}{\Gamma(X)}{T}{X}{T}
22043
22051
\end{minipage}
22044
22052
\begin{minipage}[c]{0.49\textwidth}
22053
+ \RuleTwo{\SrnLeftNullable}{Left Nullable}{S}{T}{\code{Null}}{T}{
22054
+ \code{$S$?}}{T}
22045
22055
\Axiom{\SrnTypeVariableReflexivityA}{Left Promoted Variable A}{X \& S}{X}
22046
22056
\Rule{\SrnRightFutureOrA}{Right FutureOr A}{S}{\code{Future<$T$>}}{%
22047
22057
S}{\code{FutureOr<$T$>}}
22058
+ \Rule{\SrnRightNullableOne}{Right Nullable 1}{S}{T}{S}{\code{$T$?}}
22048
22059
\Rule{\SrnLeftPromotedVariable}{Left Promoted Variable B}{S}{T}{X \& S}{T}
22049
22060
\RuleRaw{\SrnRightFunction}{Right Function}{T\mbox{ is a function type}}{%
22050
22061
T}{\FUNCTION}
@@ -22080,6 +22091,7 @@ \subsection{Subtypes}
22080
22091
\forall j \in 1 .. s\!:\;\SubtypeStd{S_j}{T_j}}{%
22081
22092
\code{$C$<\List{S}{1}{s}>}}{\code{$C$<\List{T}{1}{s}>}}
22082
22093
\ExtraVSP
22094
+ %% !!! Should include mixins (and other non-class interface types, if any).
22083
22095
\RuleRaw{\SrnSuperinterface}{Superinterface}{%
22084
22096
\code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}}\\
22085
22097
\Superinterface{\code{$D$<\List{T}{1}{m}>}}{C} &
@@ -22131,10 +22143,9 @@ \subsubsection{Subtype Rules}
22131
22143
Whenever a rule contains one or more meta-variables,
22132
22144
that rule can be used by
22133
22145
\IndexCustom{instantiating}{instantiation!subtype rule}
22134
- it, that is, by consistently replacing
22135
- each occurrence of a given meta-variable by
22136
- concrete syntax denoting the same type
22137
- (\ref{typeType}).
22146
+ it, that is, by choosing a specific type $T$ and metavariable $\cal V$,
22147
+ and then consistently replacing all occurrences of $\cal V$ by
22148
+ concrete syntax denoting $T$.
22138
22149
22139
22150
\commentary{%
22140
22151
In general, this means that two or more occurrences of
@@ -22147,11 +22158,12 @@ \subsubsection{Subtype Rules}
22147
22158
can be used to conclude
22148
22159
\Subtype{\emptyset}{\code{int}}{\code{int}},
22149
22160
where $\emptyset$ denotes the empty environment
22150
- (any environment would suffice because no type variables occur).
22161
+ (any environment would suffice because no type variables occur).%
22162
+ }
22151
22163
22152
- However, the wording `denoting the same type' above covers
22153
- additional situations as well :
22154
- For instance, we may use rule~\SrnReflexivity{}
22164
+ \commentary{%
22165
+ The phrases `same type' and `identical syntax' deserves some extra scrutiny :
22166
+ We may, e.g., use rule~\SrnReflexivity{}
22155
22167
to show that \code{p1.C} is a subtype of
22156
22168
\code{p2.C} when \code{C} is a class declared in a
22157
22169
library $L$ which is imported by libraries $L_1$ and $L_2$ and
@@ -22180,8 +22192,27 @@ \subsubsection{Subtype Rules}
22180
22192
}
22181
22193
22182
22194
\LMHash{}%
22183
- Every \synt{typeName} used in a type mentioned in this section is assumed to
22184
- have no compile-time error and denote a type.
22195
+ In this section,
22196
+ the notion of two types $T_1$ and $T_2$ being the same type
22197
+ is taken to mean that $T_1$ and $T_2$ have the same canonical syntax
22198
+ (\ref{standardUpperBoundsAndStandardLowerBounds}).
22199
+
22200
+ \commentary{%
22201
+ In other words, we eliminate the difficulties associated with
22202
+ different syntax denoting the same type,
22203
+ and different types denoted by the same syntax,
22204
+ by assuming that every type in the program has been expressed
22205
+ in a manner where those situations never occur,
22206
+ because each type is denoted by the same globally unique syntax everywhere.
22207
+ Note that `same canonical syntax' also requires
22208
+ transitive expansion of all type aliases
22209
+ (\ref{typedef}).%
22210
+ }
22211
+
22212
+ \LMHash{}%
22213
+ Every \synt{typeName} used in a type mentioned in this section
22214
+ is assumed to have no compile-time error,
22215
+ and it is assumed to denote a type.
22185
22216
22186
22217
\commentary{%
22187
22218
That is, no subtyping relationship can be proven for
@@ -22229,9 +22260,11 @@ \subsubsection{Subtype Rules}
22229
22260
So
22230
22261
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double} \} \uplus
22231
22262
\{ \code{Z} \mapsto \code{Object} \} =
22232
- \{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, \code{Z} \mapsto \code{Object} \}$
22263
+ \{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, %
22264
+ \code{Z} \mapsto \code{Object} \}$
22233
22265
and
22234
- $\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{FutureOr<List<double>{}>} \} \uplus
22266
+ $\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto %
22267
+ \code{FutureOr<List<double>{}>} \} \uplus
22235
22268
\{ \code{Y} \mapsto \code{int} \} =
22236
22269
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{int} \}$.
22237
22270
Note that operator $\uplus$ is concerned with scopes and shadowing,
@@ -22281,28 +22314,6 @@ \subsubsection{Being a subtype}
22281
22314
each of the premises of $R$,
22282
22315
continuing until a rule with no premises is reached.
22283
22316
22284
- \LMHash{}%
22285
- The first premise in the
22286
- rules~\SrnLeftTypeAlias{} and~\SrnRightTypeAlias{}
22287
- is a type alias declaration.
22288
- This premise is satisfied in each of the following situations:
22289
-
22290
- \begin{itemize}
22291
- \item A non-generic type alias named $F$ is declared.
22292
- In this case $s$ is zero,
22293
- no assumptions are made about the existence
22294
- of any formal type parameters,
22295
- and actual type argument lists are omitted everywhere in the rule.
22296
- \item We may choose $s$ and \List{X}{1}{s} such that the following holds:
22297
- A generic type alias named $F$ is declared,
22298
- with formal type parameters \List{X}{1}{s}.
22299
- \commentary{%
22300
- Each formal type parameter $X_j$ may have a bound,
22301
- but the bounds are never used in this context,
22302
- so we do not introduce metavariables for them.%
22303
- }
22304
- \end{itemize}
22305
-
22306
22317
\LMHash{}%
22307
22318
Rule~\SrnRightFunction{} has as a premise that `$T$ is a function type'.
22308
22319
This means that $T$ is a type of one of the forms introduced in
@@ -22411,7 +22422,7 @@ \subsubsection{Informal Subtype Rule Descriptions}
22411
22422
the rule is also valid in any environment
22412
22423
and the environment is never used explicitly,
22413
22424
so we will not repeat that.
22414
- \Item{\SrnTop }{Top}
22425
+ \Item{\SrnRightTop }{Top}
22415
22426
Every type is a subtype of \code{Object},
22416
22427
every type is a subtype of \DYNAMIC,
22417
22428
and every type is a subtype of \VOID.
@@ -22423,19 +22434,11 @@ \subsubsection{Informal Subtype Rule Descriptions}
22423
22434
(\ref{superBoundedTypes}).
22424
22435
\Item{\SrnBottom}{Bottom}
22425
22436
Every type is a supertype of $\bot$.
22426
- \Item{\SrnNull}{Null}
22427
- Every type other than $\bot$ is a supertype of \code{Null}.
22428
- \Item{\SrnLeftTypeAlias}{Type Alias Left}
22429
- An application of a type alias to some actual type arguments is
22430
- a subtype of another type $T$
22431
- if the expansion of the type alias to the type that it denotes
22432
- is a subtype of $T$.
22433
- Note that a non-generic type alias is handled by letting $s = 0$.
22434
- \Item{\SrnRightTypeAlias}{Type Alias Right}
22435
- A type $S$ is a subtype of an application of a type alias
22436
- if $S$ is a subtype of
22437
- the expansion of the type alias to the type that it denotes.
22438
- Note that a non-generic type alias is handled by letting $s = 0$.
22437
+ \Item{\SrnNullOne}{Null 1}
22438
+ \code{Null} is a subtype of every type of the form \code{$T$?}.
22439
+ \Item{\SrnNullTwo}{Null 2}
22440
+ \code{Null} is a subtype of \code{FutureOr<$T$>}
22441
+ if \code{Null} is a subtype of $T$.
22439
22442
\Item{\SrnLeftFutureOr}{Left FutureOr}
22440
22443
The type \code{FutureOr<$S$>} is a subtype of a given type $T$
22441
22444
if $S$ is a subtype of $T$ and \code{Future<$S$>} is a subtype of $T$,
@@ -22904,11 +22907,10 @@ \subsection{Type Normalization}
22904
22907
(such as \code{Never} and $X$).
22905
22908
22906
22909
In particular, \SubtypeNE{S}{T} and \SubtypeNE{T}{S} holds if and only if
22907
- \NormalizedTypeOf{$T$} is syntactically equal to \NormalizedTypeOf{$S$},
22908
- modulo replacement of atomic top types,
22909
- and modulo replacement of terms derived from \synt{typeName}
22910
- denoting the same type
22911
- (such as \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
22910
+ \NormalizedTypeOf{$T$} has the same canonical syntax as \NormalizedTypeOf{$S$}
22911
+ (\ref{standardUpperBoundsAndStandardLowerBounds}),
22912
+ modulo replacement of atomic top types
22913
+ (e.g., \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
22912
22914
}
22913
22915
22914
22916
\LMHash{}%
@@ -23116,8 +23118,8 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23116
23118
}
23117
23119
23118
23120
\LMHash{}%
23119
- Consequently, when we say that two types $T_1$ and $T_2$ are
23120
- \IndexCustom{syntactically equal }{type!syntactically equal },
23121
+ Consequently, when we say that two types $T_1$ and $T_2$ have the
23122
+ \IndexCustom{same canonical syntax }{type!same canonical syntax },
23121
23123
it refers to the situation where both $T_1$ and $T_2$ have been
23122
23124
transformed in the above sense
23123
23125
(\commentary{by alpha-renaming, alias expansion, and canonical naming}).
@@ -23351,7 +23353,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23351
23353
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
23352
23354
23353
23355
\noindent
23354
- such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types ,
23356
+ such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax ,
23355
23357
and both have the same number of required positional parameters.
23356
23358
Let $q$ be $\metavar{min}(k, l)$,
23357
23359
let $T_3$ be \UpperBoundType{$T_1$}{$T_2$},
@@ -23381,7 +23383,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23381
23383
and consider the case where the following is satisfied:
23382
23384
23383
23385
\begin{itemize}
23384
- \item Each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
23386
+ \item Each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
23385
23387
\item For each required entry named $n$ in $\metavar{Named}_1$,
23386
23388
$\metavar{Named}_2$ contains an entry named $n$
23387
23389
(\commentary{which may or may not be required}).
@@ -23606,7 +23608,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23606
23608
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
23607
23609
23608
23610
\noindent
23609
- such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
23611
+ such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
23610
23612
Let $q$ be $\metavar{max}(k, l)$,
23611
23613
let $T_3$ be \LowerBoundType{$T_1$}{$T_2$},
23612
23614
let $B_{3i}$ be $B_{1i}$, and
@@ -23643,7 +23645,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23643
23645
where $\metavar{Named}_j$ declares a non-empty set of named parameters
23644
23646
with names $\metavar{NamesOfNamed}_j$, $j \in 1 .. 2$,
23645
23647
and consider the case where
23646
- each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
23648
+ each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
23647
23649
Then \DefEqualsNewline{\LowerBoundType{$U_1$}{$U_2$}}{%U_3}, where $U_3$ is
23648
23650
\code{$T_3$\,\FUNCTION<$X_1$\,\EXTENDS\,$B_{31}$,\,\ldots,\,$X_m$\,%
23649
23651
\EXTENDS\,$B_{3m}$>($P_{31}$,\,\ldots,\,$P_{3k}$,\,$\metavar{Named}_3$)}},
@@ -24187,9 +24189,10 @@ \subsection{Intersection Types}
24187
24189
24188
24190
\commentary{%
24189
24191
An intersection type will never occur as a nested type, that is,
24190
- it will never occurs as
24192
+ it never occurs as or in
24191
24193
an actual type argument in a parameterized type,
24192
- as a parameter type or a return type in a function type,
24194
+ a parameter type or a return type in a function type,
24195
+ a type parameter bound,
24193
24196
as the right operand of another intersection type,
24194
24197
or as the operand of the nullable type operator \lit{?}.%
24195
24198
}
@@ -24350,24 +24353,8 @@ \subsection{Type Type}
24350
24353
and let $S_j$ be \NormalizedTypeOf{$U_j$}, for $j \in 1 .. 2$
24351
24354
(\ref{typeNormalization}).
24352
24355
We then say that $T_1$ and $T_2$ are the \Index{same type}
24353
- if{}f $S_1$ and $S_2$ are syntactically equal,
24354
- up to equivalence of bound variables,
24355
- and up to replacement of identifiers or qualified identifiers
24356
- resolving to the same type declaration
24357
- (\commentary{%
24358
- e.g., \code{C} and \code{prefix.C} could resolve to
24359
- the same class declaration%
24360
- }),
24361
- and excluding the case where two identifiers or qualified identifiers
24362
- occurring at corresponding positions in $S_1$ and $S_2$
24363
- are syntactically identical,
24364
- but resolve to different declarations
24365
- (\commentary{%
24366
- e.g., one occurrence of \code{C} could resolve to a
24367
- class declaration imported from a library $L_1$,
24368
- and another occurrence of \code{C} could resolve to a
24369
- class declaration imported from a different library $L_2$%
24370
- }).
24356
+ if{}f $S_1$ and $S_2$ are have the same canonical syntax
24357
+ (\ref{standardUpperBoundsAndStandardLowerBounds}).
24371
24358
24372
24359
\LMHash{}%
24373
24360
A reified type identifies the underlying type in the sense that
@@ -25776,7 +25763,7 @@ \section*{Appendix: Algorithmic Subtyping}
25776
25763
\end{minipage}
25777
25764
%
25778
25765
\caption{Algorithmic subtype rules.
25779
- Rules \SrnTop --\SrnSuperinterface{} are unchanged and hence omitted here.}
25766
+ Rules \SrnRightTop --\SrnSuperinterface{} are unchanged and hence omitted here.}
25780
25767
\label{fig:algorithmicSubtypeRules}
25781
25768
\end{figure}
25782
25769
@@ -25837,7 +25824,7 @@ \section*{Appendix: Algorithmic Subtyping}
25837
25824
followed by the rule whose number is $N+1$.
25838
25825
\commentary{%
25839
25826
So the order is
25840
- \AppSrnReflexivity, \SrnTop --\SrnTypeVariableReflexivityA,
25827
+ \AppSrnReflexivity, \SrnRightTop --\SrnTypeVariableReflexivityA,
25841
25828
\AppSrnTypeVariableReflexivityB, \AppSrnTypeVariableReflexivityC,
25842
25829
\AppSrnTypeVariableReflexivityD,
25843
25830
\SrnRightPromotedVariable, and so on.%
0 commit comments