@@ -22225,43 +22225,41 @@ \subsection{Subtypes}
22225
22225
}
22226
22226
22227
22227
\LMHash{}%
22228
- %% TODO(eernst): Introduce these specialized intersection types
22229
- %% in a suitable location where type promotion is specified.
22230
- Types of the form
22231
- \IndexCustom{$X \& S$}{type!of the form $X \& S$}%
22232
- \IndexExtraEntry{\&@$X \& S$}
22233
- arise during static analysis due to type promotion
22228
+ Intersection types
22229
+ (\commentary{types of the form \code{$X$\,\&\,$S$}}),
22230
+ may arise during static analysis due to type promotion
22234
22231
(\ref{typePromotion}).
22235
22232
They never occur during execution,
22236
- they are never a type argument of another type,
22237
- nor a return type or a formal parameter type,
22238
- and it is always the case that $S$ is a subtype of the bound of $X$.
22239
- \commentary{%
22240
- The motivation for $X \& S$ is that it represents
22241
- the type of a local variable $v$
22242
- whose type is declared to be the type variable $X$,
22243
- and which is known to have type $S$ due to promotion.
22244
- Similarly, $X \& S$ may be seen as an intersection type,
22245
- which is a subtype of $X$ and also a subtype of $S$.
22246
- Intersection types are \emph{not} supported in general,
22247
- only in this special case.%
22248
- }
22249
- Every other form of type may occur during static analysis
22250
- as well as during execution,
22251
- and the subtype relationship is always determined in the same way.
22233
+ and there are many other restrictions on where they can occur
22234
+ (\ref{intersectionTypes}).
22235
+ However, their subtype relations are specified without restrictions.
22236
+ \commentary{%
22237
+ It causes no problems that these rules will not be used
22238
+ in their full generality.%
22239
+ }
22252
22240
22241
+ !!! Renumber!
22253
22242
% Subtype Rule Numbering
22254
22243
\newcommand{\SrnReflexivity}{1}
22255
- \newcommand{\SrnTop}{2}
22256
- \newcommand{\SrnBottom}{3}
22257
- \newcommand{\SrnNull}{4}
22258
- \newcommand{\SrnLeftTypeAlias}{5}
22259
- \newcommand{\SrnRightTypeAlias}{6}
22244
+ \newcommand{\SrnRightTop}{2}
22245
+ \newcommand{\SrnLeftTop}{3}
22246
+ \newcommand{\SrnBottom}{4}
22247
+ \newcommand{\SrnRightObjectOne}{5.1}
22248
+ \newcommand{\SrnRightObjectTwo}{5.2}
22249
+ \newcommand{\SrnRightObjectThree}{5.3}
22250
+ \newcommand{\SrnRightObjectFour}{5.4}
22251
+ \newcommand{\SrnNullOne}{6.1}
22252
+ \newcommand{\SrnNullTwo}{6.2}
22260
22253
\newcommand{\SrnLeftFutureOr}{7}
22254
+ \newcommand{\SrnLeftNullable}{7b}
22261
22255
\newcommand{\SrnTypeVariableReflexivityA}{8}
22262
22256
\newcommand{\SrnRightPromotedVariable}{9}
22263
22257
\newcommand{\SrnRightFutureOrA}{10}
22264
22258
\newcommand{\SrnRightFutureOrB}{11}
22259
+ \newcommand{\SrnRightNullableOne}{11b.1}
22260
+ \newcommand{\SrnRightNullableTwo}{11b.2}
22261
+ \newcommand{\SrnRightNullableThree}{11b.3}
22262
+ \newcommand{\SrnRightNullableFour}{11b.4}
22265
22263
\newcommand{\SrnLeftPromotedVariable}{12}
22266
22264
\newcommand{\SrnLeftVariableBound}{13}
22267
22265
\newcommand{\SrnRightFunction}{14}
@@ -22282,34 +22280,47 @@ \subsection{Subtypes}
22282
22280
\def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
22283
22281
%
22284
22282
\begin{minipage}[c]{0.49\textwidth}
22285
- \Axiom{\SrnReflexivity}{Reflexivity}{S}{S}
22286
- \Axiom{\SrnBottom}{Left Bottom}{\bot}{T}
22283
+ \Axiom{\SrnReflexivity}{Reflexivity}{T}{T}
22284
+ \Axiom{\SrnBottom}{Left Bottom}{\code{Never}}{T}
22285
+ \RuleRaw{\SrnRightObjectTwo}{Right Object 2}{%
22286
+ \SubtypeStd{S}{\code{Object}}}{\code{$X$\,\&\,$S$}}{\code{Object}}
22287
+ \RuleRaw{\SrnRightObjectThree}{Right Object 3}{%
22288
+ \SubtypeStd{S}{\code{Object}}}{\code{FutureOr<$S$>}}{\code{Object}}
22289
+ \Axiom{\SrnNullOne}{Left Null One}{\code{Null}}{\code{$T$?}}
22287
22290
\end{minipage}
22288
22291
\begin{minipage}[c]{0.49\textwidth}
22289
- \RuleRaw{\SrnTop}{Right Top}{T \in \{\code{Object}, \DYNAMIC, \VOID\}}{S}{T}
22290
- \RuleRaw{\SrnNull}{Left Null}{T \not= \bot}{\code{Null}}{T}
22292
+ \RuleRaw{\SrnRightTop}{Right Top}{%
22293
+ T \in \{\code{Object?}, \DYNAMIC, \VOID\}}{S}{T}
22294
+ \RuleRaw{\SrnLeftTop}{Left Top}{%
22295
+ S \in \{\DYNAMIC, \VOID\} & \SubtypeStd{\code{Object?}}{T}}{S}{T}
22296
+ \RuleRaw{\SrnRightObjectOne}{Right Object 1}{%
22297
+ \code{$X$\,\EXTENDS\,$B$} & \SubtypeStd{B}{\code{Object}}%
22298
+ }{X}{\code{Object}}
22299
+ \RuleRaw{\SrnRightObjectFour}{Right Object 4}{%
22300
+ $S$\,\not\in \{\code{Null}, \DYNAMIC, \VOID\}\\
22301
+ \mbox{$S$ is not of the form \code{$U$?}, $X$, %
22302
+ \code{$X$\,\&\,$U$}, \code{FutureOr<$U$>}}}{S}{\code{Object}}
22303
+ \Rule{\SrnNullTwo}{Left Null Two}{\code{Null}}{T}{%
22304
+ \code{Null}}{\code{FutureOr<$T$>}}
22291
22305
\end{minipage}
22292
22306
22293
- \ExtraVSP
22294
- \RuleRaw{\SrnLeftTypeAlias}{Type Alias Left}{%
22295
- \code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
22296
- \SubtypeStd{[S_1/X_1,\ldots,S_s/X_s]U}{T}}{\code{$F$<\List{S}{1}{s}>}}{T}
22297
- \RuleRaw{\SrnRightTypeAlias}{Type Alias Right}{%
22298
- \code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
22299
- \SubtypeStd{S}{[T_1/X_1,\ldots,T_s/X_s]U}}{S}{\code{$F$<\List{T}{1}{s}>}}
22300
-
22301
22307
\begin{minipage}[c]{0.49\textwidth}
22302
22308
\RuleTwo{\SrnLeftFutureOr}{Left FutureOr}{S}{T}{%
22303
22309
\code{Future<$S$>}}{T}{\code{FutureOr<$S$>}}{T}
22304
22310
\RuleTwo{\SrnRightPromotedVariable}{Right Promoted Variable}{S}{X}{S}{T}{%
22305
22311
S}{X \& T}
22306
22312
\Rule{\SrnRightFutureOrB}{Right FutureOr B}{S}{T}{S}{\code{FutureOr<$T$>}}
22313
+ \Rule{\SrnRightNullableTwo}{Right Nullable 2}{S}{\code{Null}}{S}{%
22314
+ \code{$T$?}}
22307
22315
\Rule{\SrnLeftVariableBound}{Left Variable Bound}{\Gamma(X)}{T}{X}{T}
22308
22316
\end{minipage}
22309
22317
\begin{minipage}[c]{0.49\textwidth}
22318
+ \RuleTwo{\SrnLeftNullable}{Left Nullable}{S}{T}{\code{Null}}{T}{
22319
+ \code{$S$?}}{T}
22310
22320
\Axiom{\SrnTypeVariableReflexivityA}{Left Promoted Variable A}{X \& S}{X}
22311
22321
\Rule{\SrnRightFutureOrA}{Right FutureOr A}{S}{\code{Future<$T$>}}{%
22312
22322
S}{\code{FutureOr<$T$>}}
22323
+ \Rule{\SrnRightNullableOne}{Right Nullable 1}{S}{T}{S}{\code{$T$?}}
22313
22324
\Rule{\SrnLeftPromotedVariable}{Left Promoted Variable B}{S}{T}{X \& S}{T}
22314
22325
\RuleRaw{\SrnRightFunction}{Right Function}{T\mbox{ is a function type}}{%
22315
22326
T}{\FUNCTION}
@@ -22345,6 +22356,7 @@ \subsection{Subtypes}
22345
22356
\forall j \in 1 .. s\!:\;\SubtypeStd{S_j}{T_j}}{%
22346
22357
\code{$C$<\List{S}{1}{s}>}}{\code{$C$<\List{T}{1}{s}>}}
22347
22358
\ExtraVSP
22359
+ %% !!! Should include mixins (and other non-class interface types, if any).
22348
22360
\RuleRaw{\SrnSuperinterface}{Superinterface}{%
22349
22361
\code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}}\\
22350
22362
\Superinterface{\code{$D$<\List{T}{1}{m}>}}{C} &
@@ -22396,10 +22408,9 @@ \subsubsection{Subtype Rules}
22396
22408
Whenever a rule contains one or more meta-variables,
22397
22409
that rule can be used by
22398
22410
\IndexCustom{instantiating}{instantiation!subtype rule}
22399
- it, that is, by consistently replacing
22400
- each occurrence of a given meta-variable by
22401
- concrete syntax denoting the same type
22402
- (\ref{typeType}).
22411
+ it, that is, by choosing a specific type $T$ and metavariable $\cal V$,
22412
+ and then consistently replacing all occurrences of $\cal V$ by
22413
+ concrete syntax denoting $T$.
22403
22414
22404
22415
\commentary{%
22405
22416
In general, this means that two or more occurrences of
@@ -22412,11 +22423,12 @@ \subsubsection{Subtype Rules}
22412
22423
can be used to conclude
22413
22424
\Subtype{\emptyset}{\code{int}}{\code{int}},
22414
22425
where $\emptyset$ denotes the empty environment
22415
- (any environment would suffice because no type variables occur).
22426
+ (any environment would suffice because no type variables occur).%
22427
+ }
22416
22428
22417
- However, the wording `denoting the same type' above covers
22418
- additional situations as well :
22419
- For instance, we may use rule~\SrnReflexivity{}
22429
+ \commentary{%
22430
+ The phrases `same type' and `identical syntax' deserves some extra scrutiny :
22431
+ We may, e.g., use rule~\SrnReflexivity{}
22420
22432
to show that \code{p1.C} is a subtype of
22421
22433
\code{p2.C} when \code{C} is a class declared in a
22422
22434
library $L$ which is imported by libraries $L_1$ and $L_2$ and
@@ -22445,8 +22457,27 @@ \subsubsection{Subtype Rules}
22445
22457
}
22446
22458
22447
22459
\LMHash{}%
22448
- Every \synt{typeName} used in a type mentioned in this section is assumed to
22449
- have no compile-time error and denote a type.
22460
+ In this section,
22461
+ the notion of two types $T_1$ and $T_2$ being the same type
22462
+ is taken to mean that $T_1$ and $T_2$ have the same canonical syntax
22463
+ (\ref{standardUpperBoundsAndStandardLowerBounds}).
22464
+
22465
+ \commentary{%
22466
+ In other words, we eliminate the difficulties associated with
22467
+ different syntax denoting the same type,
22468
+ and different types denoted by the same syntax,
22469
+ by assuming that every type in the program has been expressed
22470
+ in a manner where those situations never occur,
22471
+ because each type is denoted by the same globally unique syntax everywhere.
22472
+ Note that `same canonical syntax' also requires
22473
+ transitive expansion of all type aliases
22474
+ (\ref{typedef}).%
22475
+ }
22476
+
22477
+ \LMHash{}%
22478
+ Every \synt{typeName} used in a type mentioned in this section
22479
+ is assumed to have no compile-time error,
22480
+ and it is assumed to denote a type.
22450
22481
22451
22482
\commentary{%
22452
22483
That is, no subtyping relationship can be proven for
@@ -22494,9 +22525,11 @@ \subsubsection{Subtype Rules}
22494
22525
So
22495
22526
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double} \} \uplus
22496
22527
\{ \code{Z} \mapsto \code{Object} \} =
22497
- \{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, \code{Z} \mapsto \code{Object} \}$
22528
+ \{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, %
22529
+ \code{Z} \mapsto \code{Object} \}$
22498
22530
and
22499
- $\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{FutureOr<List<double>{}>} \} \uplus
22531
+ $\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto %
22532
+ \code{FutureOr<List<double>{}>} \} \uplus
22500
22533
\{ \code{Y} \mapsto \code{int} \} =
22501
22534
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{int} \}$.
22502
22535
Note that operator $\uplus$ is concerned with scopes and shadowing,
@@ -22546,28 +22579,6 @@ \subsubsection{Being a subtype}
22546
22579
each of the premises of $R$,
22547
22580
continuing until a rule with no premises is reached.
22548
22581
22549
- \LMHash{}%
22550
- The first premise in the
22551
- rules~\SrnLeftTypeAlias{} and~\SrnRightTypeAlias{}
22552
- is a type alias declaration.
22553
- This premise is satisfied in each of the following situations:
22554
-
22555
- \begin{itemize}
22556
- \item A non-generic type alias named $F$ is declared.
22557
- In this case $s$ is zero,
22558
- no assumptions are made about the existence
22559
- of any formal type parameters,
22560
- and actual type argument lists are omitted everywhere in the rule.
22561
- \item We may choose $s$ and \List{X}{1}{s} such that the following holds:
22562
- A generic type alias named $F$ is declared,
22563
- with formal type parameters \List{X}{1}{s}.
22564
- \commentary{%
22565
- Each formal type parameter $X_j$ may have a bound,
22566
- but the bounds are never used in this context,
22567
- so we do not introduce metavariables for them.%
22568
- }
22569
- \end{itemize}
22570
-
22571
22582
\LMHash{}%
22572
22583
Rule~\SrnRightFunction{} has as a premise that `$T$ is a function type'.
22573
22584
This means that $T$ is a type of one of the forms introduced in
@@ -22676,7 +22687,7 @@ \subsubsection{Informal Subtype Rule Descriptions}
22676
22687
the rule is also valid in any environment
22677
22688
and the environment is never used explicitly,
22678
22689
so we will not repeat that.
22679
- \Item{\SrnTop }{Top}
22690
+ \Item{\SrnRightTop }{Top}
22680
22691
Every type is a subtype of \code{Object},
22681
22692
every type is a subtype of \DYNAMIC,
22682
22693
and every type is a subtype of \VOID.
@@ -22688,19 +22699,11 @@ \subsubsection{Informal Subtype Rule Descriptions}
22688
22699
(\ref{superBoundedTypes}).
22689
22700
\Item{\SrnBottom}{Bottom}
22690
22701
Every type is a supertype of $\bot$.
22691
- \Item{\SrnNull}{Null}
22692
- Every type other than $\bot$ is a supertype of \code{Null}.
22693
- \Item{\SrnLeftTypeAlias}{Type Alias Left}
22694
- An application of a type alias to some actual type arguments is
22695
- a subtype of another type $T$
22696
- if the expansion of the type alias to the type that it denotes
22697
- is a subtype of $T$.
22698
- Note that a non-generic type alias is handled by letting $s = 0$.
22699
- \Item{\SrnRightTypeAlias}{Type Alias Right}
22700
- A type $S$ is a subtype of an application of a type alias
22701
- if $S$ is a subtype of
22702
- the expansion of the type alias to the type that it denotes.
22703
- Note that a non-generic type alias is handled by letting $s = 0$.
22702
+ \Item{\SrnNullOne}{Null 1}
22703
+ \code{Null} is a subtype of every type of the form \code{$T$?}.
22704
+ \Item{\SrnNullTwo}{Null 2}
22705
+ \code{Null} is a subtype of \code{FutureOr<$T$>}
22706
+ if \code{Null} is a subtype of $T$.
22704
22707
\Item{\SrnLeftFutureOr}{Left FutureOr}
22705
22708
The type \code{FutureOr<$S$>} is a subtype of a given type $T$
22706
22709
if $S$ is a subtype of $T$ and \code{Future<$S$>} is a subtype of $T$,
@@ -23169,11 +23172,10 @@ \subsection{Type Normalization}
23169
23172
(such as \code{Never} and $X$).
23170
23173
23171
23174
In particular, \SubtypeNE{S}{T} and \SubtypeNE{T}{S} holds if and only if
23172
- \NormalizedTypeOf{$T$} is syntactically equal to \NormalizedTypeOf{$S$},
23173
- modulo replacement of atomic top types,
23174
- and modulo replacement of terms derived from \synt{typeName}
23175
- denoting the same type
23176
- (such as \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
23175
+ \NormalizedTypeOf{$T$} has the same canonical syntax as \NormalizedTypeOf{$S$}
23176
+ (\ref{standardUpperBoundsAndStandardLowerBounds}),
23177
+ modulo replacement of atomic top types
23178
+ (e.g., \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
23177
23179
}
23178
23180
23179
23181
\LMHash{}%
@@ -23381,8 +23383,8 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23381
23383
}
23382
23384
23383
23385
\LMHash{}%
23384
- Consequently, when we say that two types $T_1$ and $T_2$ are
23385
- \IndexCustom{syntactically equal }{type!syntactically equal },
23386
+ Consequently, when we say that two types $T_1$ and $T_2$ have the
23387
+ \IndexCustom{same canonical syntax }{type!same canonical syntax },
23386
23388
it refers to the situation where both $T_1$ and $T_2$ have been
23387
23389
transformed in the above sense
23388
23390
(\commentary{by alpha-renaming, alias expansion, and canonical naming}).
@@ -23616,7 +23618,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23616
23618
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
23617
23619
23618
23620
\noindent
23619
- such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types ,
23621
+ such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax ,
23620
23622
and both have the same number of required positional parameters.
23621
23623
Let $q$ be $\metavar{min}(k, l)$,
23622
23624
let $T_3$ be \UpperBoundType{$T_1$}{$T_2$},
@@ -23646,7 +23648,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23646
23648
and consider the case where the following is satisfied:
23647
23649
23648
23650
\begin{itemize}
23649
- \item Each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
23651
+ \item Each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
23650
23652
\item For each required entry named $n$ in $\metavar{Named}_1$,
23651
23653
$\metavar{Named}_2$ contains an entry named $n$
23652
23654
(\commentary{which may or may not be required}).
@@ -23871,7 +23873,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23871
23873
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
23872
23874
23873
23875
\noindent
23874
- such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
23876
+ such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
23875
23877
Let $q$ be $\metavar{max}(k, l)$,
23876
23878
let $T_3$ be \LowerBoundType{$T_1$}{$T_2$},
23877
23879
let $B_{3i}$ be $B_{1i}$, and
@@ -23908,7 +23910,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
23908
23910
where $\metavar{Named}_j$ declares a non-empty set of named parameters
23909
23911
with names $\metavar{NamesOfNamed}_j$, $j \in 1 .. 2$,
23910
23912
and consider the case where
23911
- each $B_{1i}$ and $B_{2i}$ are syntactically equal types .
23913
+ each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax .
23912
23914
Then \DefEqualsNewline{\LowerBoundType{$U_1$}{$U_2$}}{%U_3}, where $U_3$ is
23913
23915
\code{$T_3$\,\FUNCTION<$X_1$\,\EXTENDS\,$B_{31}$,\,\ldots,\,$X_m$\,%
23914
23916
\EXTENDS\,$B_{3m}$>($P_{31}$,\,\ldots,\,$P_{3k}$,\,$\metavar{Named}_3$)}},
@@ -24452,9 +24454,10 @@ \subsection{Intersection Types}
24452
24454
24453
24455
\commentary{%
24454
24456
An intersection type will never occur as a nested type, that is,
24455
- it will never occurs as
24457
+ it never occurs as or in
24456
24458
an actual type argument in a parameterized type,
24457
- as a parameter type or a return type in a function type,
24459
+ a parameter type or a return type in a function type,
24460
+ a type parameter bound,
24458
24461
as the right operand of another intersection type,
24459
24462
or as the operand of the nullable type operator \lit{?}.%
24460
24463
}
@@ -24615,24 +24618,8 @@ \subsection{Type Type}
24615
24618
and let $S_j$ be \NormalizedTypeOf{$U_j$}, for $j \in 1 .. 2$
24616
24619
(\ref{typeNormalization}).
24617
24620
We then say that $T_1$ and $T_2$ are the \Index{same type}
24618
- if{}f $S_1$ and $S_2$ are syntactically equal,
24619
- up to equivalence of bound variables,
24620
- and up to replacement of identifiers or qualified identifiers
24621
- resolving to the same type declaration
24622
- (\commentary{%
24623
- e.g., \code{C} and \code{prefix.C} could resolve to
24624
- the same class declaration%
24625
- }),
24626
- and excluding the case where two identifiers or qualified identifiers
24627
- occurring at corresponding positions in $S_1$ and $S_2$
24628
- are syntactically identical,
24629
- but resolve to different declarations
24630
- (\commentary{%
24631
- e.g., one occurrence of \code{C} could resolve to a
24632
- class declaration imported from a library $L_1$,
24633
- and another occurrence of \code{C} could resolve to a
24634
- class declaration imported from a different library $L_2$%
24635
- }).
24621
+ if{}f $S_1$ and $S_2$ are have the same canonical syntax
24622
+ (\ref{standardUpperBoundsAndStandardLowerBounds}).
24636
24623
24637
24624
\LMHash{}%
24638
24625
A reified type identifies the underlying type in the sense that
@@ -26042,7 +26029,7 @@ \section*{Appendix: Algorithmic Subtyping}
26042
26029
\end{minipage}
26043
26030
%
26044
26031
\caption{Algorithmic subtype rules.
26045
- Rules \SrnTop --\SrnSuperinterface{} are unchanged and hence omitted here.}
26032
+ Rules \SrnRightTop --\SrnSuperinterface{} are unchanged and hence omitted here.}
26046
26033
\label{fig:algorithmicSubtypeRules}
26047
26034
\end{figure}
26048
26035
@@ -26103,7 +26090,7 @@ \section*{Appendix: Algorithmic Subtyping}
26103
26090
followed by the rule whose number is $N+1$.
26104
26091
\commentary{%
26105
26092
So the order is
26106
- \AppSrnReflexivity, \SrnTop --\SrnTypeVariableReflexivityA,
26093
+ \AppSrnReflexivity, \SrnRightTop --\SrnTypeVariableReflexivityA,
26107
26094
\AppSrnTypeVariableReflexivityB, \AppSrnTypeVariableReflexivityC,
26108
26095
\AppSrnTypeVariableReflexivityD,
26109
26096
\SrnRightPromotedVariable, and so on.%
0 commit comments