Changeset 449 in dev for trunk/ab5.0/abdev/BasicCompiler64/Compile_Func.cpp
- Timestamp:
- Mar 22, 2008, 1:56:31 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/BasicCompiler64/Compile_Func.cpp
r432 r449 288 288 { 289 289 extern int cp; 290 291 const Parameters *pBaseParams = NULL; 292 const Type *pBaseReturnType = NULL; 293 if( baseType.IsProcPtr() ) 294 { 295 // 左辺で関数ポインタを要求されているとき 296 const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]; 297 pBaseParams = &pTempProcPointer->Params(); 298 pBaseReturnType = &pTempProcPointer->ReturnType(); 299 } 300 else if( baseType.IsDelegate() ) 301 { 302 // 左辺でデリゲートを要求されているとき 303 const Delegate *pTempDelegate = &baseType.GetClass().GetDelegate(); 304 pBaseParams = &pTempDelegate->Params(); 305 pBaseReturnType = &pTempDelegate->ReturnType(); 306 } 307 290 308 const UserProc *pUserProc; 291 292 const Parameters *pBaseParams = NULL; 293 if( baseType.IsProcPtr() ) 294 { 295 // 左辺で関数ポインタを要求されているとき 296 pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(); 297 } 298 else if( baseType.IsDelegate() ) 299 { 300 // 左辺でデリゲートを要求されているとき 301 pBaseParams = &baseType.GetClass().GetDelegate().Params(); 302 } 303 304 if( pBaseParams ) 309 if( pBaseParams && pBaseReturnType ) 305 310 { 306 311 //左辺の型にのっとり、オーバーロードを解決 … … 316 321 pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() ); 317 322 318 if( isCallOn && baseType.IsDelegate())323 if( isCallOn ) 319 324 { 320 325 // コード生成を伴う場合はエラーチェックを行う 321 if( !pUserProc->Params().Equals( *pBaseParams ) 322 || !pUserProc->ReturnType().Equals( baseType.GetClass().GetDelegate().ReturnType()) )326 327 if( baseType.IsDelegate() ) 323 328 { 324 if( baseType.IsDelegate() ) 329 // デリゲート 330 // 共変戻り値、反変引数をサポート 331 if( !( 332 pBaseParams->Equals( pUserProc->Params(), true ) 333 && ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) ) 334 ) ) 325 335 { 326 336 SetError(67, name, cp ); 327 337 } 328 else 338 } 339 else 340 { 341 // 関数ポインタ 342 if( !( 343 pBaseParams->Equals( pUserProc->Params() ) 344 && pBaseReturnType->Equals( pUserProc->ReturnType() ) 345 ) ) 329 346 { 330 347 SetError(66, name, cp );
Note:
See TracChangeset
for help on using the changeset viewer.