Index: BasicCompiler64/CParameter.cpp
===================================================================
--- BasicCompiler64/CParameter.cpp	(revision 63)
+++ BasicCompiler64/CParameter.cpp	(revision 64)
@@ -2,8 +2,10 @@
 #include "opcode.h"
 
-void CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
+int CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
 	///////////////////////////////////////////////////////
 	// 一時オブジェクトをあらかじめスタックに積んでおく
 	///////////////////////////////////////////////////////
+
+	int stackItemNum = 0;
 
 	useTempObject = false;
@@ -60,6 +62,16 @@
 				int type = NumOpe( &reg, Parms[i2], DummyTypeInfo.type, DummyTypeInfo.u.lpIndex, &lpVarIndex );
 
+				if( type == DEF_OBJECT ){
+					//一時参照を作成
+					pobj_sf->push( reg );
+					pobj_sf->mov_sp( reg );
+
+					stackItemNum++;
+				}
+
 				//スタックフレームへコピー
 				StackOffsetOfTempObject[i2] = pobj_sf->push(reg);
+
+				stackItemNum++;
 
 				bool result = CheckDifferentType(
@@ -81,4 +93,6 @@
 		}
 	}
+
+	return stackItemNum * PTR_SIZE;
 }
 void CParameter::DeleteTempParameters(){
@@ -90,27 +104,27 @@
 	for(int i2=ParmsNum-1;i2>=0;i2--){
 		if( useTempParameters[i2] ){
-			//スタックフレームから取得
-			pobj_sf->ref(REG_RCX);
-
-			//デストラクタを呼び出す
-
-			//call destructor
-			CMethod *method = types[i2].u.pobj_Class->GetDestructorMethod();
-			if( method ){
-				op_call( method->psi );
-			}
-
-			//メモリを解放する
-
-			pobj_sf->pop(REG_RCX);
-
-			//call free
-			extern SUBINFO *pSub_free;
-			op_call(pSub_free);
+			if( types[i2].type == DEF_STRUCT ){
+				// 構造体の一時メモリ
+
+				//メモリを解放する
+
+				pobj_sf->pop( REG_RCX );
+
+				//call free
+				extern SUBINFO *pSub_free;
+				op_call(pSub_free);
+			}
+			else if( types[i2].type == DEF_OBJECT ){
+				pobj_sf->pop();
+				pobj_sf->pop();
+			}
+			else{
+				SetError(300,NULL,cp);
+			}
 		}
 	}
 }
 
-void CParameter::SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter){
+void CParameter::SetStructParameter(int reg,CClass *pobj_Class,LPSTR Parameter){
 	//////////////////////////////////////////////////////
 	/////    レジスタ資源のバックアップ
@@ -133,8 +147,10 @@
 		pobj_sf->push(REG_R11);
 
-		TYPEINFO BaseType={DEF_OBJECT,(LONG_PTR)pobj_Class};
+		TYPEINFO BaseType={DEF_STRUCT,(LONG_PTR)pobj_Class};
 		TYPEINFO CalcType;
 		CalcType.type=NumOpe_GetType(Parameter,&BaseType,&CalcType.u.lpIndex);
 
+		/*
+		TODO: 消す
 		if( pobj_Class->GetCopyConstructorMethod()
 			&& CalcType.type==DEF_OBJECT&&CalcType.u.pobj_Class==pobj_Class){
@@ -178,9 +194,10 @@
 				op_call(pobj_Class->GetConstructorMethod()->psi);
 			}
+			*/
 
 
 			BOOL bUseHeap;
 			int temp_reg=REG_RAX;
-			CalcType.type=NumOpe(&temp_reg,Parameter,DEF_OBJECT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
+			CalcType.type=NumOpe(&temp_reg,Parameter,DEF_STRUCT,(LONG_PTR)pobj_Class,&CalcType.u.lpIndex,&bUseHeap);
 
 
@@ -194,7 +211,7 @@
 			RelativeVar.dwKind=VAR_DIRECTMEM;
 
-			SetObjectVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap);
-
-		}
+			SetStructVariableFromRax((LONG_PTR)pobj_Class,CalcType.type,CalcType.u.lpIndex,&RelativeVar,bUseHeap);
+
+		//}
 
 		//mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
@@ -209,4 +226,5 @@
 	op_mov_RR(reg,REG_R11);
 }
+
 
 void CParameter::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
@@ -298,6 +316,6 @@
 			}
 
-			if(DummyTypeInfo.type==DEF_OBJECT){
-				SetObjectParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);
+			if(DummyTypeInfo.type==DEF_STRUCT){
+				SetStructParameter(reg,DummyTypeInfo.u.pobj_Class,Parms[i2]);
 				goto next;
 			}
@@ -318,6 +336,11 @@
 
 			if(CalcType==DEF_OBJECT){
-				//キャスト演算子のオーバーロードに対応する
-				CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
+				if( DummyTypeInfo.type != DEF_OBJECT
+					||
+					DummyTypeInfo.type == DEF_OBJECT &&
+					!DummyTypeInfo.u.pobj_Class->IsEqualsOrSubClass( (CClass *)lpCalcIndex ) ){
+						//キャスト演算子のオーバーロードに対応する
+						CallCastOperatorProc(reg,CalcType,lpCalcIndex,bCalcUseHeap,DummyTypeInfo.type,DummyTypeInfo.u.lpIndex);
+				}
 			}
 
@@ -419,4 +442,9 @@
 									}
 								}
+								else if(DummyTypeInfo.type==DEF_STRUCT){
+									if( !DummyTypeInfo.u.pobj_Class->IsEquals( (CClass *)lpVarIndex ) ){
+										SetError(11,Parms[i2],cp);
+									}
+								}
 							}
 							else if((VarType&FLAG_PTR)&&((VarType^FLAG_PTR)==DummyTypeInfo.type)){
@@ -442,5 +470,7 @@
 			}
 		}
+
 next:
+
 		if(reg==REG_RAX){
 			//スタックフレームへコピー
