@@ -17,10 +17,12 @@ struct validator {
1717static int validate_stmts (struct validator * , asdl_stmt_seq * );
1818static int validate_exprs (struct validator * , asdl_expr_seq * , expr_context_ty , int );
1919static int validate_patterns (struct validator * , asdl_pattern_seq * , int );
20+ static int validate_typeparams (struct validator * , asdl_typeparam_seq * );
2021static int _validate_nonempty_seq (asdl_seq * , const char * , const char * );
2122static int validate_stmt (struct validator * , stmt_ty );
2223static int validate_expr (struct validator * , expr_ty , expr_context_ty );
2324static int validate_pattern (struct validator * , pattern_ty , int );
25+ static int validate_typeparam (struct validator * , typeparam_ty );
2426
2527#define VALIDATE_POSITIONS (node ) \
2628 if (node->lineno > node->end_lineno) { \
@@ -672,6 +674,27 @@ validate_pattern(struct validator *state, pattern_ty p, int star_ok)
672674 return ret ;
673675}
674676
677+ static int
678+ validate_typeparam (struct validator * state , typeparam_ty tp )
679+ {
680+ VALIDATE_POSITIONS (tp );
681+ int ret = -1 ;
682+ switch (tp -> kind ) {
683+ case TypeVar_kind :
684+ ret = validate_name (tp -> v .TypeVar .name ) &&
685+ (!tp -> v .TypeVar .bound ||
686+ validate_expr (state , tp -> v .TypeVar .bound , Load ));
687+ break ;
688+ case ParamSpec_kind :
689+ ret = validate_name (tp -> v .ParamSpec .name );
690+ break ;
691+ case TypeVarTuple_kind :
692+ ret = validate_name (tp -> v .TypeVarTuple .name );
693+ break ;
694+ }
695+ return ret ;
696+ }
697+
675698static int
676699_validate_nonempty_seq (asdl_seq * seq , const char * what , const char * owner )
677700{
@@ -709,13 +732,15 @@ validate_stmt(struct validator *state, stmt_ty stmt)
709732 switch (stmt -> kind ) {
710733 case FunctionDef_kind :
711734 ret = validate_body (state , stmt -> v .FunctionDef .body , "FunctionDef" ) &&
735+ validate_typeparams (state , stmt -> v .FunctionDef .typeparams ) &&
712736 validate_arguments (state , stmt -> v .FunctionDef .args ) &&
713737 validate_exprs (state , stmt -> v .FunctionDef .decorator_list , Load , 0 ) &&
714738 (!stmt -> v .FunctionDef .returns ||
715739 validate_expr (state , stmt -> v .FunctionDef .returns , Load ));
716740 break ;
717741 case ClassDef_kind :
718742 ret = validate_body (state , stmt -> v .ClassDef .body , "ClassDef" ) &&
743+ validate_typeparams (state , stmt -> v .ClassDef .typeparams ) &&
719744 validate_exprs (state , stmt -> v .ClassDef .bases , Load , 0 ) &&
720745 validate_keywords (state , stmt -> v .ClassDef .keywords ) &&
721746 validate_exprs (state , stmt -> v .ClassDef .decorator_list , Load , 0 );
@@ -747,7 +772,9 @@ validate_stmt(struct validator *state, stmt_ty stmt)
747772 validate_expr (state , stmt -> v .AnnAssign .annotation , Load );
748773 break ;
749774 case TypeAlias_kind :
750- ret = validate_expr (state , stmt -> v .TypeAlias .value , Load );
775+ ret = validate_expr (state , stmt -> v .TypeAlias .name , Store ) &&
776+ validate_typeparams (state , stmt -> v .TypeAlias .typeparams ) &&
777+ validate_expr (state , stmt -> v .TypeAlias .value , Load );
751778 break ;
752779 case For_kind :
753780 ret = validate_expr (state , stmt -> v .For .target , Store ) &&
@@ -896,6 +923,7 @@ validate_stmt(struct validator *state, stmt_ty stmt)
896923 break ;
897924 case AsyncFunctionDef_kind :
898925 ret = validate_body (state , stmt -> v .AsyncFunctionDef .body , "AsyncFunctionDef" ) &&
926+ validate_typeparams (state , stmt -> v .AsyncFunctionDef .typeparams ) &&
899927 validate_arguments (state , stmt -> v .AsyncFunctionDef .args ) &&
900928 validate_exprs (state , stmt -> v .AsyncFunctionDef .decorator_list , Load , 0 ) &&
901929 (!stmt -> v .AsyncFunctionDef .returns ||
@@ -968,6 +996,20 @@ validate_patterns(struct validator *state, asdl_pattern_seq *patterns, int star_
968996 return 1 ;
969997}
970998
999+ static int
1000+ validate_typeparams (struct validator * state , asdl_typeparam_seq * tps )
1001+ {
1002+ Py_ssize_t i ;
1003+ for (i = 0 ; i < asdl_seq_LEN (tps ); i ++ ) {
1004+ typeparam_ty tp = asdl_seq_GET (tps , i );
1005+ if (tp ) {
1006+ if (!validate_typeparam (state , tp ))
1007+ return 0 ;
1008+ }
1009+ }
1010+ return 1 ;
1011+ }
1012+
9711013
9721014/* See comments in symtable.c. */
9731015#define COMPILER_STACK_FRAME_SCALE 3
0 commit comments