Skip to content

Commit 484cc24

Browse files
committed
Rebase
1 parent a2e55f1 commit 484cc24

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
@@ -21958,43 +21958,41 @@ \subsection{Subtypes}
2195821958
}
2195921959

2196021960
\LMHash{}%
21961-
%% TODO(eernst): Introduce these specialized intersection types
21962-
%% in a suitable location where type promotion is specified.
21963-
Types of the form
21964-
\IndexCustom{$X \& S$}{type!of the form $X \& S$}%
21965-
\IndexExtraEntry{\&@$X \& S$}
21966-
arise during static analysis due to type promotion
21961+
Intersection types
21962+
(\commentary{types of the form \code{$X$\,\&\,$S$}}),
21963+
may arise during static analysis due to type promotion
2196721964
(\ref{typePromotion}).
2196821965
They never occur during execution,
21969-
they are never a type argument of another type,
21970-
nor a return type or a formal parameter type,
21971-
and it is always the case that $S$ is a subtype of the bound of $X$.
21972-
\commentary{%
21973-
The motivation for $X \& S$ is that it represents
21974-
the type of a local variable $v$
21975-
whose type is declared to be the type variable $X$,
21976-
and which is known to have type $S$ due to promotion.
21977-
Similarly, $X \& S$ may be seen as an intersection type,
21978-
which is a subtype of $X$ and also a subtype of $S$.
21979-
Intersection types are \emph{not} supported in general,
21980-
only in this special case.%
21981-
}
21982-
Every other form of type may occur during static analysis
21983-
as well as during execution,
21984-
and the subtype relationship is always determined in the same way.
21966+
and there are many other restrictions on where they can occur
21967+
(\ref{intersectionTypes}).
21968+
However, their subtype relations are specified without restrictions.
21969+
\commentary{%
21970+
It causes no problems that these rules will not be used
21971+
in their full generality.%
21972+
}
2198521973

21974+
!!! Renumber!
2198621975
% Subtype Rule Numbering
2198721976
\newcommand{\SrnReflexivity}{1}
21988-
\newcommand{\SrnTop}{2}
21989-
\newcommand{\SrnBottom}{3}
21990-
\newcommand{\SrnNull}{4}
21991-
\newcommand{\SrnLeftTypeAlias}{5}
21992-
\newcommand{\SrnRightTypeAlias}{6}
21977+
\newcommand{\SrnRightTop}{2}
21978+
\newcommand{\SrnLeftTop}{3}
21979+
\newcommand{\SrnBottom}{4}
21980+
\newcommand{\SrnRightObjectOne}{5.1}
21981+
\newcommand{\SrnRightObjectTwo}{5.2}
21982+
\newcommand{\SrnRightObjectThree}{5.3}
21983+
\newcommand{\SrnRightObjectFour}{5.4}
21984+
\newcommand{\SrnNullOne}{6.1}
21985+
\newcommand{\SrnNullTwo}{6.2}
2199321986
\newcommand{\SrnLeftFutureOr}{7}
21987+
\newcommand{\SrnLeftNullable}{7b}
2199421988
\newcommand{\SrnTypeVariableReflexivityA}{8}
2199521989
\newcommand{\SrnRightPromotedVariable}{9}
2199621990
\newcommand{\SrnRightFutureOrA}{10}
2199721991
\newcommand{\SrnRightFutureOrB}{11}
21992+
\newcommand{\SrnRightNullableOne}{11b.1}
21993+
\newcommand{\SrnRightNullableTwo}{11b.2}
21994+
\newcommand{\SrnRightNullableThree}{11b.3}
21995+
\newcommand{\SrnRightNullableFour}{11b.4}
2199821996
\newcommand{\SrnLeftPromotedVariable}{12}
2199921997
\newcommand{\SrnLeftVariableBound}{13}
2200021998
\newcommand{\SrnRightFunction}{14}
@@ -22015,34 +22013,47 @@ \subsection{Subtypes}
2201522013
\def\RuleRawRaw#1#2#3#4{\centerline{\inference[#1]{#3}{#4}}\VSP}
2201622014
%
2201722015
\begin{minipage}[c]{0.49\textwidth}
22018-
\Axiom{\SrnReflexivity}{Reflexivity}{S}{S}
22019-
\Axiom{\SrnBottom}{Left Bottom}{\bot}{T}
22016+
\Axiom{\SrnReflexivity}{Reflexivity}{T}{T}
22017+
\Axiom{\SrnBottom}{Left Bottom}{\code{Never}}{T}
22018+
\RuleRaw{\SrnRightObjectTwo}{Right Object 2}{%
22019+
\SubtypeStd{S}{\code{Object}}}{\code{$X$\,\&\,$S$}}{\code{Object}}
22020+
\RuleRaw{\SrnRightObjectThree}{Right Object 3}{%
22021+
\SubtypeStd{S}{\code{Object}}}{\code{FutureOr<$S$>}}{\code{Object}}
22022+
\Axiom{\SrnNullOne}{Left Null One}{\code{Null}}{\code{$T$?}}
2202022023
\end{minipage}
2202122024
\begin{minipage}[c]{0.49\textwidth}
22022-
\RuleRaw{\SrnTop}{Right Top}{T \in \{\code{Object}, \DYNAMIC, \VOID\}}{S}{T}
22023-
\RuleRaw{\SrnNull}{Left Null}{T \not= \bot}{\code{Null}}{T}
22025+
\RuleRaw{\SrnRightTop}{Right Top}{%
22026+
T \in \{\code{Object?}, \DYNAMIC, \VOID\}}{S}{T}
22027+
\RuleRaw{\SrnLeftTop}{Left Top}{%
22028+
S \in \{\DYNAMIC, \VOID\} & \SubtypeStd{\code{Object?}}{T}}{S}{T}
22029+
\RuleRaw{\SrnRightObjectOne}{Right Object 1}{%
22030+
\code{$X$\,\EXTENDS\,$B$} & \SubtypeStd{B}{\code{Object}}%
22031+
}{X}{\code{Object}}
22032+
\RuleRaw{\SrnRightObjectFour}{Right Object 4}{%
22033+
$S$\,\not\in \{\code{Null}, \DYNAMIC, \VOID\}\\
22034+
\mbox{$S$ is not of the form \code{$U$?}, $X$, %
22035+
\code{$X$\,\&\,$U$}, \code{FutureOr<$U$>}}}{S}{\code{Object}}
22036+
\Rule{\SrnNullTwo}{Left Null Two}{\code{Null}}{T}{%
22037+
\code{Null}}{\code{FutureOr<$T$>}}
2202422038
\end{minipage}
2202522039

22026-
\ExtraVSP
22027-
\RuleRaw{\SrnLeftTypeAlias}{Type Alias Left}{%
22028-
\code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
22029-
\SubtypeStd{[S_1/X_1,\ldots,S_s/X_s]U}{T}}{\code{$F$<\List{S}{1}{s}>}}{T}
22030-
\RuleRaw{\SrnRightTypeAlias}{Type Alias Right}{%
22031-
\code{\TYPEDEF{} $F$<\TypeParametersNoBounds{X}{s}> = U} &
22032-
\SubtypeStd{S}{[T_1/X_1,\ldots,T_s/X_s]U}}{S}{\code{$F$<\List{T}{1}{s}>}}
22033-
2203422040
\begin{minipage}[c]{0.49\textwidth}
2203522041
\RuleTwo{\SrnLeftFutureOr}{Left FutureOr}{S}{T}{%
2203622042
\code{Future<$S$>}}{T}{\code{FutureOr<$S$>}}{T}
2203722043
\RuleTwo{\SrnRightPromotedVariable}{Right Promoted Variable}{S}{X}{S}{T}{%
2203822044
S}{X \& T}
2203922045
\Rule{\SrnRightFutureOrB}{Right FutureOr B}{S}{T}{S}{\code{FutureOr<$T$>}}
22046+
\Rule{\SrnRightNullableTwo}{Right Nullable 2}{S}{\code{Null}}{S}{%
22047+
\code{$T$?}}
2204022048
\Rule{\SrnLeftVariableBound}{Left Variable Bound}{\Gamma(X)}{T}{X}{T}
2204122049
\end{minipage}
2204222050
\begin{minipage}[c]{0.49\textwidth}
22051+
\RuleTwo{\SrnLeftNullable}{Left Nullable}{S}{T}{\code{Null}}{T}{
22052+
\code{$S$?}}{T}
2204322053
\Axiom{\SrnTypeVariableReflexivityA}{Left Promoted Variable A}{X \& S}{X}
2204422054
\Rule{\SrnRightFutureOrA}{Right FutureOr A}{S}{\code{Future<$T$>}}{%
2204522055
S}{\code{FutureOr<$T$>}}
22056+
\Rule{\SrnRightNullableOne}{Right Nullable 1}{S}{T}{S}{\code{$T$?}}
2204622057
\Rule{\SrnLeftPromotedVariable}{Left Promoted Variable B}{S}{T}{X \& S}{T}
2204722058
\RuleRaw{\SrnRightFunction}{Right Function}{T\mbox{ is a function type}}{%
2204822059
T}{\FUNCTION}
@@ -22078,6 +22089,7 @@ \subsection{Subtypes}
2207822089
\forall j \in 1 .. s\!:\;\SubtypeStd{S_j}{T_j}}{%
2207922090
\code{$C$<\List{S}{1}{s}>}}{\code{$C$<\List{T}{1}{s}>}}
2208022091
\ExtraVSP
22092+
%% !!! Should include mixins (and other non-class interface types, if any).
2208122093
\RuleRaw{\SrnSuperinterface}{Superinterface}{%
2208222094
\code{\CLASS{} $C$<\TypeParametersNoBounds{X}{s}>\,\ldots\,\{\}}\\
2208322095
\Superinterface{\code{$D$<\List{T}{1}{m}>}}{C} &
@@ -22129,10 +22141,9 @@ \subsubsection{Subtype Rules}
2212922141
Whenever a rule contains one or more meta-variables,
2213022142
that rule can be used by
2213122143
\IndexCustom{instantiating}{instantiation!subtype rule}
22132-
it, that is, by consistently replacing
22133-
each occurrence of a given meta-variable by
22134-
concrete syntax denoting the same type
22135-
(\ref{typeType}).
22144+
it, that is, by choosing a specific type $T$ and metavariable $\cal V$,
22145+
and then consistently replacing all occurrences of $\cal V$ by
22146+
concrete syntax denoting $T$.
2213622147

2213722148
\commentary{%
2213822149
In general, this means that two or more occurrences of
@@ -22145,11 +22156,12 @@ \subsubsection{Subtype Rules}
2214522156
can be used to conclude
2214622157
\Subtype{\emptyset}{\code{int}}{\code{int}},
2214722158
where $\emptyset$ denotes the empty environment
22148-
(any environment would suffice because no type variables occur).
22159+
(any environment would suffice because no type variables occur).%
22160+
}
2214922161

22150-
However, the wording `denoting the same type' above covers
22151-
additional situations as well:
22152-
For instance, we may use rule~\SrnReflexivity{}
22162+
\commentary{%
22163+
The phrases `same type' and `identical syntax' deserves some extra scrutiny:
22164+
We may, e.g., use rule~\SrnReflexivity{}
2215322165
to show that \code{p1.C} is a subtype of
2215422166
\code{p2.C} when \code{C} is a class declared in a
2215522167
library $L$ which is imported by libraries $L_1$ and $L_2$ and
@@ -22178,8 +22190,27 @@ \subsubsection{Subtype Rules}
2217822190
}
2217922191

2218022192
\LMHash{}%
22181-
Every \synt{typeName} used in a type mentioned in this section is assumed to
22182-
have no compile-time error and denote a type.
22193+
In this section,
22194+
the notion of two types $T_1$ and $T_2$ being the same type
22195+
is taken to mean that $T_1$ and $T_2$ have the same canonical syntax
22196+
(\ref{standardUpperBoundsAndStandardLowerBounds}).
22197+
22198+
\commentary{%
22199+
In other words, we eliminate the difficulties associated with
22200+
different syntax denoting the same type,
22201+
and different types denoted by the same syntax,
22202+
by assuming that every type in the program has been expressed
22203+
in a manner where those situations never occur,
22204+
because each type is denoted by the same globally unique syntax everywhere.
22205+
Note that `same canonical syntax' also requires
22206+
transitive expansion of all type aliases
22207+
(\ref{typedef}).%
22208+
}
22209+
22210+
\LMHash{}%
22211+
Every \synt{typeName} used in a type mentioned in this section
22212+
is assumed to have no compile-time error,
22213+
and it is assumed to denote a type.
2218322214

2218422215
\commentary{%
2218522216
That is, no subtyping relationship can be proven for
@@ -22227,9 +22258,11 @@ \subsubsection{Subtype Rules}
2222722258
So
2222822259
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double} \} \uplus
2222922260
\{ \code{Z} \mapsto \code{Object} \} =
22230-
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, \code{Z} \mapsto \code{Object} \}$
22261+
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{double}, %
22262+
\code{Z} \mapsto \code{Object} \}$
2223122263
and
22232-
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{FutureOr<List<double>{}>} \} \uplus
22264+
$\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto %
22265+
\code{FutureOr<List<double>{}>} \} \uplus
2223322266
\{ \code{Y} \mapsto \code{int} \} =
2223422267
\{ \code{X} \mapsto \code{int}, \code{Y} \mapsto \code{int} \}$.
2223522268
Note that operator $\uplus$ is concerned with scopes and shadowing,
@@ -22279,28 +22312,6 @@ \subsubsection{Being a subtype}
2227922312
each of the premises of $R$,
2228022313
continuing until a rule with no premises is reached.
2228122314

22282-
\LMHash{}%
22283-
The first premise in the
22284-
rules~\SrnLeftTypeAlias{} and~\SrnRightTypeAlias{}
22285-
is a type alias declaration.
22286-
This premise is satisfied in each of the following situations:
22287-
22288-
\begin{itemize}
22289-
\item A non-generic type alias named $F$ is declared.
22290-
In this case $s$ is zero,
22291-
no assumptions are made about the existence
22292-
of any formal type parameters,
22293-
and actual type argument lists are omitted everywhere in the rule.
22294-
\item We may choose $s$ and \List{X}{1}{s} such that the following holds:
22295-
A generic type alias named $F$ is declared,
22296-
with formal type parameters \List{X}{1}{s}.
22297-
\commentary{%
22298-
Each formal type parameter $X_j$ may have a bound,
22299-
but the bounds are never used in this context,
22300-
so we do not introduce metavariables for them.%
22301-
}
22302-
\end{itemize}
22303-
2230422315
\LMHash{}%
2230522316
Rule~\SrnRightFunction{} has as a premise that `$T$ is a function type'.
2230622317
This means that $T$ is a type of one of the forms introduced in
@@ -22409,7 +22420,7 @@ \subsubsection{Informal Subtype Rule Descriptions}
2240922420
the rule is also valid in any environment
2241022421
and the environment is never used explicitly,
2241122422
so we will not repeat that.
22412-
\Item{\SrnTop}{Top}
22423+
\Item{\SrnRightTop}{Top}
2241322424
Every type is a subtype of \code{Object},
2241422425
every type is a subtype of \DYNAMIC,
2241522426
and every type is a subtype of \VOID.
@@ -22421,19 +22432,11 @@ \subsubsection{Informal Subtype Rule Descriptions}
2242122432
(\ref{superBoundedTypes}).
2242222433
\Item{\SrnBottom}{Bottom}
2242322434
Every type is a supertype of $\bot$.
22424-
\Item{\SrnNull}{Null}
22425-
Every type other than $\bot$ is a supertype of \code{Null}.
22426-
\Item{\SrnLeftTypeAlias}{Type Alias Left}
22427-
An application of a type alias to some actual type arguments is
22428-
a subtype of another type $T$
22429-
if the expansion of the type alias to the type that it denotes
22430-
is a subtype of $T$.
22431-
Note that a non-generic type alias is handled by letting $s = 0$.
22432-
\Item{\SrnRightTypeAlias}{Type Alias Right}
22433-
A type $S$ is a subtype of an application of a type alias
22434-
if $S$ is a subtype of
22435-
the expansion of the type alias to the type that it denotes.
22436-
Note that a non-generic type alias is handled by letting $s = 0$.
22435+
\Item{\SrnNullOne}{Null 1}
22436+
\code{Null} is a subtype of every type of the form \code{$T$?}.
22437+
\Item{\SrnNullTwo}{Null 2}
22438+
\code{Null} is a subtype of \code{FutureOr<$T$>}
22439+
if \code{Null} is a subtype of $T$.
2243722440
\Item{\SrnLeftFutureOr}{Left FutureOr}
2243822441
The type \code{FutureOr<$S$>} is a subtype of a given type $T$
2243922442
if $S$ is a subtype of $T$ and \code{Future<$S$>} is a subtype of $T$,
@@ -22902,11 +22905,10 @@ \subsection{Type Normalization}
2290222905
(such as \code{Never} and $X$).
2290322906

2290422907
In particular, \SubtypeNE{S}{T} and \SubtypeNE{T}{S} holds if and only if
22905-
\NormalizedTypeOf{$T$} is syntactically equal to \NormalizedTypeOf{$S$},
22906-
modulo replacement of atomic top types,
22907-
and modulo replacement of terms derived from \synt{typeName}
22908-
denoting the same type
22909-
(such as \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
22908+
\NormalizedTypeOf{$T$} has the same canonical syntax as \NormalizedTypeOf{$S$}
22909+
(\ref{standardUpperBoundsAndStandardLowerBounds}),
22910+
modulo replacement of atomic top types
22911+
(e.g., \code{List<C<\DYNAMIC>{}>} and \code{List<myPrefix.C<\VOID>{}>}).%
2291022912
}
2291122913

2291222914
\LMHash{}%
@@ -23114,8 +23116,8 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2311423116
}
2311523117

2311623118
\LMHash{}%
23117-
Consequently, when we say that two types $T_1$ and $T_2$ are
23118-
\IndexCustom{syntactically equal}{type!syntactically equal},
23119+
Consequently, when we say that two types $T_1$ and $T_2$ have the
23120+
\IndexCustom{same canonical syntax}{type!same canonical syntax},
2311923121
it refers to the situation where both $T_1$ and $T_2$ have been
2312023122
transformed in the above sense
2312123123
(\commentary{by alpha-renaming, alias expansion, and canonical naming}).
@@ -23349,7 +23351,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2334923351
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
2335023352

2335123353
\noindent
23352-
such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types,
23354+
such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax,
2335323355
and both have the same number of required positional parameters.
2335423356
Let $q$ be $\metavar{min}(k, l)$,
2335523357
let $T_3$ be \UpperBoundType{$T_1$}{$T_2$},
@@ -23379,7 +23381,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2337923381
and consider the case where the following is satisfied:
2338023382

2338123383
\begin{itemize}
23382-
\item Each $B_{1i}$ and $B_{2i}$ are syntactically equal types.
23384+
\item Each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax.
2338323385
\item For each required entry named $n$ in $\metavar{Named}_1$,
2338423386
$\metavar{Named}_2$ contains an entry named $n$
2338523387
(\commentary{which may or may not be required}).
@@ -23604,7 +23606,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2360423606
\EXTENDS\,$B_{2m}$>($P_{21}$,\,\ldots,\,$P_{2l}$)}
2360523607

2360623608
\noindent
23607-
such that each $B_{1i}$ and $B_{2i}$ are syntactically equal types.
23609+
such that each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax.
2360823610
Let $q$ be $\metavar{max}(k, l)$,
2360923611
let $T_3$ be \LowerBoundType{$T_1$}{$T_2$},
2361023612
let $B_{3i}$ be $B_{1i}$, and
@@ -23641,7 +23643,7 @@ \subsubsection{Standard Upper Bounds and Standard Lower Bounds}
2364123643
where $\metavar{Named}_j$ declares a non-empty set of named parameters
2364223644
with names $\metavar{NamesOfNamed}_j$, $j \in 1 .. 2$,
2364323645
and consider the case where
23644-
each $B_{1i}$ and $B_{2i}$ are syntactically equal types.
23646+
each $B_{1i}$ and $B_{2i}$ are types with the same canonical syntax.
2364523647
Then \DefEqualsNewline{\LowerBoundType{$U_1$}{$U_2$}}{%U_3}, where $U_3$ is
2364623648
\code{$T_3$\,\FUNCTION<$X_1$\,\EXTENDS\,$B_{31}$,\,\ldots,\,$X_m$\,%
2364723649
\EXTENDS\,$B_{3m}$>($P_{31}$,\,\ldots,\,$P_{3k}$,\,$\metavar{Named}_3$)}},
@@ -24185,9 +24187,10 @@ \subsection{Intersection Types}
2418524187

2418624188
\commentary{%
2418724189
An intersection type will never occur as a nested type, that is,
24188-
it will never occurs as
24190+
it never occurs as or in
2418924191
an actual type argument in a parameterized type,
24190-
as a parameter type or a return type in a function type,
24192+
a parameter type or a return type in a function type,
24193+
a type parameter bound,
2419124194
as the right operand of another intersection type,
2419224195
or as the operand of the nullable type operator \lit{?}.%
2419324196
}
@@ -24348,24 +24351,8 @@ \subsection{Type Type}
2434824351
and let $S_j$ be \NormalizedTypeOf{$U_j$}, for $j \in 1 .. 2$
2434924352
(\ref{typeNormalization}).
2435024353
We then say that $T_1$ and $T_2$ are the \Index{same type}
24351-
if{}f $S_1$ and $S_2$ are syntactically equal,
24352-
up to equivalence of bound variables,
24353-
and up to replacement of identifiers or qualified identifiers
24354-
resolving to the same type declaration
24355-
(\commentary{%
24356-
e.g., \code{C} and \code{prefix.C} could resolve to
24357-
the same class declaration%
24358-
}),
24359-
and excluding the case where two identifiers or qualified identifiers
24360-
occurring at corresponding positions in $S_1$ and $S_2$
24361-
are syntactically identical,
24362-
but resolve to different declarations
24363-
(\commentary{%
24364-
e.g., one occurrence of \code{C} could resolve to a
24365-
class declaration imported from a library $L_1$,
24366-
and another occurrence of \code{C} could resolve to a
24367-
class declaration imported from a different library $L_2$%
24368-
}).
24354+
if{}f $S_1$ and $S_2$ are have the same canonical syntax
24355+
(\ref{standardUpperBoundsAndStandardLowerBounds}).
2436924356

2437024357
\LMHash{}%
2437124358
A reified type identifies the underlying type in the sense that
@@ -25774,7 +25761,7 @@ \section*{Appendix: Algorithmic Subtyping}
2577425761
\end{minipage}
2577525762
%
2577625763
\caption{Algorithmic subtype rules.
25777-
Rules \SrnTop--\SrnSuperinterface{} are unchanged and hence omitted here.}
25764+
Rules \SrnRightTop--\SrnSuperinterface{} are unchanged and hence omitted here.}
2577825765
\label{fig:algorithmicSubtypeRules}
2577925766
\end{figure}
2578025767

@@ -25835,7 +25822,7 @@ \section*{Appendix: Algorithmic Subtyping}
2583525822
followed by the rule whose number is $N+1$.
2583625823
\commentary{%
2583725824
So the order is
25838-
\AppSrnReflexivity, \SrnTop--\SrnTypeVariableReflexivityA,
25825+
\AppSrnReflexivity, \SrnRightTop--\SrnTypeVariableReflexivityA,
2583925826
\AppSrnTypeVariableReflexivityB, \AppSrnTypeVariableReflexivityC,
2584025827
\AppSrnTypeVariableReflexivityD,
2584125828
\SrnRightPromotedVariable, and so on.%

0 commit comments

Comments
 (0)