Skip to content

Commit ba792d3

Browse files
committed
Rebase
1 parent 206456f commit ba792d3

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
@@ -21960,43 +21960,41 @@ \subsection{Subtypes}
2196021960
}
2196121961

2196221962
\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
2196921966
(\ref{typePromotion}).
2197021967
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+
}
2198721975

21976+
!!! Renumber!
2198821977
% Subtype Rule Numbering
2198921978
\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}
2199521988
\newcommand{\SrnLeftFutureOr}{7}
21989+
\newcommand{\SrnLeftNullable}{7b}
2199621990
\newcommand{\SrnTypeVariableReflexivityA}{8}
2199721991
\newcommand{\SrnRightPromotedVariable}{9}
2199821992
\newcommand{\SrnRightFutureOrA}{10}
2199921993
\newcommand{\SrnRightFutureOrB}{11}
21994+
\newcommand{\SrnRightNullableOne}{11b.1}
21995+
\newcommand{\SrnRightNullableTwo}{11b.2}
21996+
\newcommand{\SrnRightNullableThree}{11b.3}
21997+
\newcommand{\SrnRightNullableFour}{11b.4}
2200021998
\newcommand{\SrnLeftPromotedVariable}{12}
2200121999
\newcommand{\SrnLeftVariableBound}{13}
2200222000
\newcommand{\SrnRightFunction}{14}
@@ -22017,34 +22015,47 @@ \subsection{Subtypes}
2201722015
\def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
2201822016
%
2201922017
\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$?}}
2202222025
\end{minipage}
2202322026
\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$>}}
2202622040
\end{minipage}
2202722041

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-
2203622042
\begin{minipage}[c]{0.49\textwidth}
2203722043
\RuleTwo{\SrnLeftFutureOr}{Left FutureOr}{S}{T}{%
2203822044
\code{Future<$S$>}}{T}{\code{FutureOr<$S$>}}{T}
2203922045
\RuleTwo{\SrnRightPromotedVariable}{Right Promoted Variable}{S}{X}{S}{T}{%
2204022046
S}{X \& T}
2204122047
\Rule{\SrnRightFutureOrB}{Right FutureOr B}{S}{T}{S}{\code{FutureOr<$T$>}}
22048+
\Rule{\SrnRightNullableTwo}{Right Nullable 2}{S}{\code{Null}}{S}{%
22049+
\code{$T$?}}
2204222050
\Rule{\SrnLeftVariableBound}{Left Variable Bound}{\Gamma(X)}{T}{X}{T}
2204322051
\end{minipage}
2204422052
\begin{minipage}[c]{0.49\textwidth}
22053+
\RuleTwo{\SrnLeftNullable}{Left Nullable}{S}{T}{\code{Null}}{T}{
22054+
\code{$S$?}}{T}
2204522055
\Axiom{\SrnTypeVariableReflexivityA}{Left Promoted Variable A}{X \& S}{X}
2204622056
\Rule{\SrnRightFutureOrA}{Right FutureOr A}{S}{\code{Future<$T$>}}{%
2204722057
S}{\code{FutureOr<$T$>}}
22058+
\Rule{\SrnRightNullableOne}{Right Nullable 1}{S}{T}{S}{\code{$T$?}}
2204822059
\Rule{\SrnLeftPromotedVariable}{Left Promoted Variable B}{S}{T}{X \& S}{T}
2204922060
\RuleRaw{\SrnRightFunction}{Right Function}{T\mbox{ is a function type}}{%
2205022061
T}{\FUNCTION}
@@ -22080,6 +22091,7 @@ \subsection{Subtypes}
2208022091
\forall j \in 1 .. s\!:\;\SubtypeStd{S_j}{T_j}}{%
2208122092
\code{$C$<\List{S}{1}{s}>}}{\code{$C$<\List{T}{1}{s}>}}
2208222093
\ExtraVSP
22094+
%% !!! Should include mixins (and other non-class interface types, if any).
2208322095
\RuleRaw{\SrnSuperinterface}{Superinterface}{%
2208422096
\code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}}\\
2208522097
\Superinterface{\code{$D$<\List{T}{1}{m}>}}{C} &
@@ -22131,10 +22143,9 @@ \subsubsection{Subtype Rules}
2213122143
Whenever a rule contains one or more meta-variables,
2213222144
that rule can be used by
2213322145
\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$.
2213822149

2213922150
\commentary{%
2214022151
In general, this means that two or more occurrences of
@@ -22147,11 +22158,12 @@ \subsubsection{Subtype Rules}
2214722158
can be used to conclude
2214822159
\Subtype{\emptyset}{\code{int}}{\code{int}},
2214922160
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+
}
2215122163

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{}
2215522167
to show that \code{p1.C} is a subtype of
2215622168
\code{p2.C} when \code{C} is a class declared in a
2215722169
library $L$ which is imported by libraries $L_1$ and $L_2$ and
@@ -22180,8 +22192,27 @@ \subsubsection{Subtype Rules}
2218022192
}
2218122193

2218222194
\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.
2218522216

2218622217
\commentary{%
2218722218
That is, no subtyping relationship can be proven for
@@ -22229,9 +22260,11 @@ \subsubsection{Subtype Rules}
2222922260
So
2223022261
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double} \} \uplus
2223122262
\{ \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} \}$
2223322265
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
2223522268
\{ \code{Y} \mapsto \code{int} \} =
2223622269
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{int} \}$.
2223722270
Note that operator $\uplus$ is concerned with scopes and shadowing,
@@ -22281,28 +22314,6 @@ \subsubsection{Being a subtype}
2228122314
each of the premises of $R$,
2228222315
continuing until a rule with no premises is reached.
2228322316

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-
2230622317
\LMHash{}%
2230722318
Rule~\SrnRightFunction{} has as a premise that `$T$ is a function type'.
2230822319
This means that $T$ is a type of one of the forms introduced in
@@ -22411,7 +22422,7 @@ \subsubsection{Informal Subtype Rule Descriptions}
2241122422
the rule is also valid in any environment
2241222423
and the environment is never used explicitly,
2241322424
so we will not repeat that.
22414-
\Item{\SrnTop}{Top}
22425+
\Item{\SrnRightTop}{Top}
2241522426
Every type is a subtype of \code{Object},
2241622427
every type is a subtype of \DYNAMIC,
2241722428
and every type is a subtype of \VOID.
@@ -22423,19 +22434,11 @@ \subsubsection{Informal Subtype Rule Descriptions}
2242322434
(\ref{superBoundedTypes}).
2242422435
\Item{\SrnBottom}{Bottom}
2242522436
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$.
2243922442
\Item{\SrnLeftFutureOr}{Left FutureOr}
2244022443
The type \code{FutureOr<$S$>} is a subtype of a given type $T$
2244122444
if $S$ is a subtype of $T$ and \code{Future<$S$>} is a subtype of $T$,
@@ -22904,11 +22907,10 @@ \subsection{Type Normalization}
2290422907
(such as \code{Never} and $X$).
2290522908

2290622909
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>{}>}).%
2291222914
}
2291322915

2291422916
\LMHash{}%
@@ -23116,8 +23118,8 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2311623118
}
2311723119

2311823120
\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},
2312123123
it refers to the situation where both $T_1$ and $T_2$ have been
2312223124
transformed in the above sense
2312323125
(\commentary{by alpha-renaming, alias expansion, and canonical naming}).
@@ -23351,7 +23353,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2335123353
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
2335223354

2335323355
\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,
2335523357
and both have the same number of required positional parameters.
2335623358
Let $q$ be $\metavar{min}(k, l)$,
2335723359
let $T_3$ be \UpperBoundType{$T_1$}{$T_2$},
@@ -23381,7 +23383,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2338123383
and consider the case where the following is satisfied:
2338223384

2338323385
\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.
2338523387
\item For each required entry named $n$ in $\metavar{Named}_1$,
2338623388
$\metavar{Named}_2$ contains an entry named $n$
2338723389
(\commentary{which may or may not be required}).
@@ -23606,7 +23608,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2360623608
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
2360723609

2360823610
\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.
2361023612
Let $q$ be $\metavar{max}(k, l)$,
2361123613
let $T_3$ be \LowerBoundType{$T_1$}{$T_2$},
2361223614
let $B_{3i}$ be $B_{1i}$, and
@@ -23643,7 +23645,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2364323645
where $\metavar{Named}_j$ declares a non-empty set of named parameters
2364423646
with names $\metavar{NamesOfNamed}_j$, $j \in 1 .. 2$,
2364523647
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.
2364723649
Then \DefEqualsNewline{\LowerBoundType{$U_1$}{$U_2$}}{%U_3}, where $U_3$ is
2364823650
\code{$T_3$\,\FUNCTION<$X_1$\,\EXTENDS\,$B_{31}$,\,\ldots,\,$X_m$\,%
2364923651
\EXTENDS\,$B_{3m}$>($P_{31}$,\,\ldots,\,$P_{3k}$,\,$\metavar{Named}_3$)}},
@@ -24187,9 +24189,10 @@ \subsection{Intersection Types}
2418724189

2418824190
\commentary{%
2418924191
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
2419124193
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,
2419324196
as the right operand of another intersection type,
2419424197
or as the operand of the nullable type operator \lit{?}.%
2419524198
}
@@ -24350,24 +24353,8 @@ \subsection{Type Type}
2435024353
and let $S_j$ be \NormalizedTypeOf{$U_j$}, for $j \in 1 .. 2$
2435124354
(\ref{typeNormalization}).
2435224355
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}).
2437124358

2437224359
\LMHash{}%
2437324360
A reified type identifies the underlying type in the sense that
@@ -25776,7 +25763,7 @@ \section*{Appendix: Algorithmic Subtyping}
2577625763
\end{minipage}
2577725764
%
2577825765
\caption{Algorithmic subtype rules.
25779-
Rules \SrnTop--\SrnSuperinterface{} are unchanged and hence omitted here.}
25766+
Rules \SrnRightTop--\SrnSuperinterface{} are unchanged and hence omitted here.}
2578025767
\label{fig:algorithmicSubtypeRules}
2578125768
\end{figure}
2578225769

@@ -25837,7 +25824,7 @@ \section*{Appendix: Algorithmic Subtyping}
2583725824
followed by the rule whose number is $N+1$.
2583825825
\commentary{%
2583925826
So the order is
25840-
\AppSrnReflexivity, \SrnTop--\SrnTypeVariableReflexivityA,
25827+
\AppSrnReflexivity, \SrnRightTop--\SrnTypeVariableReflexivityA,
2584125828
\AppSrnTypeVariableReflexivityB, \AppSrnTypeVariableReflexivityC,
2584225829
\AppSrnTypeVariableReflexivityD,
2584325830
\SrnRightPromotedVariable, and so on.%

0 commit comments

Comments
 (0)