Changeset 140 in dev for BasicCompiler_Common/ParamImpl.cpp
- Timestamp:
- Jun 15, 2007, 4:00:25 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/ParamImpl.cpp
r116 r140 98 98 } 99 99 100 bool ParamImpl:: _overload_check( int level, const Parameters &targetParms, const Type &targetResultType ){100 bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType ){ 101 101 //パラメータを識別してオーバーロードを解決 102 102 … … 153 153 return false; 154 154 } 155 if( argType.IsPointer() || param.IsPointer() ) 156 { 157 // ポインタ型の不整合は認めない 158 return false; 159 } 155 160 } 156 161 else if(level==OVERLOAD_LEVEL6){ … … 190 195 } 191 196 192 UserProc *ParamImpl::OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs ){ 193 int sw=0; 194 UserProc *pUserProc = NULL; 195 196 for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){ 197 foreach( UserProc *pTempUserProc, subs ){ 198 199 //エラーチェック 200 if(_overload_check( level, pTempUserProc->Params(), pTempUserProc->ReturnType() )){ 201 if(sw){ 202 SetError(52,name,cp); 203 return 0; 204 } 205 sw=1; 206 207 pUserProc = pTempUserProc; 208 } 209 } 210 211 if( sw ) break; 212 } 213 214 if(!sw){ 215 SetError(52,name,cp); 216 return 0; 217 } 218 219 return pUserProc; 220 } 221 UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<UserProc *> &subs ){ 197 UserProc *ParamImpl::_OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType ){ 222 198 int sw=0; 223 199 UserProc *pUserProc; … … 228 204 foreach( UserProc *pTempUserProc, subs ){ 229 205 230 //エラーチェック 231 if(_overload_check( level, pTempUserProc->Params(), Type() )){ 206 if(EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type() )){ 207 trace( "レベル" << level << " ○適合..." << pTempUserProc->_paramStr ); 208 232 209 if(sw){ 233 return OverloadSolutionWithReturnType(name,subs); 210 if( isEnabledReturnType ){ 211 SetError(52,name,cp); 212 213 return 0; 214 } 215 else{ 216 // 戻り値も比較するモードにして再びオーバーロード解決を試みる 217 218 trace( "戻り値も比較するモードに切り替えてオーバーロード解決を試みる" ); 219 220 return OverloadSolution(name,subs, true); 221 } 234 222 } 235 223 sw=1; 236 224 237 225 pUserProc = pTempUserProc; 226 } 227 else 228 { 229 trace( "レベル" << level << " ×不適合..." << pTempUserProc->_paramStr ); 238 230 } 239 231 } … … 260 252 if(!sw){ 261 253 SetError(52,name,cp); 254 262 255 return 0; 263 256 } 264 257 258 265 259 return pUserProc; 260 } 261 UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<UserProc *> &subs, bool isEnabledReturnType ){ 262 trace( "" ); 263 trace( "■■■■■■■■■■■■■■■■■■" ); 264 trace( "■■■ オーバーロード解決(" << name << ")" ); 265 266 UserProc *result = _OverloadSolution( name, subs, isEnabledReturnType ); 267 268 trace( "■■■ ここまで" ); 269 trace( "■■■■■■■■■■■■■■■■■■" ); 270 trace( "" ); 271 272 return result; 266 273 } 267 274
Note:
See TracChangeset
for help on using the changeset viewer.