Index: trunk/abdev/BasicCompiler64/Compile_Statement.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/Compile_Statement.cpp	(revision 402)
+++ trunk/abdev/BasicCompiler64/Compile_Statement.cpp	(revision 408)
@@ -669,5 +669,6 @@
 std::vector<SelectSchedule> selectSchedules;
 
-void OpcodeSelect( const char *lpszParms ){
+void OpcodeSelect( const char *lpszParms )
+{
 	extern HANDLE hHeap;
 	extern char *basbuf;
@@ -677,193 +678,194 @@
 	int reg1=REG_RAX;
 	Type type1;
-	if( !NumOpe(&reg1,lpszParms,Type(), type1 ) ){
-		return;
-	}
+	bool result = NumOpe(&reg1,lpszParms,Type(), type1 );
 
 	selectSchedules.push_back( SelectSchedule( type1.GetSize() ) );
 
-	if( selectSchedules.back().typeSize < sizeof(long) ){
-		selectSchedules.back().typeSize = sizeof(long);
-	}
-
-	if(type1.IsDouble()){
-		//movsd qword ptr[rsp+offset],xmm_reg		※スタックフレームを利用
-		pobj_sf->push(reg1,sizeof(double));
-	}
-	else if(type1.IsSingle()){
-		//movss dword ptr[rsp+offset],xmm_reg		※スタックフレームを利用
-		pobj_sf->push(reg1,sizeof(float));
-	}
-	else{
-		ExtendTypeTo64(type1.GetBasicType(),reg1);
-
-		//mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
-		pobj_sf->push(reg1);
-	}
-
-	for(i=cp;;i++){
-		if(basbuf[i]=='\0'){
-			selectSchedules.pop_back();
-			SetError(22,"Select",cp);
-			return;
-		}
-		if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
-			for(i2=0;;i++){
-				if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
-				if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
-					i2--;
-					if(i2==0) break;
+	if( result )
+	{
+		if( selectSchedules.back().typeSize < sizeof(long) ){
+			selectSchedules.back().typeSize = sizeof(long);
+		}
+
+		if(type1.IsDouble()){
+			//movsd qword ptr[rsp+offset],xmm_reg		※スタックフレームを利用
+			pobj_sf->push(reg1,sizeof(double));
+		}
+		else if(type1.IsSingle()){
+			//movss dword ptr[rsp+offset],xmm_reg		※スタックフレームを利用
+			pobj_sf->push(reg1,sizeof(float));
+		}
+		else{
+			ExtendTypeTo64(type1.GetBasicType(),reg1);
+
+			//mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
+			pobj_sf->push(reg1);
+		}
+
+		for(i=cp;;i++){
+			if(basbuf[i]=='\0'){
+				selectSchedules.pop_back();
+				SetError(22,"Select",cp);
+				return;
+			}
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
+				for(i2=0;;i++){
+					if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
+					if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
+						i2--;
+						if(i2==0) break;
+					}
 				}
-			}
-			continue;
-		}
-		if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT) break;
-
-		if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
-			NowCaseCp=i;
-
-			i++;
-			while(1){
-				for(i++,i2=0;;i++,i2++){
-					if(basbuf[i]=='\"'){
-						i3=GetStringInQuotation(temporary+i2,basbuf+i);
-						i+=i3-1;
-						i2+=i3-1;
-						continue;
+				continue;
+			}
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT) break;
+
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
+				NowCaseCp=i;
+
+				i++;
+				while(1){
+					for(i++,i2=0;;i++,i2++){
+						if(basbuf[i]=='\"'){
+							i3=GetStringInQuotation(temporary+i2,basbuf+i);
+							i+=i3-1;
+							i2+=i3-1;
+							continue;
+						}
+						if(basbuf[i]=='('){
+							i3=GetStringInPare(temporary+i2,basbuf+i);
+							i+=i3-1;
+							i2+=i3-1;
+							continue;
+						}
+						if(basbuf[i]=='['){
+							i3=GetStringInBracket(temporary+i2,basbuf+i);
+							i+=i3-1;
+							i2+=i3-1;
+							continue;
+						}
+
+						if(IsCommandDelimitation(basbuf[i])){
+							temporary[i2]=0;
+							break;
+						}
+						if(basbuf[i]==','){
+							temporary[i2]=0;
+							break;
+						}
+
+						temporary[i2]=basbuf[i];
 					}
-					if(basbuf[i]=='('){
-						i3=GetStringInPare(temporary+i2,basbuf+i);
-						i+=i3-1;
-						i2+=i3-1;
-						continue;
-					}
-					if(basbuf[i]=='['){
-						i3=GetStringInBracket(temporary+i2,basbuf+i);
-						i+=i3-1;
-						i2+=i3-1;
-						continue;
-					}
-
-					if(IsCommandDelimitation(basbuf[i])){
-						temporary[i2]=0;
-						break;
-					}
-					if(basbuf[i]==','){
-						temporary[i2]=0;
-						break;
-					}
-
-					temporary[i2]=basbuf[i];
-				}
-
-				//エラー用
-				i2=cp;
-				cp=NowCaseCp;
-
-				int reg2=REG_RDX;
-				Type type2;
-				if( !NumOpe(&reg2,temporary,type1,type2) ){
-					return;
-				}
-
-				cp=i2;
-
-				if(type1.IsObject()){
-					std::vector<const UserProc *> subs;
-					type1.GetClass().GetDynamicMethods().Enum( CALC_EQUAL, subs );
-					if( subs.size() == 0 ){
+
+					//エラー用
+					i2=cp;
+					cp=NowCaseCp;
+
+					int reg2=REG_RDX;
+					Type type2;
+					if( !NumOpe(&reg2,temporary,type1,type2) ){
 						return;
 					}
 
-					Parameters params;
-					params.push_back( new Parameter( "", Type( type2 ) ) );
-
-					//オーバーロードを解決
-					const UserProc *pUserProc = OverloadSolution("==",subs, params, NULL);
-
-					delete params[0];
-
-					if(!pUserProc){
-						//エラー
-						return;
-					}
-
-
-					//実体オブジェクト
-					if(reg2!=REG_RDX){
-						//mov rdx,reg2
-						compiler.codeGenerator.op_mov_RR(REG_RDX,reg2);
-					}
-
-					//mov rcx,qword ptr[rsp+offset]		※スタックフレームから参照
-					pobj_sf->ref(REG_RCX);
-
-					//call operator_proc	※ ==演算子
-					compiler.codeGenerator.op_call(pUserProc);
-
-					//test rax,rax
-					compiler.codeGenerator.op_test(REG_RAX,REG_RAX);
-
-					//jne ...
-					selectSchedules.back().casePertialSchedules.push_back(
-						compiler.codeGenerator.op_jne( 0, sizeof(long), true )
-					);
-				}
-				else{
-					if(type1.IsDouble()){
-						int xmm_reg;
-						if(IsXmmReg(reg2)) xmm_reg=reg2;
-						else xmm_reg=REG_XMM5;
-						ChangeTypeToXmm_Double(type2.GetBasicType(),xmm_reg,reg2);
-
-						//movsd xmm4,qword ptr[rsp+offset]	※スタックフレームから参照
-						pobj_sf->ref(REG_XMM4,sizeof(double));
-
-						//comiss xmm_reg1,xmm_reg2
-						compiler.codeGenerator.op_comisd(xmm_reg,REG_XMM4);
-					}
-					else if(type1.IsSingle()){
-						int xmm_reg;
-						if(IsXmmReg(reg2)) xmm_reg=reg2;
-						else xmm_reg=REG_XMM5;
-						ChangeTypeToXmm_Single(type2.GetBasicType(),xmm_reg,reg2);
-
-						//movss xmm4,dword ptr[rsp+offset]	※スタックフレームから参照
-						pobj_sf->ref(REG_XMM4,sizeof(float));
-
-						//comiss xmm_reg1,xmm_reg2
-						compiler.codeGenerator.op_comiss(xmm_reg,REG_XMM4);
+					cp=i2;
+
+					if(type1.IsObject()){
+						std::vector<const UserProc *> subs;
+						type1.GetClass().GetDynamicMethods().Enum( CALC_EQUAL, subs );
+						if( subs.size() == 0 ){
+							return;
+						}
+
+						Parameters params;
+						params.push_back( new Parameter( "", Type( type2 ) ) );
+
+						//オーバーロードを解決
+						const UserProc *pUserProc = OverloadSolution("==",subs, params, NULL);
+
+						delete params[0];
+
+						if(!pUserProc){
+							//エラー
+							return;
+						}
+
+
+						//実体オブジェクト
+						if(reg2!=REG_RDX){
+							//mov rdx,reg2
+							compiler.codeGenerator.op_mov_RR(REG_RDX,reg2);
+						}
+
+						//mov rcx,qword ptr[rsp+offset]		※スタックフレームから参照
+						pobj_sf->ref(REG_RCX);
+
+						//call operator_proc	※ ==演算子
+						compiler.codeGenerator.op_call(pUserProc);
+
+						//test rax,rax
+						compiler.codeGenerator.op_test(REG_RAX,REG_RAX);
+
+						//jne ...
+						selectSchedules.back().casePertialSchedules.push_back(
+							compiler.codeGenerator.op_jne( 0, sizeof(long), true )
+						);
 					}
 					else{
-						//その他整数型
-
-						i2=NeutralizationType(type1.GetBasicType(),-1,type2.GetBasicType(),-1);
-
-						//mov r14,qword ptr[rsp+offset]		※スタックフレームから参照
-						pobj_sf->ref(REG_R14);
-
-						//cmp reg2,r14
-						compiler.codeGenerator.op_cmp_reg(Type(i2).GetSize(),reg2,REG_R14);
+						if(type1.IsDouble()){
+							int xmm_reg;
+							if(IsXmmReg(reg2)) xmm_reg=reg2;
+							else xmm_reg=REG_XMM5;
+							ChangeTypeToXmm_Double(type2.GetBasicType(),xmm_reg,reg2);
+
+							//movsd xmm4,qword ptr[rsp+offset]	※スタックフレームから参照
+							pobj_sf->ref(REG_XMM4,sizeof(double));
+
+							//comiss xmm_reg1,xmm_reg2
+							compiler.codeGenerator.op_comisd(xmm_reg,REG_XMM4);
+						}
+						else if(type1.IsSingle()){
+							int xmm_reg;
+							if(IsXmmReg(reg2)) xmm_reg=reg2;
+							else xmm_reg=REG_XMM5;
+							ChangeTypeToXmm_Single(type2.GetBasicType(),xmm_reg,reg2);
+
+							//movss xmm4,dword ptr[rsp+offset]	※スタックフレームから参照
+							pobj_sf->ref(REG_XMM4,sizeof(float));
+
+							//comiss xmm_reg1,xmm_reg2
+							compiler.codeGenerator.op_comiss(xmm_reg,REG_XMM4);
+						}
+						else{
+							//その他整数型
+
+							i2=NeutralizationType(type1.GetBasicType(),-1,type2.GetBasicType(),-1);
+
+							//mov r14,qword ptr[rsp+offset]		※スタックフレームから参照
+							pobj_sf->ref(REG_R14);
+
+							//cmp reg2,r14
+							compiler.codeGenerator.op_cmp_reg(Type(i2).GetSize(),reg2,REG_R14);
+						}
+
+						//je ...
+						selectSchedules.back().casePertialSchedules.push_back(
+							compiler.codeGenerator.op_je( 0, sizeof(long), true )
+						);
 					}
 
-					//je ...
-					selectSchedules.back().casePertialSchedules.push_back(
-						compiler.codeGenerator.op_je( 0, sizeof(long), true )
-					);
+					if(basbuf[i]!=',') break;
 				}
-
-				if(basbuf[i]!=',') break;
-			}
-		}
-		if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
-			//jmp ...
-			selectSchedules.back().casePertialSchedules.push_back(
-				compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
-			);
-		}
-	}
-
-	//スタックフレームを1スペースだけ解除
-	pobj_sf->pop(REG_NON);
+			}
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
+				//jmp ...
+				selectSchedules.back().casePertialSchedules.push_back(
+					compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
+				);
+			}
+		}
+
+		//スタックフレームを1スペースだけ解除
+		pobj_sf->pop(REG_NON);
+	}
 
 	//レキシカルスコープをレベルアップ
