@@ -22087,43 +22087,41 @@ \subsection{Subtypes}
22087
22087
}
22088
22088
22089
22089
\LMHash{}%
22090
- %% TODO(eernst): Introduce these specialized intersection types
22091
- %% in a suitable location where type promotion is specified.
22092
- Types of the form
22093
- \IndexCustom{$X \& S$}{type!of the form $X \& S$}%
22094
- \IndexExtraEntry{\&@$X \& S$}
22095
- arise during static analysis due to type promotion
22090
+ Intersection types
22091
+ (\commentary{types of the form \code{$X$\,\&\,$S$}}),
22092
+ may arise during static analysis due to type promotion
22096
22093
(\ref{typePromotion}).
22097
22094
They never occur during execution,
22098
- they are never a type argument of another type,
22099
- nor a return type or a formal parameter type,
22100
- and it is always the case that $S$ is a subtype of the bound of $X$.
22101
- \commentary{%
22102
- The motivation for $X \& S$ is that it represents
22103
- the type of a local variable $v$
22104
- whose type is declared to be the type variable $X$,
22105
- and which is known to have type $S$ due to promotion.
22106
- Similarly, $X \& S$ may be seen as an intersection type,
22107
- which is a subtype of $X$ and also a subtype of $S$.
22108
- Intersection types are \emph{not} supported in general,
22109
- only in this special case.%
22110
- }
22111
- Every other form of type may occur during static analysis
22112
- as well as during execution,
22113
- and the subtype relationship is always determined in the same way.
22095
+ and there are many other restrictions on where they can occur
22096
+ (\ref{intersectionTypes}).
22097
+ However, their subtype relations are specified without restrictions.
22098
+ \commentary{%
22099
+ It causes no problems that these rules will not be used
22100
+ in their full generality.%
22101
+ }
22114
22102
22103
+ !!! Renumber!
22115
22104
% Subtype Rule Numbering
22116
22105
\newcommand{\SrnReflexivity}{1}
22117
- \newcommand{\SrnTop}{2}
22118
- \newcommand{\SrnBottom}{3}
22119
- \newcommand{\SrnNull}{4}
22120
- \newcommand{\SrnLeftTypeAlias}{5}
22121
- \newcommand{\SrnRightTypeAlias}{6}
22106
+ \newcommand{\SrnRightTop}{2}
22107
+ \newcommand{\SrnLeftTop}{3}
22108
+ \newcommand{\SrnBottom}{4}
22109
+ \newcommand{\SrnRightObjectOne}{5.1}
22110
+ \newcommand{\SrnRightObjectTwo}{5.2}
22111
+ \newcommand{\SrnRightObjectThree}{5.3}
22112
+ \newcommand{\SrnRightObjectFour}{5.4}
22113
+ \newcommand{\SrnNullOne}{6.1}
22114
+ \newcommand{\SrnNullTwo}{6.2}
22122
22115
\newcommand{\SrnLeftFutureOr}{7}
22116
+ \newcommand{\SrnLeftNullable}{7b}
22123
22117
\newcommand{\SrnTypeVariableReflexivityA}{8}
22124
22118
\newcommand{\SrnRightPromotedVariable}{9}
22125
22119
\newcommand{\SrnRightFutureOrA}{10}
22126
22120
\newcommand{\SrnRightFutureOrB}{11}
22121
+ \newcommand{\SrnRightNullableOne}{11b.1}
22122
+ \newcommand{\SrnRightNullableTwo}{11b.2}
22123
+ \newcommand{\SrnRightNullableThree}{11b.3}
22124
+ \newcommand{\SrnRightNullableFour}{11b.4}
22127
22125
\newcommand{\SrnLeftPromotedVariable}{12}
22128
22126
\newcommand{\SrnLeftVariableBound}{13}
22129
22127
\newcommand{\SrnRightFunction}{14}
@@ -22144,34 +22142,47 @@ \subsection{Subtypes}
22144
22142
\def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
22145
22143
%
22146
22144
\begin{minipage}[c]{0.49\textwidth}
22147
- \Axiom{\SrnReflexivity}{Reflexivity}{S}{S}
22148
- \Axiom{\SrnBottom}{Left Bottom}{\bot}{T}
22145
+ \Axiom{\SrnReflexivity}{Reflexivity}{T}{T}
22146
+ \Axiom{\SrnBottom}{Left Bottom}{\code{Never}}{T}
22147
+ \RuleRaw{\SrnRightObjectTwo}{Right Object 2}{%
22148
+ \SubtypeStd{S}{\code{Object}}}{\code{$X$\,\&\,$S$}}{\code{Object}}
22149
+ \RuleRaw{\SrnRightObjectThree}{Right Object 3}{%
22150
+ \SubtypeStd{S}{\code{Object}}}{\code{FutureOr<$S$>}}{\code{Object}}
22151
+ \Axiom{\SrnNullOne}{Left Null One}{\code{Null}}{\code{$T$?}}
22149
22152
\end{minipage}
22150
22153
\begin{minipage}[c]{0.49\textwidth}
22151
- \RuleRaw{\SrnTop}{Right Top}{T \in \{\code{Object}, \DYNAMIC, \VOID\}}{S}{T}
22152
- \RuleRaw{\SrnNull}{Left Null}{T \not= \bot}{\code{Null}}{T}
22154
+ \RuleRaw{\SrnRightTop}{Right Top}{%
22155
+ T \in \{\code{Object?}, \DYNAMIC, \VOID\}}{S}{T}
22156
+ \RuleRaw{\SrnLeftTop}{Left Top}{%
22157
+ S \in \{\DYNAMIC, \VOID\} & \SubtypeStd{\code{Object?}}{T}}{S}{T}
22158
+ \RuleRaw{\SrnRightObjectOne}{Right Object 1}{%
22159
+ \code{$X$\,\EXTENDS\,$B$} & \SubtypeStd{B}{\code{Object}}%
22160
+ }{X}{\code{Object}}
22161
+ \RuleRaw{\SrnRightObjectFour}{Right Object 4}{%
22162
+ $S$\,\not\in \{\code{Null}, \DYNAMIC, \VOID\}\\
22163
+ \mbox{$S$ is not of the form \code{$U$?}, $X$, %
22164
+ \code{$X$\,\&\,$U$}, \code{FutureOr<$U$>}}}{S}{\code{Object}}
22165
+ \Rule{\SrnNullTwo}{Left Null Two}{\code{Null}}{T}{%
22166
+ \code{Null}}{\code{FutureOr<$T$>}}
22153
22167
\end{minipage}
22154
22168
22155
- \ExtraVSP
22156
- \RuleRaw{\SrnLeftTypeAlias}{Type Alias Left}{%
22157
- \code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
22158
- \SubtypeStd{[S_1/X_1,\ldots,S_s/X_s]U}{T}}{\code{$F$<\List{S}{1}{s}>}}{T}
22159
- \RuleRaw{\SrnRightTypeAlias}{Type Alias Right}{%
22160
- \code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
22161
- \SubtypeStd{S}{[T_1/X_1,\ldots,T_s/X_s]U}}{S}{\code{$F$<\List{T}{1}{s}>}}
22162
-
22163
22169
\begin{minipage}[c]{0.49\textwidth}
22164
22170
\RuleTwo{\SrnLeftFutureOr}{Left FutureOr}{S}{T}{%
22165
22171
\code{Future<$S$>}}{T}{\code{FutureOr<$S$>}}{T}
22166
22172
\RuleTwo{\SrnRightPromotedVariable}{Right Promoted Variable}{S}{X}{S}{T}{%
22167
22173
S}{X \& T}
22168
22174
\Rule{\SrnRightFutureOrB}{Right FutureOr B}{S}{T}{S}{\code{FutureOr<$T$>}}
22175
+ \Rule{\SrnRightNullableTwo}{Right Nullable 2}{S}{\code{Null}}{S}{%
22176
+ \code{$T$?}}
22169
22177
\Rule{\SrnLeftVariableBound}{Left Variable Bound}{\Gamma(X)}{T}{X}{T}
22170
22178
\end{minipage}
22171
22179
\begin{minipage}[c]{0.49\textwidth}
22180
+ \RuleTwo{\SrnLeftNullable}{Left Nullable}{S}{T}{\code{Null}}{T}{
22181
+ \code{$S$?}}{T}
22172
22182
\Axiom{\SrnTypeVariableReflexivityA}{Left Promoted Variable A}{X \& S}{X}
22173
22183
\Rule{\SrnRightFutureOrA}{Right FutureOr A}{S}{\code{Future<$T$>}}{%
22174
22184
S}{\code{FutureOr<$T$>}}
22185
+ \Rule{\SrnRightNullableOne}{Right Nullable 1}{S}{T}{S}{\code{$T$?}}
22175
22186
\Rule{\SrnLeftPromotedVariable}{Left Promoted Variable B}{S}{T}{X \& S}{T}
22176
22187
\RuleRaw{\SrnRightFunction}{Right Function}{T\mbox{ is a function type}}{%
22177
22188
T}{\FUNCTION}
@@ -22207,6 +22218,7 @@ \subsection{Subtypes}
22207
22218
\forall j \in 1 .. s\!:\;\SubtypeStd{S_j}{T_j}}{%
22208
22219
\code{$C$<\List{S}{1}{s}>}}{\code{$C$<\List{T}{1}{s}>}}
22209
22220
\ExtraVSP
22221
+ %% !!! Should include mixins (and other non-class interface types, if any).
22210
22222
\RuleRaw{\SrnSuperinterface}{Superinterface}{%
22211
22223
\code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}}\\
22212
22224
\Superinterface{\code{$D$<\List{T}{1}{m}>}}{C} &
@@ -22258,10 +22270,9 @@ \subsubsection{Subtype Rules}
22258
22270
Whenever a rule contains one or more meta-variables,
22259
22271
that rule can be used by
22260
22272
\IndexCustom{instantiating}{instantiation!subtype rule}
22261
- it, that is, by consistently replacing
22262
- each occurrence of a given meta-variable by
22263
- concrete syntax denoting the same type
22264
- (\ref{typeType}).
22273
+ it, that is, by choosing a specific type $T$ and metavariable $\cal V$,
22274
+ and then consistently replacing all occurrences of $\cal V$ by
22275
+ concrete syntax denoting $T$.
22265
22276
22266
22277
\commentary{%
22267
22278
In general, this means that two or more occurrences of
@@ -22274,11 +22285,12 @@ \subsubsection{Subtype Rules}
22274
22285
can be used to conclude
22275
22286
\Subtype{\emptyset}{\code{int}}{\code{int}},
22276
22287
where $\emptyset$ denotes the empty environment
22277
- (any environment would suffice because no type variables occur).
22288
+ (any environment would suffice because no type variables occur).%
22289
+ }
22278
22290
22279
- However, the wording `denoting the same type' above covers
22280
- additional situations as well :
22281
- For instance, we may use rule~\SrnReflexivity{}
22291
+ \commentary{%
22292
+ The phrases `same type' and `identical syntax' deserves some extra scrutiny :
22293
+ We may, e.g., use rule~\SrnReflexivity{}
22282
22294
to show that \code{p1.C} is a subtype of
22283
22295
\code{p2.C} when \code{C} is a class declared in a
22284
22296
library $L$ which is imported by libraries $L_1$ and $L_2$ and
@@ -22307,8 +22319,27 @@ \subsubsection{Subtype Rules}
22307
22319
}
22308
22320
22309
22321
\LMHash{}%
22310
- Every \synt{typeName} used in a type mentioned in this section is assumed to
22311
- have no compile-time error and denote a type.
22322
+ In this section,
22323
+ the notion of two types $T_1$ and $T_2$ being the same type
22324
+ is taken to mean that $T_1$ and $T_2$ have the same canonical syntax
22325
+ (\ref{standardUpperBoundsAndStandardLowerBounds}).
22326
+
22327
+ \commentary{%
22328
+ In other words, we eliminate the difficulties associated with
22329
+ different syntax denoting the same type,
22330
+ and different types denoted by the same syntax,
22331
+ by assuming that every type in the program has been expressed
22332
+ in a manner where those situations never occur,
22333
+ because each type is denoted by the same globally unique syntax everywhere.
22334
+ Note that `same canonical syntax' also requires
22335
+ transitive expansion of all type aliases
22336
+ (\ref{typedef}).%
22337
+ }
22338
+
22339
+ \LMHash{}%
22340
+ Every \synt{typeName} used in a type mentioned in this section
22341
+ is assumed to have no compile-time error,
22342
+ and it is assumed to denote a type.
22312
22343
22313
22344
\commentary{%
22314
22345
That is, no subtyping relationship can be proven for
@@ -22356,9 +22387,11 @@ \subsubsection{Subtype Rules}
22356
22387
So
22357
22388
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double} \} \uplus
22358
22389
\{ \code{Z} \mapsto \code{Object} \} =
22359
- \{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, \code{Z} \mapsto \code{Object} \}$
22390
+ \{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, %
22391
+ \code{Z} \mapsto \code{Object} \}$
22360
22392
and
22361
- $\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{FutureOr<List<double>{}>} \} \uplus
22393
+ $\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto %
22394
+ \code{FutureOr<List<double>{}>} \} \uplus
22362
22395
\{ \code{Y} \mapsto \code{int} \} =
22363
22396
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{int} \}$.
22364
22397
Note that operator $\uplus$ is concerned with scopes and shadowing,
@@ -22408,28 +22441,6 @@ \subsubsection{Being a subtype}
22408
22441
each of the premises of $R$,
22409
22442
continuing until a rule with no premises is reached.
22410
22443
22411
- \LMHash{}%
22412
- The first premise in the
22413
- rules~\SrnLeftTypeAlias{} and~\SrnRightTypeAlias{}
22414
- is a type alias declaration.
22415
- This premise is satisfied in each of the following situations:
22416
-
22417
- \begin{itemize}
22418
- \item A non-generic type alias named $F$ is declared.
22419
- In this case $s$ is zero,
22420
- no assumptions are made about the existence
22421
- of any formal type parameters,
22422
- and actual type argument lists are omitted everywhere in the rule.
22423
- \item We may choose $s$ and \List{X}{1}{s} such that the following holds:
22424
- A generic type alias named $F$ is declared,
22425
- with formal type parameters \List{X}{1}{s}.
22426
- \commentary{%
22427
- Each formal type parameter $X_j$ may have a bound,
22428
- but the bounds are never used in this context,
22429
- so we do not introduce metavariables for them.%
22430
- }
22431
- \end{itemize}
22432
-
22433
22444
\LMHash{}%
22434
22445
Rule~\SrnRightFunction{} has as a premise that `$T$ is a function type'.
22435
22446
This means that $T$ is a type of one of the forms introduced in
@@ -22538,7 +22549,7 @@ \subsubsection{Informal Subtype Rule Descriptions}
22538
22549
the rule is also valid in any environment
22539
22550
and the environment is never used explicitly,
22540
22551
so we will not repeat that.
22541
- \Item{\SrnTop }{Top}
22552
+ \Item{\SrnRightTop }{Top}
22542
22553
Every type is a subtype of \code{Object},
22543
22554
every type is a subtype of \DYNAMIC,
22544
22555
and every type is a subtype of \VOID.
@@ -22550,19 +22561,11 @@ \subsubsection{Informal Subtype Rule Descriptions}
22550
22561
(\ref{superBoundedTypes}).
22551
22562
\Item{\SrnBottom}{Bottom}
22552
22563
Every type is a supertype of $\bot$.
22553
- \Item{\SrnNull}{Null}
22554
- Every type other than $\bot$ is a supertype of \code{Null}.
22555
- \Item{\SrnLeftTypeAlias}{Type Alias Left}
22556
- An application of a type alias to some actual type arguments is
22557
- a subtype of another type $T$
22558
- if the expansion of the type alias to the type that it denotes
22559
- is a subtype of $T$.
22560
- Note that a non-generic type alias is handled by letting $s = 0$.
22561
- \Item{\SrnRightTypeAlias}{Type Alias Right}
22562
- A type $S$ is a subtype of an application of a type alias
22563
- if $S$ is a subtype of
22564
- the expansion of the type alias to the type that it denotes.
22565
- Note that a non-generic type alias is handled by letting $s = 0$.
22564
+ \Item{\SrnNullOne}{Null 1}
22565
+ \code{Null} is a subtype of every type of the form \code{$T$?}.
22566
+ \Item{\SrnNullTwo}{Null 2}
22567
+ \code{Null} is a subtype of \code{FutureOr<$T$>}
22568
+ if \code{Null} is a subtype of $T$.
22566
22569
\Item{\SrnLeftFutureOr}{Left FutureOr}
22567
22570
The type \code{FutureOr<$S$>} is a subtype of a given type $T$
22568
22571
if $S$ is a subtype of $T$ and \code{Future<$S$>} is a subtype of $T$,
@@ -23031,11 +23034,10 @@ \subsection{Type Normalization}
23031
23034
(such as \code{Never} and $X$).
23032
23035
23033
23036
In particular, \SubtypeNE{S}{T} and \SubtypeNE{T}{S} holds if and only if
23034
- \NormalizedTypeOf{$T$} is syntactically equal to \NormalizedTypeOf{$S$},
23035
- modulo replacement of atomic top types,
23036
- and modulo replacement of terms derived from \synt{typeName}
23037
- denoting the same type
23038
- (such as \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
23037
+ \NormalizedTypeOf{$T$} has the same canonical syntax as \NormalizedTypeOf{$S$}
23038
+ (\ref{standardUpperBoundsAndStandardLowerBounds}),
23039
+ modulo replacement of atomic top types
23040
+ (e.g., \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
23039
23041
}
23040
23042
23041
23043
\LMHash{}%
@@ -23243,8 +23245,8 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23243
23245
}
23244
23246
23245
23247
\LMHash{}%
23246
- Consequently, when we say that two types $T_1$ and $T_2$ are
23247
- \IndexCustom{syntactically equal }{type!syntactically equal },
23248
+ Consequently, when we say that two types $T_1$ and $T_2$ have the
23249
+ \IndexCustom{same canonical syntax }{type!same canonical syntax },
23248
23250
it refers to the situation where both $T_1$ and $T_2$ have been
23249
23251
transformed in the above sense
23250
23252
(\commentary{by alpha-renaming, alias expansion, and canonical naming}).
@@ -23478,7 +23480,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23478
23480
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
23479
23481
23480
23482
\noindent
23481
- such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types ,
23483
+ such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax ,
23482
23484
and both have the same number of required positional parameters.
23483
23485
Let $q$ be $\metavar{min}(k, l)$,
23484
23486
let $T_3$ be \UpperBoundType{$T_1$}{$T_2$},
@@ -23508,7 +23510,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23508
23510
and consider the case where the following is satisfied:
23509
23511
23510
23512
\begin{itemize}
23511
- \item Each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
23513
+ \item Each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
23512
23514
\item For each required entry named $n$ in $\metavar{Named}_1$,
23513
23515
$\metavar{Named}_2$ contains an entry named $n$
23514
23516
(\commentary{which may or may not be required}).
@@ -23733,7 +23735,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23733
23735
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
23734
23736
23735
23737
\noindent
23736
- such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
23738
+ such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
23737
23739
Let $q$ be $\metavar{max}(k, l)$,
23738
23740
let $T_3$ be \LowerBoundType{$T_1$}{$T_2$},
23739
23741
let $B_{3i}$ be $B_{1i}$, and
@@ -23770,7 +23772,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23770
23772
where $\metavar{Named}_j$ declares a non-empty set of named parameters
23771
23773
with names $\metavar{NamesOfNamed}_j$, $j \in 1 .. 2$,
23772
23774
and consider the case where
23773
- each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
23775
+ each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
23774
23776
Then \DefEqualsNewline{\LowerBoundType{$U_1$}{$U_2$}}{%U_3}, where $U_3$ is
23775
23777
\code{$T_3$\,\FUNCTION<$X_1$\,\EXTENDS\,$B_{31}$,\,\ldots,\,$X_m$\,%
23776
23778
\EXTENDS\,$B_{3m}$>($P_{31}$,\,\ldots,\,$P_{3k}$,\,$\metavar{Named}_3$)}},
@@ -24314,9 +24316,10 @@ \subsection{Intersection Types}
24314
24316
24315
24317
\commentary{%
24316
24318
An intersection type will never occur as a nested type, that is,
24317
- it will never occurs as
24319
+ it never occurs as or in
24318
24320
an actual type argument in a parameterized type,
24319
- as a parameter type or a return type in a function type,
24321
+ a parameter type or a return type in a function type,
24322
+ a type parameter bound,
24320
24323
as the right operand of another intersection type,
24321
24324
or as the operand of the nullable type operator \lit{?}.%
24322
24325
}
@@ -24477,24 +24480,8 @@ \subsection{Type Type}
24477
24480
and let $S_j$ be \NormalizedTypeOf{$U_j$}, for $j \in 1 .. 2$
24478
24481
(\ref{typeNormalization}).
24479
24482
We then say that $T_1$ and $T_2$ are the \Index{same type}
24480
- if{}f $S_1$ and $S_2$ are syntactically equal,
24481
- up to equivalence of bound variables,
24482
- and up to replacement of identifiers or qualified identifiers
24483
- resolving to the same type declaration
24484
- (\commentary{%
24485
- e.g., \code{C} and \code{prefix.C} could resolve to
24486
- the same class declaration%
24487
- }),
24488
- and excluding the case where two identifiers or qualified identifiers
24489
- occurring at corresponding positions in $S_1$ and $S_2$
24490
- are syntactically identical,
24491
- but resolve to different declarations
24492
- (\commentary{%
24493
- e.g., one occurrence of \code{C} could resolve to a
24494
- class declaration imported from a library $L_1$,
24495
- and another occurrence of \code{C} could resolve to a
24496
- class declaration imported from a different library $L_2$%
24497
- }).
24483
+ if{}f $S_1$ and $S_2$ are have the same canonical syntax
24484
+ (\ref{standardUpperBoundsAndStandardLowerBounds}).
24498
24485
24499
24486
\LMHash{}%
24500
24487
A reified type identifies the underlying type in the sense that
@@ -25903,7 +25890,7 @@ \section*{Appendix: Algorithmic Subtyping}
25903
25890
\end{minipage}
25904
25891
%
25905
25892
\caption{Algorithmic subtype rules.
25906
- Rules \SrnTop --\SrnSuperinterface{} are unchanged and hence omitted here.}
25893
+ Rules \SrnRightTop --\SrnSuperinterface{} are unchanged and hence omitted here.}
25907
25894
\label{fig:algorithmicSubtypeRules}
25908
25895
\end{figure}
25909
25896
@@ -25964,7 +25951,7 @@ \section*{Appendix: Algorithmic Subtyping}
25964
25951
followed by the rule whose number is $N+1$.
25965
25952
\commentary{%
25966
25953
So the order is
25967
- \AppSrnReflexivity, \SrnTop --\SrnTypeVariableReflexivityA,
25954
+ \AppSrnReflexivity, \SrnRightTop --\SrnTypeVariableReflexivityA,
25968
25955
\AppSrnTypeVariableReflexivityB, \AppSrnTypeVariableReflexivityC,
25969
25956
\AppSrnTypeVariableReflexivityD,
25970
25957
\SrnRightPromotedVariable, and so on.%
0 commit comments