@@ -957,12 +957,6 @@ JL_DLLEXPORT jl_method_t* jl_method_def(jl_svec_t *argdata,
957
957
size_t i , na = jl_svec_len (atypes );
958
958
959
959
argtype = (jl_value_t * )jl_apply_tuple_type (atypes );
960
- for (i = jl_svec_len (tvars ); i > 0 ; i -- ) {
961
- jl_value_t * tv = jl_svecref (tvars , i - 1 );
962
- if (!jl_is_typevar (tv ))
963
- jl_type_error ("method signature" , (jl_value_t * )jl_tvar_type , tv );
964
- argtype = jl_new_struct (jl_unionall_type , tv , argtype );
965
- }
966
960
967
961
jl_methtable_t * external_mt = mt ;
968
962
if (!mt )
@@ -972,6 +966,12 @@ JL_DLLEXPORT jl_method_t* jl_method_def(jl_svec_t *argdata,
972
966
if (mt -> frozen )
973
967
jl_error ("cannot add methods to a builtin function" );
974
968
969
+ assert (jl_is_linenode (functionloc ));
970
+ jl_sym_t * file = (jl_sym_t * )jl_linenode_file (functionloc );
971
+ if (!jl_is_symbol (file ))
972
+ file = jl_empty_sym ;
973
+ int32_t line = jl_linenode_line (functionloc );
974
+
975
975
// TODO: derive our debug name from the syntax instead of the type
976
976
name = mt -> name ;
977
977
if (mt == jl_type_type_mt || mt == jl_nonfunction_mt || external_mt ) {
@@ -988,6 +988,29 @@ JL_DLLEXPORT jl_method_t* jl_method_def(jl_svec_t *argdata,
988
988
}
989
989
}
990
990
}
991
+
992
+ for (i = jl_svec_len (tvars ); i > 0 ; i -- ) {
993
+ jl_value_t * tv = jl_svecref (tvars , i - 1 );
994
+ if (!jl_is_typevar (tv ))
995
+ jl_type_error ("method signature" , (jl_value_t * )jl_tvar_type , tv );
996
+ if (!jl_has_typevar (argtype , (jl_tvar_t * )tv )) // deprecate this to an error in v2
997
+ jl_printf (JL_STDERR ,
998
+ "WARNING: method definition for %s at %s:%d declares type variable %s but does not use it.\n" ,
999
+ jl_symbol_name (name ),
1000
+ jl_symbol_name (file ),
1001
+ line ,
1002
+ jl_symbol_name (((jl_tvar_t * )tv )-> name ));
1003
+ argtype = jl_new_struct (jl_unionall_type , tv , argtype );
1004
+ }
1005
+ if (jl_has_free_typevars (argtype )) {
1006
+ jl_exceptionf (jl_argumenterror_type ,
1007
+ "method definition for %s at %s:%d has free type variables" ,
1008
+ jl_symbol_name (name ),
1009
+ jl_symbol_name (file ),
1010
+ line );
1011
+ }
1012
+
1013
+
991
1014
if (!jl_is_code_info (f )) {
992
1015
// this occurs when there is a closure being added to an out-of-scope function
993
1016
// the user should only do this at the toplevel
@@ -1002,20 +1025,10 @@ JL_DLLEXPORT jl_method_t* jl_method_def(jl_svec_t *argdata,
1002
1025
m -> name = name ;
1003
1026
m -> isva = isva ;
1004
1027
m -> nargs = nargs ;
1005
- assert (jl_is_linenode (functionloc ));
1006
- jl_value_t * file = jl_linenode_file (functionloc );
1007
- m -> file = jl_is_symbol (file ) ? (jl_sym_t * )file : jl_empty_sym ;
1008
- m -> line = jl_linenode_line (functionloc );
1028
+ m -> file = file ;
1029
+ m -> line = line ;
1009
1030
jl_method_set_source (m , f );
1010
1031
1011
- if (jl_has_free_typevars (argtype )) {
1012
- jl_exceptionf (jl_argumenterror_type ,
1013
- "method definition for %s at %s:%d has free type variables" ,
1014
- jl_symbol_name (name ),
1015
- jl_symbol_name (m -> file ),
1016
- m -> line );
1017
- }
1018
-
1019
1032
for (i = 0 ; i < na ; i ++ ) {
1020
1033
jl_value_t * elt = jl_svecref (atypes , i );
1021
1034
if (!jl_is_type (elt ) && !jl_is_typevar (elt ) && !jl_is_vararg (elt )) {
@@ -1025,22 +1038,22 @@ JL_DLLEXPORT jl_method_t* jl_method_def(jl_svec_t *argdata,
1025
1038
"invalid type for argument number %d in method definition for %s at %s:%d" ,
1026
1039
i ,
1027
1040
jl_symbol_name (name ),
1028
- jl_symbol_name (m -> file ),
1029
- m -> line );
1041
+ jl_symbol_name (file ),
1042
+ line );
1030
1043
else
1031
1044
jl_exceptionf (jl_argumenterror_type ,
1032
1045
"invalid type for argument %s in method definition for %s at %s:%d" ,
1033
1046
jl_symbol_name (argname ),
1034
1047
jl_symbol_name (name ),
1035
- jl_symbol_name (m -> file ),
1036
- m -> line );
1048
+ jl_symbol_name (file ),
1049
+ line );
1037
1050
}
1038
1051
if (jl_is_vararg (elt ) && i < na - 1 )
1039
1052
jl_exceptionf (jl_argumenterror_type ,
1040
1053
"Vararg on non-final argument in method definition for %s at %s:%d" ,
1041
1054
jl_symbol_name (name ),
1042
- jl_symbol_name (m -> file ),
1043
- m -> line );
1055
+ jl_symbol_name (file ),
1056
+ line );
1044
1057
}
1045
1058
1046
1059
#ifdef RECORD_METHOD_ORDER
0 commit comments