Skip to content

Commit 3d3c42d

Browse files
committed
Rebase
1 parent 906c4b1 commit 3d3c42d

File tree

1 file changed

+107
-120
lines changed

1 file changed

+107
-120
lines changed

specification/dartLangSpec.tex

Lines changed: 107 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -22408,43 +22408,41 @@ \subsection{Subtypes}
2240822408
}
2240922409

2241022410
\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
2241722414
(\ref{typePromotion}).
2241822415
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+
}
2243522423

22424+
!!! Renumber!
2243622425
% Subtype Rule Numbering
2243722426
\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}
2244322436
\newcommand{\SrnLeftFutureOr}{7}
22437+
\newcommand{\SrnLeftNullable}{7b}
2244422438
\newcommand{\SrnTypeVariableReflexivityA}{8}
2244522439
\newcommand{\SrnRightPromotedVariable}{9}
2244622440
\newcommand{\SrnRightFutureOrA}{10}
2244722441
\newcommand{\SrnRightFutureOrB}{11}
22442+
\newcommand{\SrnRightNullableOne}{11b.1}
22443+
\newcommand{\SrnRightNullableTwo}{11b.2}
22444+
\newcommand{\SrnRightNullableThree}{11b.3}
22445+
\newcommand{\SrnRightNullableFour}{11b.4}
2244822446
\newcommand{\SrnLeftPromotedVariable}{12}
2244922447
\newcommand{\SrnLeftVariableBound}{13}
2245022448
\newcommand{\SrnRightFunction}{14}
@@ -22465,34 +22463,47 @@ \subsection{Subtypes}
2246522463
\def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
2246622464
%
2246722465
\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$?}}
2247022473
\end{minipage}
2247122474
\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$>}}
2247422488
\end{minipage}
2247522489

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-
2248422490
\begin{minipage}[c]{0.49\textwidth}
2248522491
\RuleTwo{\SrnLeftFutureOr}{Left FutureOr}{S}{T}{%
2248622492
\code{Future<$S$>}}{T}{\code{FutureOr<$S$>}}{T}
2248722493
\RuleTwo{\SrnRightPromotedVariable}{Right Promoted Variable}{S}{X}{S}{T}{%
2248822494
S}{X \& T}
2248922495
\Rule{\SrnRightFutureOrB}{Right FutureOr B}{S}{T}{S}{\code{FutureOr<$T$>}}
22496+
\Rule{\SrnRightNullableTwo}{Right Nullable 2}{S}{\code{Null}}{S}{%
22497+
\code{$T$?}}
2249022498
\Rule{\SrnLeftVariableBound}{Left Variable Bound}{\Delta(X)}{T}{X}{T}
2249122499
\end{minipage}
2249222500
\begin{minipage}[c]{0.49\textwidth}
22501+
\RuleTwo{\SrnLeftNullable}{Left Nullable}{S}{T}{\code{Null}}{T}{
22502+
\code{$S$?}}{T}
2249322503
\Axiom{\SrnTypeVariableReflexivityA}{Left Promoted Variable A}{X \& S}{X}
2249422504
\Rule{\SrnRightFutureOrA}{Right FutureOr A}{S}{\code{Future<$T$>}}{%
2249522505
S}{\code{FutureOr<$T$>}}
22506+
\Rule{\SrnRightNullableOne}{Right Nullable 1}{S}{T}{S}{\code{$T$?}}
2249622507
\Rule{\SrnLeftPromotedVariable}{Left Promoted Variable B}{S}{T}{X \& S}{T}
2249722508
\RuleRaw{\SrnRightFunction}{Right Function}{T\mbox{ is a function type}}{%
2249822509
T}{\FUNCTION}
@@ -22528,6 +22539,7 @@ \subsection{Subtypes}
2252822539
\forall j \in 1 .. s\!:\;\SubtypeStd{S_j}{T_j}}{%
2252922540
\code{$C$<\List{S}{1}{s}>}}{\code{$C$<\List{T}{1}{s}>}}
2253022541
\ExtraVSP
22542+
%% !!! Should include mixins (and other non-class interface types, if any).
2253122543
\RuleRaw{\SrnSuperinterface}{Superinterface}{%
2253222544
\code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}}\\
2253322545
\Superinterface{\code{$D$<\List{T}{1}{m}>}}{C} &
@@ -22579,10 +22591,9 @@ \subsubsection{Subtype Rules}
2257922591
Whenever a rule contains one or more meta-variables,
2258022592
that rule can be used by
2258122593
\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$.
2258622597

2258722598
\commentary{%
2258822599
In general, this means that two or more occurrences of
@@ -22595,11 +22606,12 @@ \subsubsection{Subtype Rules}
2259522606
can be used to conclude
2259622607
\Subtype{\emptyset}{\code{int}}{\code{int}},
2259722608
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+
}
2259922611

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{}
2260322615
to show that \code{p1.C} is a subtype of
2260422616
\code{p2.C} when \code{C} is a class declared in a
2260522617
library $L$ which is imported by libraries $L_1$ and $L_2$ and
@@ -22628,8 +22640,27 @@ \subsubsection{Subtype Rules}
2262822640
}
2262922641

2263022642
\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.
2263322664

2263422665
\commentary{%
2263522666
That is, no subtyping relationship can be proven for
@@ -22677,9 +22708,11 @@ \subsubsection{Subtype Rules}
2267722708
So
2267822709
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double} \} \uplus
2267922710
\{ \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} \}$
2268122713
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
2268322716
\{ \code{Y} \mapsto \code{int} \} =
2268422717
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{int} \}$.
2268522718
Note that operator $\uplus$ is concerned with scopes and shadowing,
@@ -22729,28 +22762,6 @@ \subsubsection{Being a subtype}
2272922762
each of the premises of $R$,
2273022763
continuing until a rule with no premises is reached.
2273122764

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-
2275422765
\LMHash{}%
2275522766
Rule~\SrnRightFunction{} has as a premise that `$T$ is a function type'.
2275622767
This means that $T$ is a type of one of the forms introduced in
@@ -22859,7 +22870,7 @@ \subsubsection{Informal Subtype Rule Descriptions}
2285922870
the rule is also valid in any environment
2286022871
and the environment is never used explicitly,
2286122872
so we will not repeat that.
22862-
\Item{\SrnTop}{Top}
22873+
\Item{\SrnRightTop}{Top}
2286322874
Every type is a subtype of \code{Object},
2286422875
every type is a subtype of \DYNAMIC,
2286522876
and every type is a subtype of \VOID.
@@ -22871,19 +22882,11 @@ \subsubsection{Informal Subtype Rule Descriptions}
2287122882
(\ref{superBoundedTypes}).
2287222883
\Item{\SrnBottom}{Bottom}
2287322884
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$.
2288722890
\Item{\SrnLeftFutureOr}{Left FutureOr}
2288822891
The type \code{FutureOr<$S$>} is a subtype of a given type $T$
2288922892
if $S$ is a subtype of $T$ and \code{Future<$S$>} is a subtype of $T$,
@@ -23354,11 +23357,10 @@ \subsection{Type Normalization}
2335423357
(such as \code{Never} and $X$).
2335523358

2335623359
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>{}>}).%
2336223364
}
2336323365

2336423366
\LMHash{}%
@@ -23566,8 +23568,8 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2356623568
}
2356723569

2356823570
\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},
2357123573
it refers to the situation where both $T_1$ and $T_2$ have been
2357223574
transformed in the above sense
2357323575
(\commentary{by alpha-renaming, alias expansion, and canonical naming}).
@@ -23801,7 +23803,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2380123803
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
2380223804

2380323805
\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,
2380523807
and both have the same number of required positional parameters.
2380623808
Let $q$ be $\metavar{min}(k, l)$,
2380723809
let $T_3$ be \UpperBoundType{$T_1$}{$T_2$},
@@ -23831,7 +23833,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2383123833
and consider the case where the following is satisfied:
2383223834

2383323835
\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.
2383523837
\item For each required entry named $n$ in $\metavar{Named}_1$,
2383623838
$\metavar{Named}_2$ contains an entry named $n$
2383723839
(\commentary{which may or may not be required}).
@@ -24056,7 +24058,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2405624058
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
2405724059

2405824060
\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.
2406024062
Let $q$ be $\metavar{max}(k, l)$,
2406124063
let $T_3$ be \LowerBoundType{$T_1$}{$T_2$},
2406224064
let $B_{3i}$ be $B_{1i}$, and
@@ -24093,7 +24095,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2409324095
where $\metavar{Named}_j$ declares a non-empty set of named parameters
2409424096
with names $\metavar{NamesOfNamed}_j$, $j \in 1 .. 2$,
2409524097
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.
2409724099
Then \DefEqualsNewline{\LowerBoundType{$U_1$}{$U_2$}}{%U_3}, where $U_3$ is
2409824100
\code{$T_3$\,\FUNCTION<$X_1$\,\EXTENDS\,$B_{31}$,\,\ldots,\,$X_m$\,%
2409924101
\EXTENDS\,$B_{3m}$>($P_{31}$,\,\ldots,\,$P_{3k}$,\,$\metavar{Named}_3$)}},
@@ -24637,9 +24639,10 @@ \subsection{Intersection Types}
2463724639

2463824640
\commentary{%
2463924641
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
2464124643
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,
2464324646
as the right operand of another intersection type,
2464424647
or as the operand of the nullable type operator \lit{?}.%
2464524648
}
@@ -24800,24 +24803,8 @@ \subsection{Type Type}
2480024803
and let $S_j$ be \NormalizedTypeOf{$U_j$}, for $j \in 1 .. 2$
2480124804
(\ref{typeNormalization}).
2480224805
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}).
2482124808

2482224809
\LMHash{}%
2482324810
A reified type identifies the underlying type in the sense that
@@ -26227,7 +26214,7 @@ \section*{Appendix: Algorithmic Subtyping}
2622726214
\end{minipage}
2622826215
%
2622926216
\caption{Algorithmic subtype rules.
26230-
Rules \SrnTop--\SrnSuperinterface{} are unchanged and hence omitted here.}
26217+
Rules \SrnRightTop--\SrnSuperinterface{} are unchanged and hence omitted here.}
2623126218
\label{fig:algorithmicSubtypeRules}
2623226219
\end{figure}
2623326220

@@ -26288,7 +26275,7 @@ \section*{Appendix: Algorithmic Subtyping}
2628826275
followed by the rule whose number is $N+1$.
2628926276
\commentary{%
2629026277
So the order is
26291-
\AppSrnReflexivity, \SrnTop--\SrnTypeVariableReflexivityA,
26278+
\AppSrnReflexivity, \SrnRightTop--\SrnTypeVariableReflexivityA,
2629226279
\AppSrnTypeVariableReflexivityB, \AppSrnTypeVariableReflexivityC,
2629326280
\AppSrnTypeVariableReflexivityD,
2629426281
\SrnRightPromotedVariable, and so on.%

0 commit comments

Comments
 (0)