Changeset 449 in dev for trunk/ab5.0/abdev/BasicCompiler32
- Timestamp:
- Mar 22, 2008, 1:56:31 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/BasicCompiler32/Compile_Func.cpp
r431 r449 436 436 { 437 437 extern int cp; 438 439 const Parameters *pBaseParams = NULL; 440 const Type *pBaseReturnType = NULL; 441 if( baseType.IsProcPtr() ) 442 { 443 // 左辺で関数ポインタを要求されているとき 444 const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]; 445 pBaseParams = &pTempProcPointer->Params(); 446 pBaseReturnType = &pTempProcPointer->ReturnType(); 447 } 448 else if( baseType.IsDelegate() ) 449 { 450 // 左辺でデリゲートを要求されているとき 451 const Delegate *pTempDelegate = &baseType.GetClass().GetDelegate(); 452 pBaseParams = &pTempDelegate->Params(); 453 pBaseReturnType = &pTempDelegate->ReturnType(); 454 } 455 438 456 const UserProc *pUserProc; 439 440 const Parameters *pBaseParams = NULL; 441 if( baseType.IsProcPtr() ) 442 { 443 // 左辺で関数ポインタを要求されているとき 444 pBaseParams = &compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()]->Params(); 445 } 446 else if( baseType.IsDelegate() ) 447 { 448 // 左辺でデリゲートを要求されているとき 449 pBaseParams = &baseType.GetClass().GetDelegate().Params(); 450 } 451 452 if( pBaseParams ) 457 if( pBaseParams && pBaseReturnType ) 453 458 { 454 459 //左辺の型にのっとり、オーバーロードを解決 … … 464 469 pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() ); 465 470 466 if( isCallOn && baseType.IsDelegate())471 if( isCallOn ) 467 472 { 468 473 // コード生成を伴う場合はエラーチェックを行う 469 if( !pUserProc->Params().Equals( *pBaseParams ) 470 || !pUserProc->ReturnType().Equals( baseType.GetClass().GetDelegate().ReturnType()) )474 475 if( baseType.IsDelegate() ) 471 476 { 472 if( baseType.IsDelegate() ) 477 // デリゲート 478 // 共変戻り値、反変引数をサポート 479 if( !( 480 pBaseParams->Equals( pUserProc->Params(), true ) 481 && ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) ) 482 ) ) 473 483 { 474 484 SetError(67, name, cp ); 475 485 } 476 else 486 } 487 else 488 { 489 // 関数ポインタ 490 if( !( 491 pBaseParams->Equals( pUserProc->Params() ) 492 && pBaseReturnType->Equals( pUserProc->ReturnType() ) 493 ) ) 477 494 { 478 495 SetError(66, name, cp );
Note:
See TracChangeset
for help on using the changeset viewer.