Changes in / [91d6584:fca6ca6]
- Files:
-
- 10 edited
-
libcfa/prelude/builtins.c (modified) (2 diffs)
-
libcfa/prelude/prelude-gen.cc (modified) (3 diffs)
-
src/BasicTypes-gen.cc (modified) (5 diffs)
-
src/Parser/ExpressionNode.cc (modified) (7 diffs)
-
src/Parser/lex.ll (modified) (2 diffs)
-
src/ResolvExpr/CommonType.cc (modified) (1 diff)
-
src/ResolvExpr/ConversionCost.cc (modified) (3 diffs)
-
src/SymTab/ManglerCommon.cc (modified) (1 diff)
-
src/SynTree/Type.h (modified) (1 diff)
-
tests/.expect/completeTypeError.txt (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/prelude/builtins.c
r91d6584 rfca6ca6 10 10 // Created On : Fri Jul 21 16:21:03 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Mar 10 10:52:50 201913 // Update Count : 3112 // Last Modified On : Sun Aug 5 21:40:38 2018 13 // Update Count : 20 14 14 // 15 15 … … 26 26 // increment/decrement unification 27 27 28 static inline forall( dtype T | { T & ?+=?( T&, one_t ); } )29 T & ++? ( T& x ) { return x += 1; }28 static inline forall( dtype T | { T& ?+=?( T&, one_t ); } ) 29 T& ++? ( T& x ) { return x += 1; } 30 30 31 static inline forall( dtype T | sized(T) | { void ?{}( T &, T ); void ^?{}( T & ); T & ?+=?( T&, one_t ); } )32 T & ?++ ( T& x ) { T tmp = x; x += 1; return tmp; }31 static inline forall( dtype T | sized(T) | { void ?{}( T&, T ); void ^?{}( T& ); T& ?+=?( T&, one_t ); } ) 32 T& ?++ ( T& x ) { T tmp = x; x += 1; return tmp; } 33 33 34 static inline forall( dtype T | { T & ?-=?( T&, one_t ); } )35 T & --? ( T& x ) { return x -= 1; }34 static inline forall( dtype T | { T& ?-=?( T&, one_t ); } ) 35 T& --? ( T& x ) { return x -= 1; } 36 36 37 static inline forall( dtype T | sized(T) | { void ?{}( T &, T ); void ^?{}( T & ); T & ?-=?( T &, one_t ); } ) 38 T & ?-- ( T & x ) { T tmp = x; x -= 1; return tmp; } 39 40 // universal typed pointer constant 41 42 static inline forall( dtype T ) T * intptr( uintptr_t addr ) { return (T *)addr; } 37 static inline forall( dtype T | sized(T) | { void ?{}( T&, T ); void ^?{}( T& ); T& ?-=?( T&, one_t ); } ) 38 T& ?-- ( T& x ) { T tmp = x; x -= 1; return tmp; } 43 39 44 40 // exponentiation operator implementation -
libcfa/prelude/prelude-gen.cc
r91d6584 rfca6ca6 10 10 // Created On : Sat Feb 16 08:44:58 2019 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Mar 8 16:00:22201913 // Update Count : 2 612 // Last Modified On : Mon Feb 18 09:47:33 2019 13 // Update Count : 22 14 14 // 15 15 … … 287 287 cout << "forall(ftype FT) FT * ?=?( FT * &, zero_t );" << endl; 288 288 cout << "forall(ftype FT) FT * ?=?( FT * volatile &, zero_t );" << endl; 289 cout << "forall( ftype FT) void ?{}( FT * & );" << endl;290 cout << "forall( ftype FT) void ^?{}( FT * & );" << endl;289 cout << "forall( ftype FT ) void ?{}( FT * & );" << endl; 290 cout << "forall( ftype FT ) void ^?{}( FT * & );" << endl; 291 291 cout << endl; 292 292 … … 295 295 cout << "///////////////////////" << endl; 296 296 297 cout << "forall(ftype FT) FT * ?=?( FT *&, FT * );" << endl; 298 cout << "forall(ftype FT) FT * ?=?( FT * volatile &, FT * );" << endl; 299 cout << "forall(ftype FT) int !?( FT * );" << endl; 300 cout << "forall(ftype FT) signed int ?==?( FT *, FT * );" << endl; 301 cout << "forall(ftype FT) signed int ?!=?( FT *, FT * );" << endl; 302 cout << "forall(ftype FT) FT & *?( FT * );" << endl; 297 cout << "forall( ftype FT ) FT * ?=?( FT *&, FT * );" << endl; 298 cout << "forall( ftype FT ) FT * ?=?( FT * volatile &, FT * );" << endl; 299 cout << "forall( ftype FT ) int !?( FT * );" << endl; 300 cout << "forall( ftype FT ) signed int ?==?( FT *, FT * );" << endl; 301 cout << "forall( ftype FT ) signed int ?!=?( FT *, FT * );" << endl; 302 cout << "forall( ftype FT ) FT & *?( FT * );" << endl; 303 303 304 304 305 for (auto op : pointerOperators) { -
src/BasicTypes-gen.cc
r91d6584 rfca6ca6 70 70 } graph[NUMBER_OF_BASIC_TYPES] = { 71 71 { Bool, "Bool", "B", "_Bool", "b", Signed, Char, SignedChar, -1, 0 }, // root 72 73 72 { Char, "Char", "C", "char", "c", Signed, SignedChar, UnsignedChar, ShortSignedInt, 1 }, 74 73 { SignedChar, "SignedChar", "SC", "signed char", "a", Signed, UnsignedChar, ShortSignedInt, -1, 1 }, 75 74 { UnsignedChar, "UnsignedChar", "UC", "unsigned char", "h", Unsigned, ShortUnsignedInt, ShortSignedInt, -1, 1 }, 76 77 75 { ShortSignedInt, "ShortSignedInt", "SI", "signed short int", "s", Signed, ShortUnsignedInt, SignedInt, -1, 2 }, 78 76 { ShortUnsignedInt, "ShortUnsignedInt", "SUI", "unsigned short int", "t", Unsigned, UnsignedInt, SignedInt, -1, 2 }, 79 80 77 { SignedInt, "SignedInt", "I", "signed int", "i", Signed, UnsignedInt, LongSignedInt, -1, 3 }, 81 78 { UnsignedInt, "UnsignedInt", "UI", "unsigned int", "j", Unsigned, LongUnsignedInt, LongSignedInt, -1, 3 }, 82 83 79 { LongSignedInt, "LongSignedInt", "LI", "signed long int", "l", Signed, LongUnsignedInt, LongLongSignedInt, -1, 4 }, 84 80 { LongUnsignedInt, "LongUnsignedInt", "LUI", "unsigned long int", "m", Unsigned, LongLongSignedInt, LongLongUnsignedInt, -1, 4 }, 85 86 81 { LongLongSignedInt, "LongLongSignedInt", "LLI", "signed long long int", "x", Signed, LongLongUnsignedInt, SignedInt128, -1, 5 }, 87 82 { LongLongUnsignedInt, "LongLongUnsignedInt", "LLUI", "unsigned long long int", "y", Unsigned, SignedInt128, UnsignedInt128, -1, 5 }, 88 89 83 { SignedInt128, "SignedInt128", "IB", "__int128", "n", Signed, UnsignedInt128, uFloat16, -1, 6 }, 90 84 { UnsignedInt128, "UnsignedInt128", "UIB", "unsigned __int128", "o", Unsigned, uFloat16, -1, -1, 6 }, 91 92 85 { uFloat16, "uFloat16", "_FH", "_Float16", "DF16_", Floating, uFloat32, uFloat16Complex, -1, 7 }, 93 86 { uFloat16Complex, "uFloat16Complex", "_FH", "_Float16 _Complex", "CDF16_", Floating, uFloat32Complex, -1, -1, 7 }, … … 97 90 { FloatComplex, "FloatComplex", "FC", "float _Complex", "Cf", Floating, uFloat32xComplex, -1, -1, 9 }, 98 91 // { FloatImaginary, "FloatImaginary", "FI", "float _Imaginary", "If", false, DoubleImaginary, FloatComplex, -1, 9 }, 99 100 92 { uFloat32x, "uFloat32x", "_FX", "_Float32x", "DF32x_", Floating, uFloat64, uFloat32xComplex, -1, 10 }, 101 93 { uFloat32xComplex, "uFloat32xComplex", "_FXC", "_Float32x _Complex", "CDF32x_", Floating, uFloat64Complex, -1, -1, 10 }, … … 105 97 { DoubleComplex, "DoubleComplex", "DC", "double _Complex", "Cd", Floating, uFloat64xComplex, -1, -1, 12 }, 106 98 // { DoubleImaginary, "DoubleImaginary", "DI", "double _Imaginary", "Id", false, LongDoubleImaginary, DoubleComplex, -1, 12 }, 107 108 99 { uFloat64x, "uFloat64x", "F80X", "_Float64x", "DF64x_", Floating, uuFloat80, uFloat64xComplex, -1, 13 }, 109 100 { uFloat64xComplex, "uFloat64xComplex", "_FDXC", "_Float64x _Complex", "CDF64x_", Floating, uFloat128Complex, -1, -1, 13 }, … … 115 106 { LongDoubleComplex, "LongDoubleComplex", "LDC", "long double _Complex", "Ce", Floating, uFloat128xComplex, -1, -1, 17 }, 116 107 // { LongDoubleImaginary, "LongDoubleImaginary", "LDI", "long double _Imaginary", "Ie", false, LongDoubleComplex, -1, -1, 17 }, 117 118 108 { uFloat128x, "uFloat128x", "_FBX", "_Float128x", "DF128x_", Floating, uFloat128xComplex, -1, -1, 18 }, 119 109 { uFloat128xComplex, "uFloat128xComplex", "_FLDXC", "_Float128x _Complex", "CDF128x_", Floating, -1, -1, -1, 18 } … … 260 250 261 251 #define STARTMK "// GENERATED START, DO NOT EDIT" 252 #define BYMK "// GENERATED BY " __FILE__ 262 253 #define ENDMK "// GENERATED END" 263 string BYMK( __FILE__ );264 string::size_type posn = BYMK.find_last_of( "/" );265 if ( posn != string::npos ) BYMK.erase( 0, posn - 1); // remove directories266 BYMK = "// GENERATED BY " + BYMK;267 268 254 fstream file; 269 255 stringstream buffer, code; -
src/Parser/ExpressionNode.cc
r91d6584 rfca6ca6 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Mar 10 16:10:32201913 // Update Count : 9 7612 // Last Modified On : Thu Feb 28 21:36:38 2019 13 // Update Count : 933 14 14 // 15 15 … … 66 66 void lnthSuffix( string & str, int & type, int & ltype ) { 67 67 string::size_type posn = str.find_last_of( "lL" ); 68 69 if ( posn == string::npos ) return; // no suffix 70 if ( posn == str.length() - 1 ) { type = 3; return; } // no length => long 71 72 string::size_type next = posn + 1; // advance to length 73 if ( str[next] == '3' ) { // 32 74 type = ltype = 2; 75 } else if ( str[next] == '6' ) { // 64 76 type = ltype = 3; 77 } else if ( str[next] == '8' ) { // 8 78 type = ltype = 1; 79 } else if ( str[next] == '1' ) { 80 if ( str[next + 1] == '6' ) { // 16 81 type = ltype = 0; 82 } else { // 128 83 type = 5; ltype = 6; 84 } // if 85 } // if 86 // remove "lL" for these cases because it may not imply long 87 str.erase( posn ); // remove length 68 if ( posn != string::npos ) { 69 type = 3; // default 70 posn += 1; // advance to size 71 if ( str[posn] == '3' ) { // 32 72 type = ltype = 2; str.erase( posn, 2 ); 73 } else if ( str[posn] == '6' ) { // 64 74 type = ltype = 3; str.erase( posn, 2 ); 75 } else if ( str[posn] == '8' ) { // 8 76 type = ltype = 1; str.erase( posn, 1 ); 77 } else if ( str[posn] == '1' ) { 78 if ( str[posn + 1] == '6' ) { // 16 79 type = ltype = 0; str.erase( posn, 2 ); 80 } else { // 128 81 type = ltype = 5; str.erase( posn, 3 ); 82 } // if 83 } // if 84 } // if 88 85 } // lnthSuffix 89 86 90 void valueToType( unsigned long long int & v, bool dec, int & type, bool & Unsigned ) {91 // use value to determine type92 if ( v <= INT_MAX ) { // signed int93 type = 2;94 } else if ( v <= UINT_MAX && ! dec ) { // unsigned int95 type = 2;96 Unsigned = true; // unsigned97 } else if ( v <= LONG_MAX ) { // signed long int98 type = 3;99 } else if ( v <= ULONG_MAX && ( ! dec || LONG_MAX == LLONG_MAX ) ) { // signed long int100 type = 3;101 Unsigned = true; // unsigned long int102 } else if ( v <= LLONG_MAX ) { // signed long long int103 type = 4;104 } else { // unsigned long long int105 type = 4;106 Unsigned = true; // unsigned long long int107 } // if108 } // valueToType109 110 87 Expression * build_constantInteger( string & str ) { 111 static const BasicType::Kind kind[2][ 7] = {88 static const BasicType::Kind kind[2][6] = { 112 89 // short (h) must be before char (hh) because shorter type has the longer suffix 113 90 { BasicType::ShortSignedInt, BasicType::SignedChar, BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt, BasicType::SignedInt128, }, … … 115 92 }; 116 93 117 static const char * lnthsInt[2][ 6] = {118 { "int16_t", "int8_t", "int32_t", "int64_t", "size_t", "uintptr_t",},119 { "uint16_t", "uint8_t", "uint32_t", "uint64_t", "size_t", "uintptr_t",},94 static const char * lnthsInt[2][5] = { 95 { "int16_t", "int8_t", "int32_t", "int64_t", "size_t", }, 96 { "uint16_t", "uint8_t", "uint32_t", "uint64_t", "size_t", }, 120 97 }; // lnthsInt 98 99 bool dec = true, Unsigned = false; // decimal, unsigned constant 100 int type = -1; // 0 => short, 1 => char, 2 => int, 3 => long int, 4 => long long int, 5 => int128 101 int ltype = -1; // literal length 121 102 122 103 unsigned long long int v; // converted integral value 123 104 size_t last = str.length() - 1; // last subscript of constant 124 105 Expression * ret; 125 //string fred( str ); 126 127 int type = -1; // 0 => short, 1 => char, 2 => int, 3 => long int, 4 => long long int, 5 => int128 128 int ltype = -1; // 0 => 16 bits, 1 => 8 bits, 2 => 32 bits, 3 => 64 bits, 4 => size_t, 5 => intptr, 6 => pointer 129 bool dec = true, Unsigned = false; // decimal, unsigned constant 106 string fred( str ); 130 107 131 108 // special constants … … 139 116 } // if 140 117 141 // Cannot be just "0"/"1"; sscanf stops at the suffix, if any; value goes over the wall =>always generate118 // Cannot be just "0"/"1"; sscanf stops at the suffix, if any; value goes over the wall so always generate 142 119 143 120 if ( str[0] == '0' ) { // radix character ? … … 148 125 } else if ( checkB( str[1] ) ) { // binary constant ? 149 126 v = 0; // compute value 150 for ( unsigned int i = 2;; ) { // ignore prefix127 for ( unsigned int i = 2;; ) { 151 128 if ( str[i] == '1' ) v |= 1; 152 129 i += 1; … … 168 145 if ( isdigit( str[last] ) ) { // no suffix ? 169 146 lnthSuffix( str, type, ltype ); // could have length suffix 170 if ( type == -1 ) { // no suffix 171 valueToType( v, dec, type, Unsigned ); 147 if ( type == -1 ) { 148 // no suffix type, use value to determine type 149 if ( v <= INT_MAX ) { // signed int 150 type = 2; 151 } else if ( v <= UINT_MAX && ! dec ) { // unsigned int 152 type = 2; 153 Unsigned = true; // unsigned 154 } else if ( v <= LONG_MAX ) { // signed long int 155 type = 3; 156 } else if ( v <= ULONG_MAX && ( ! dec || LONG_MAX == LLONG_MAX ) ) { // signed long int 157 type = 3; 158 Unsigned = true; // unsigned long int 159 } else if ( v <= LLONG_MAX ) { // signed long long int 160 type = 4; 161 } else { // unsigned long long int 162 type = 4; 163 Unsigned = true; // unsigned long long int 164 } // if 172 165 } // if 173 166 } else { 174 167 // At least one digit in integer constant, so safe to backup while looking for suffix. 175 168 176 posn = str.find_last_of( "pP" ); 177 if ( posn != string::npos ) { valueToType( v, dec, type, Unsigned ); ltype = 5; str.erase( posn, 1 ); goto FINI; } 169 if ( str.find_last_of( "uU" ) != string::npos ) Unsigned = true; 170 171 posn = str.rfind( "hh" ); 172 if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; } 173 174 posn = str.rfind( "HH" ); 175 if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; } 176 177 posn = str.find_last_of( "hH" ); 178 if ( posn != string::npos ) { type = 0; str.erase( posn, 1 ); goto FINI; } 179 180 posn = str.find_last_of( "nN" ); 181 if ( posn != string::npos ) { type = 2; str.erase( posn, 1 ); goto FINI; } 178 182 179 183 posn = str.find_last_of( "zZ" ); 180 184 if ( posn != string::npos ) { Unsigned = true; type = 2; ltype = 4; str.erase( posn, 1 ); goto FINI; } 181 185 182 // 'u' can appear before or after length suffix183 if ( str.find_last_of( "uU" ) != string::npos ) Unsigned = true;184 185 posn = str.rfind( "hh" );186 if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }187 188 posn = str.rfind( "HH" );189 if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }190 191 posn = str.find_last_of( "hH" );192 if ( posn != string::npos ) { type = 0; str.erase( posn, 1 ); goto FINI; }193 194 posn = str.find_last_of( "nN" );195 if ( posn != string::npos ) { type = 2; str.erase( posn, 1 ); goto FINI; }196 197 186 if ( str.rfind( "ll" ) != string::npos || str.rfind( "LL" ) != string::npos ) { type = 4; goto FINI; } 198 187 199 188 lnthSuffix( str, type, ltype ); // must be after check for "ll" 200 if ( type == -1 ) { // only 'u' suffix ? 201 valueToType( v, dec, type, Unsigned ); 202 } // if 189 if ( type == -1 ) { type = 3; goto FINI; } 203 190 FINI: ; 204 191 } // if 205 192 206 //if ( !( 0 <= type && type < =6 ) ) { printf( "%s %lu %d %s\n", fred.c_str(), fred.length(), type, str.c_str() ); }207 assert( 0 <= type && type < =6 );193 //if ( !( 0 <= type && type < 6 ) ) { printf( "%s %lu %d %s\n", fred.c_str(), fred.length(), type, str.c_str() ); } 194 assert( 0 <= type && type < 6 ); 208 195 209 196 // Constant type is correct for overload resolving. … … 213 200 ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][type] ), false ); 214 201 } else if ( ltype != -1 ) { // explicit length ? 215 if ( ltype == 6 ) { // int128, (int128)constant 202 if ( ltype == 5 ) { // int128 ? 203 type = 5; 216 204 ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][type] ), false ); 217 } else { // explicit length, (length_type)constant205 } else { 218 206 ret = new CastExpr( ret, new TypeInstType( Type::Qualifiers(), lnthsInt[Unsigned][ltype], false ), false ); 219 if ( ltype == 5 ) { // pointer, intptr( (uintptr_t)constant )220 ret = build_func( new ExpressionNode( build_varref( new string( "intptr" ) ) ), new ExpressionNode( ret ) );221 } // if222 207 } // if 223 208 } // if -
src/Parser/lex.ll
r91d6584 rfca6ca6 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Sun Mar 10 09:13:09201913 * Update Count : 70 612 * Last Modified On : Wed Feb 27 22:44:03 2019 13 * Update Count : 704 14 14 */ 15 15 … … 99 99 hex_quad {hex}("_"?{hex}){3} 100 100 size_opt (8|16|32|64|128)? 101 // CFA: explicit l8/l16/l32/l64/l128, char 'hh', short 'h', int 'n'102 101 length ("ll"|"LL"|[lL]{size_opt})|("hh"|"HH"|[hHnN]) 103 // CFA: size_t 'z', pointer 'p', which define a sign and length 104 integer_suffix_opt ("_"?(([uU]({length}?[iI]?)|([iI]{length}))|([iI]({length}?[uU]?)|([uU]{length}))|({length}([iI]?[uU]?)|([uU][iI]))|[zZ]|[pP]))? 102 integer_suffix_opt ("_"?(([uU]({length}?[iI]?)|([iI]{length}))|([iI]({length}?[uU]?)|([uU]{length}))|({length}([iI]?[uU]?)|([uU][iI]))|[zZ]))? 105 103 106 104 octal_digits ({octal})|({octal}({octal}|"_")*{octal}) -
src/ResolvExpr/CommonType.cc
r91d6584 rfca6ca6 177 177 178 178 // GENERATED START, DO NOT EDIT 179 // GENERATED BY BasicTypes-gen.cc179 // GENERATED BY ../../main/src/BasicTypes-gen.cc 180 180 #define BT BasicType:: 181 181 static const BasicType::Kind commonTypes[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // nearest common ancestor -
src/ResolvExpr/ConversionCost.cc
r91d6584 rfca6ca6 182 182 183 183 // GENERATED START, DO NOT EDIT 184 // GENERATED BY BasicTypes-gen.cc184 // GENERATED BY ../../main/src/BasicTypes-gen.cc 185 185 /* EXTENDED INTEGRAL RANK HIERARCHY (root to leaves) 186 186 _Bool … … 207 207 208 208 // GENERATED START, DO NOT EDIT 209 // GENERATED BY BasicTypes-gen.cc209 // GENERATED BY ../../main/src/BasicTypes-gen.cc 210 210 static const int costMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // path length from root to node 211 211 /* B C SC UC SI SUI I UI LI LUI LLI LLUI IB UIB _FH _FH _F _FC F FC _FX _FXC FD _FDC D DC F80X_FDXC F80 _FB_FLDC FB LD LDC _FBX_FLDXC */ … … 254 254 255 255 // GENERATED START, DO NOT EDIT 256 // GENERATED BY BasicTypes-gen.cc256 // GENERATED BY ../../main/src/BasicTypes-gen.cc 257 257 static const int signMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // number of sign changes in safe conversion 258 258 /* B C SC UC SI SUI I UI LI LUI LLI LLUI IB UIB _FH _FH _F _FC F FC _FX _FXC FD _FDC D DC F80X_FDXC F80 _FB_FLDC FB LD LDC _FBX_FLDXC */ -
src/SymTab/ManglerCommon.cc
r91d6584 rfca6ca6 24 24 25 25 // GENERATED START, DO NOT EDIT 26 // GENERATED BY BasicTypes-gen.cc26 // GENERATED BY ../../main/src/BasicTypes-gen.cc 27 27 // NOTES ON MANGLING: 28 28 // * Itanium spec says that Float80 encodes to "e" (like LongDouble), but the distinct lengths cause resolution problems. -
src/SynTree/Type.h
r91d6584 rfca6ca6 208 208 public: 209 209 // GENERATED START, DO NOT EDIT 210 // GENERATED BY BasicTypes-gen.cc210 // GENERATED BY ../../main/src/BasicTypes-gen.cc 211 211 enum Kind { 212 212 Bool, -
tests/.expect/completeTypeError.txt
r91d6584 rfca6ca6 87 87 void 88 88 ) 89 Environment:( _7 4_0_T ) -> instance of type T (not function type) (no widening)89 Environment:( _73_0_T ) -> instance of type T (not function type) (no widening) 90 90 91 91
Note:
See TracChangeset
for help on using the changeset viewer.