Index: BasicCompiler64/CParameter.cpp
===================================================================
--- BasicCompiler64/CParameter.cpp	(revision 45)
+++ BasicCompiler64/CParameter.cpp	(revision 46)
@@ -140,5 +140,5 @@
 	return 1;
 }
-SUBINFO *CParameter::OverloadSolutionWithReturnType(char *name,SUBINFO **ppsi,int num){
+SUBINFO *CParameter::OverloadSolutionWithReturnType(const char *name,SUBINFO **ppsi,int num){
 	int i,sw=0;
 	SUBINFO *psi;
@@ -210,5 +210,5 @@
 }
 
-SUBINFO *CParameter::OverloadSolution(char *name,SUBINFO **ppsi,int num){
+SUBINFO *CParameter::OverloadSolution(const char *name,SUBINFO **ppsi,int num){
 	int i,sw=0;
 	SUBINFO *psi;
@@ -283,5 +283,5 @@
 }
 
-BOOL CParameter::ErrorCheck(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
+BOOL CParameter::ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
 	if(ParmsNum>pi_num){
 		if(ppi[pi_num-1].type!=DEF_ELLIPSE){
@@ -330,5 +330,5 @@
 }
 
-void CParameter::NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
+void CParameter::NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum ){
 	///////////////////////////////////////////////////////
 	// 一時オブジェクトをあらかじめスタックに積んでおく
@@ -539,5 +539,5 @@
 }
 
-void CParameter::SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
+void CParameter::SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){
 	///////////////////////////////////////////////////////////
 	// パラメータをレジスタ及びスタックフレームにセット
@@ -559,7 +559,5 @@
 
 	//戻り値用の変数名を取得
-	char *lpszVarNameToReturn;
-	if(FuncName[0]==1&&FuncName[1]==ESC_OPERATOR) lpszVarNameToReturn="_System_ReturnValue";
-	else lpszVarNameToReturn=FuncName;
+	const char *lpszVarNameToReturn = (FuncName[0]==1&&FuncName[1]==ESC_OPERATOR)?"_System_ReturnValue":FuncName;
 
 	//パラメータをレジスタとスタックに格納
Index: BasicCompiler64/Compile_Calc.cpp
===================================================================
--- BasicCompiler64/Compile_Calc.cpp	(revision 45)
+++ BasicCompiler64/Compile_Calc.cpp	(revision 46)
@@ -285,5 +285,5 @@
 	if( VarType == DEF_OBJECT && VarRelativeVar.dwKind == VAR_REFLOCAL ){
 		// 参照型オブジェクトへの代入（初期化）はポインタ変数と同様の処理に値する
-		VarType = PTR_LEVEL_UP( VarType );
+		PTR_LEVEL_UP( VarType );
 
 		VarRelativeVar.dwKind = VAR_LOCAL;
@@ -291,5 +291,5 @@
 		if( CalcType == DEF_OBJECT ){
 			//右辺値が実体オブジェクトのときは、参照をコピー
-			CalcType = PTR_LEVEL_UP( DEF_OBJECT );
+			PTR_LEVEL_UP( CalcType );
 		}
 	}
Index: BasicCompiler64/Compile_CallProc.cpp
===================================================================
--- BasicCompiler64/Compile_CallProc.cpp	(revision 45)
+++ BasicCompiler64/Compile_CallProc.cpp	(revision 46)
@@ -90,5 +90,10 @@
 		FuncId=(int)(_int64)pInfo;
 
-		ret_type=Opcode_CallFunc(Parameter,FuncId);
+		TYPEINFO ReturnTypeInfo = { DEF_LONG, NULL };
+		Opcode_CallFunc( Parameter, FuncId, ReturnTypeInfo );
+		if( plpRetIndex ){
+			*plpRetIndex = ReturnTypeInfo.u.lpIndex;
+		}
+		return ReturnTypeInfo.type;
 	}
 	else if(idProc==PROC_PTR){
Index: BasicCompiler64/Compile_Func.cpp
===================================================================
--- BasicCompiler64/Compile_Func.cpp	(revision 45)
+++ BasicCompiler64/Compile_Func.cpp	(revision 46)
@@ -39,5 +39,5 @@
 	return 0;
 }
-void Opcode_Func_Len(char *Parameter){
+void Opcode_Func_Len( const char *Parameter ){
 	int type,TypeSize;
 	LONG_PTR lpIndex;
@@ -46,5 +46,5 @@
 	type=GetVarType(Parameter,&lpIndex,0);
 
-	char *tempParm=Parameter;
+	const char *tempParm=Parameter;
 	char temporary[VN_SIZE];
 	char temp2[32];
@@ -93,5 +93,5 @@
 	return;
 }
-void Opcode_Func_AddressOf(char *name){
+void Opcode_Func_AddressOf( const char *name ){
 	extern int cp;
 	SUBINFO *psi;
@@ -103,5 +103,5 @@
 		SUBINFO **ppsi;
 		int num;
-		ppsi=GetOverloadSubHash(name,&num);
+		ppsi=GetOverloadSubHash( name, &num );
 		if(!num){
 			HeapDefaultFree(ppsi);
@@ -202,5 +202,5 @@
 	psi->bUse=1;
 }
-void Opcode_Func_SizeOf(char *Parameter){
+void Opcode_Func_SizeOf( const char *Parameter ){
 	int type,size;
 	LONG_PTR lpIndex;
@@ -212,14 +212,15 @@
 	op_mov_RV(sizeof(_int64),REG_RAX,size);
 }
-void Opcode_Func_VarPtr(char *Parameter){
-	int type;
+void Opcode_Func_VarPtr( const char *Parameter, TYPEINFO &ReturnTypeInfo ){
 	RELATIVE_VAR RelativeVar;
 
 	//変数のアドレスを取得
-	if(!GetVarOffsetReadOnly(Parameter,&type,&RelativeVar,0)) return;
+	if(!GetVarOffsetReadOnly( Parameter, &ReturnTypeInfo.type, &RelativeVar, &ReturnTypeInfo.u.lpIndex )) return;
+
+	PTR_LEVEL_UP( ReturnTypeInfo.type );
 
 	SetVarPtrToReg(REG_RAX,&RelativeVar);
 }
-void Opcode_Func_GetPtrData(char *Parameter,int type){
+void Opcode_Func_GetPtrData( const char *Parameter, const int type ){
 	int i2;
 
@@ -246,38 +247,46 @@
 }
 
-int Opcode_CallFunc(char *Parameter,int FuncNum){
+void Opcode_CallFunc( const char *Parameter, const int FuncNum, TYPEINFO &ReturnTypeInfo ){
 	switch(FuncNum){
 		case FUNC_LEN:
 			Opcode_Func_Len(Parameter);
-			return DEF_LONG;
+			ReturnTypeInfo.type = DEF_LONG;
+			break;
 		case FUNC_ADDRESSOF:
 			Opcode_Func_AddressOf(Parameter);
-			return DEF_PTR_VOID;
+			ReturnTypeInfo.type = DEF_PTR_VOID;
+			break;
 		case FUNC_SIZEOF:
 			Opcode_Func_SizeOf(Parameter);
-			return DEF_LONG;
+			ReturnTypeInfo.type = DEF_LONG;
+			break;
 		case FUNC_VARPTR:
-			Opcode_Func_VarPtr(Parameter);
-			return DEF_PTR_VOID;
+			Opcode_Func_VarPtr( Parameter, ReturnTypeInfo );
+			break;
 
 		case FUNC_GETDOUBLE:
 			Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
-			return DEF_DOUBLE;
+			ReturnTypeInfo.type = DEF_DOUBLE;
+			break;
 		case FUNC_GETSINGLE:
 			Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
-			return DEF_SINGLE;
+			ReturnTypeInfo.type = DEF_SINGLE;
+			break;
 		case FUNC_GETQWORD:
 			Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
-			return DEF_QWORD;
+			ReturnTypeInfo.type = DEF_QWORD;
+			break;
 		case FUNC_GETDWORD:
 			Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
-			return DEF_DWORD;
+			ReturnTypeInfo.type = DEF_DWORD;
+			break;
 		case FUNC_GETWORD:
 			Opcode_Func_GetPtrData(Parameter,DEF_WORD);
-			return DEF_WORD;
+			ReturnTypeInfo.type = DEF_WORD;
+			break;
 		case FUNC_GETBYTE:
 			Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
-			return DEF_BYTE;
-	}
-	return 0;
-}
+			ReturnTypeInfo.type = DEF_BYTE;
+			break;
+	}
+}
Index: BasicCompiler64/Opcode.h
===================================================================
--- BasicCompiler64/Opcode.h	(revision 45)
+++ BasicCompiler64/Opcode.h	(revision 46)
@@ -345,17 +345,17 @@
 private:
 	BOOL _overload_check(PARAMETER_INFO *ppi,int pi_num,TYPEINFO *pReturnTypeInfo,int overload_level);
-	SUBINFO *OverloadSolutionWithReturnType(char *name,SUBINFO **ppsi,int num);
+	SUBINFO *OverloadSolutionWithReturnType(const char *name,SUBINFO **ppsi,int num);
 public:
-	SUBINFO *OverloadSolution(char *name,SUBINFO **ppsi,int num);
-
-	BOOL ErrorCheck(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
+	SUBINFO *OverloadSolution(const char *name,SUBINFO **ppsi,int num);
+
+	BOOL ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
 	void MacroParameterSupport(PARAMETER_INFO *ppi);
 	void SetObjectParameter(int reg,CClass *pobj_Class,LPSTR Parameter);
 
 	//一時オブジェクトパラメータの生成と破棄
-	void NewTempParameters( char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
+	void NewTempParameters( const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum );
 	void DeleteTempParameters();
 
-	void SetParameter(char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
+	void SetParameter(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum);
 
 	void BackupParameter(int pi_num);
@@ -390,5 +390,5 @@
 int GetFunctionType(int FuncNum);
 int GetFunctionFromName(char *FuncName);
-int Opcode_CallFunc(char *Parameter,int FuncNum);
+void Opcode_CallFunc( const char *Parameter, const int FuncNum, TYPEINFO &ReturnTypeInfo );
 
 //OperatorProc.cpp
