source: dev/BasicCompiler_Common/error.cpp@ 29

Last change on this file since 29 was 28, checked in by dai_9181, 18 years ago

・【32ビットコンパイラ】戻り値に実態オブジェクトを持つインデクサを呼び出すと強制終了してしまうバグを修正。
・仮想関数のオーバーロードが正常に動作しないバグを修正。
・純仮想関数(抽象メソッド)が仮想関数でオーバーロードされていると、クラスのインスタンスが生成できてしまうバグを修正。

File size: 21.2 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2
3BOOL GetErrorMsg(int num,char *KeyWord,char *msg,int pos){
4 extern HANDLE hHeap;
5 int i2;
6 char temporary[64];
7
8 if(KeyWord){
9 for(i2=0;;i2++){
10 if(KeyWord[i2]=='\0') break;
11 if(KeyWord[i2]==1){
12 GetDefaultNameFromES(KeyWord[i2+1],temporary);
13 SlideString(KeyWord+i2+2,lstrlen(temporary)-2);
14 memcpy(KeyWord+i2,temporary,lstrlen(temporary));
15 }
16 }
17 }
18
19 if(num==-1||num==-2) lstrcpy(msg,KeyWord); //部分エラー
20
21 if(num==3){
22 temporary[0]=KeyWord[0];
23 for(i2=1;;i2++){
24 if((!IsVariableChar(KeyWord[i2]))||i2>=255){
25 temporary[i2]=0;
26 break;
27 }
28 temporary[i2]=KeyWord[i2];
29 }
30
31 extern char **SynonymErrorWords;
32 extern int SynonymErrorNum;
33 for(i2=0;i2<SynonymErrorNum;i2++){
34 if(lstrcmp(SynonymErrorWords[i2],temporary)==0) return 0;
35 }
36
37#if defined(JPN)
38 //日本語
39 sprintf(msg,"\"%s\" 無効な識別子です",temporary);
40#else
41 //英語
42 sprintf(msg,"\"%s\" Invalid identifier.",temporary);
43#endif
44
45 //重複エラー情報を追加
46 SynonymErrorWords=(char **)HeapReAlloc(hHeap,0,SynonymErrorWords,(SynonymErrorNum+1)*sizeof(char *));
47 SynonymErrorWords[SynonymErrorNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
48 lstrcpy(SynonymErrorWords[SynonymErrorNum],temporary);
49 SynonymErrorNum++;
50 }
51 if(num==30){
52#if defined(JPN)
53 //日本語
54 if(temporary[0]) sprintf(msg,"\"%s\" の使い方が不正です",KeyWord);
55 else lstrcpy(msg,"文法が間違っています");
56#else
57 //英語
58 if(temporary[0]) sprintf(msg,"How to use the \"%s\" is wrong.",KeyWord);
59 else lstrcpy(msg,"Syntax Error.");
60#endif
61 }
62
63
64 /////////////////////
65 // ワーニングエラー
66 /////////////////////
67#if defined(JPN)
68 ////////////////////
69 //日本語
70 ////////////////////
71 if(num==-101) sprintf(msg,"[警告] %sに強制変換されています。データが失われる可能性があります。",KeyWord);
72 if(num==-102) sprintf(msg,"[警告] %sに強制変換されています。",KeyWord);
73 if(num==-103) sprintf(msg,"[警告] \"%s\" 型が指定されていません。Double型として扱います。",KeyWord);
74 if(num==-104) sprintf(msg,"[警告] \"%s\" 戻り値の型が指定されていません。Double型として扱います。",KeyWord);
75 if(num==-105) sprintf(msg,"[警告] 一時オブジェクトの解放を行えません。キャスト用オブジェクトを用意してください。",KeyWord);
76 if(num==-106) sprintf(msg,"[警告] DLLファイル \"%s\" が見つかりません。",KeyWord);
77 if(num==-107) sprintf(msg,"[警告] DLL関数 \"%s\" を参照できません。",KeyWord);
78#else
79#endif
80
81
82 ///////////////
83 // 一般エラー
84 ///////////////
85
86#if defined(JPN)
87 ////////////////////
88 //日本語
89 ////////////////////
90 if(num==1) lstrcpy(msg,"文法が間違っています");
91 if(num==2) sprintf(msg,"左のオペランドが、左辺値になっていません");
92 //num==3は予約されています
93 if(num==4) sprintf(msg,"%sの相互関係が一致しません",KeyWord);
94 if(num==5) sprintf(msg,"ダブルクォートの数が一致しません");
95 if(num==6) sprintf(msg,"\"%s\" ジャンプ先が不正です",KeyWord);
96 if(num==7) lstrcpy(msg,"DLL名が長すぎます(拡張子を含め、16文字以下にして下さい)");
97 if(num==8) lstrcpy(msg,"コンパイラが認識できない文字コードが含まれています");
98 if(num==9) sprintf(msg,"型が違います");
99 if(num==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています",KeyWord);
100 if(num==11) sprintf(msg,"\"%s\" 型が違います",KeyWord);
101 if(num==12) sprintf(msg,"\"%s\" の使い方が不正です",KeyWord);
102 if(num==13) sprintf(msg,"\"%s\" を参照できません",KeyWord);
103 if(num==14) sprintf(msg,"\"%s\" 配列指定が不正です",KeyWord);
104 if(num==15) sprintf(msg,"\"%s\" はすでに定義されています",KeyWord);
105 if(num==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています",KeyWord);
106 if(num==17) sprintf(msg,"リソース データが不正です");
107 if(num==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません",KeyWord);
108 if(num==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません",KeyWord);
109 if(num==20) lstrcpy(msg,"全角スペースが含まれています(全角スペースはコンパイラが認識できないので、半角スペースまたはタブ文字にしてください)");
110 if(num==21) sprintf(msg,"If制御のブロック指定が不正です");
111 if(num==22) sprintf(msg,"\"%s\" に対する \"End %s\" が見つかりません",KeyWord,KeyWord);
112 if(num==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗",KeyWord);
113 if(num==24) lstrcpy(msg,"Export指定の関数のパラメータには実体オブジェクトを利用することはできません(BytePtr型などを利用して下さい)");
114 if(num==27) sprintf(msg,"\"%s\" は定義されていません",KeyWord);
115 if(num==28) sprintf(msg,"構造体パラメータはポインタ参照にしてください(%s)",KeyWord);
116 if(num==29) sprintf(msg,"配列ポインタを要素と同時に引渡すときは、ポインタ参照(ByRef)にしてください");
117 //num==30は予約されています
118 if(num==31) sprintf(msg,"\"%s\" は構造体です(メンバの参照はピリオド \".\" で区切ってください)",KeyWord);
119 if(num==32) sprintf(msg,"\"%s\" は構造体ポインタです(メンバの参照は \"->\" で区切ってください)",KeyWord);
120 if(num==33) sprintf(msg,"定数式にリテラル値、または定数以外のものが含まれています");
121 if(num==34) sprintf(msg,"定数はモジュールレベルで宣言して下さい");
122 if(num==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです",KeyWord);
123 if(num==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません(\"->\" 参照はできません)",KeyWord);
124 if(num==40) lstrcpy(msg,"関数の戻り値にオブジェクトを指定することはできません");
125 if(num==41) lstrcpy(msg,"初期データが不正です");
126 if(num==42) lstrcpy(msg,"閉じカッコ \")\" の後に不正な文字が含まれています");
127 if(num==43) lstrcpy(msg,"ダブルクォートの後に不正な文字が含まれています");
128 if(num==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません",KeyWord);
129 if(num==46) lstrcpy(msg,"配列の添え字に整数以外の値が与えられています");
130 if(num==47) lstrcpy(msg,"As演算子の右辺値に型名以外の識別子が指定されています");
131 if(num==48) sprintf(msg,"%s演算子に対して型名が指定されています",KeyWord);
132 if(num==49) lstrcpy(msg,"添え字に整数以外の型が指定されています");
133 if(num==50) sprintf(msg,"%sに変換できません",KeyWord);
134 if(num==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は1,2,4,8,16のいずれかでなければなりません");
135 if(num==52) sprintf(msg,"\"%s\" オーバーロードを解決できません",KeyWord);
136 if(num==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります",KeyWord);
137 if(num==54) sprintf(msg,"対応する%sが存在しません。",KeyWord);
138 if(num==55) sprintf(msg,"\"%s\" は対応するForステートメントで利用されるカウンタ変数ではありません。",KeyWord);
139 if(num==56) lstrcpy(msg,"ゼロ割りが行われました。");
140 if(num==57) lstrcpy(msg,"8進数のリテラル表記が不正です。");
141 if(num==58) lstrcpy(msg,"16進数のリテラル表記が不正です。");
142 if(num==59) sprintf(msg,"マニフェスト ファイル \"%s\" の読み込みに失敗。",KeyWord);
143 if(num==60) lstrcpy(msg,"Staticステートメントはグローバル領域では使用できません。");
144 if(num==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。",KeyWord);
145
146
147 //オブジェクト関連
148 if(num==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません",KeyWord);
149 if(num==103) sprintf(msg,"\"%s\" メンバは定義されていません",KeyWord);
150 if(num==104) sprintf(msg,"\"%s\" 参照方法が違います",KeyWord);
151 if(num==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません",KeyWord);
152 if(num==106) sprintf(msg,"\"%s\" クラスは定義されていません",KeyWord);
153 if(num==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません",KeyWord);
154 if(num==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません",KeyWord);
155 if(num==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません",KeyWord);
156 if(num==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません",KeyWord);
157 if(num==111) lstrcpy(msg,"InheritsはClass定義内の先頭に記述する必要があります");
158 if(num==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません",KeyWord);
159 if(num==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です",KeyWord);
160 if(num==114) lstrcpy(msg,"デストラクタはパラメータを持てません");
161 if(num==115) lstrcpy(msg,"コンストラクタ及びデストラクタは戻り値を持てません");
162 if(num==116) lstrcpy(msg,"コンストラクタ及びデストラクタはパブリックアクセスにしなければなりません");
163 if(num==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません");
164 if(num==118) lstrcpy(msg,"参照する基底クラスが存在しません");
165 if(num==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません",KeyWord);
166 if(num==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です");
167 if(num==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません");
168 if(num==122) lstrcpy(msg,"Delete演算子にポインタ以外の型が指定されています");
169 if(num==123) lstrcpy(msg,"ループ継承が行われました");
170 if(num==124) lstrcpy(msg,"循環参照が行われました");
171 if(num==125) sprintf(msg,"\"%s\" は抽象クラスです。インスタンス化することはできません。",KeyWord);
172 if(num==126) lstrcpy(msg,"オペレータのオーバーロードをクラスの外で行うことはできません。");
173 if(num==127) lstrcpy(msg,"Override修飾子の指定が無い状況でオーバーライドを行うことはできません。");
174 if(num==128) lstrcpy(msg,"オーバーライドを行うときはアクセシビリティを同一にしなければなりません。");
175 if(num==129) sprintf(msg,"静的メンバ \"%s\" は定義されていません。",KeyWord);
176 if(num==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",KeyWord);
177 if(num==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。");
178 if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
179
180 //Enum関連
181 if(num==150) sprintf(msg,"\"%s\" 値が定義されていません",KeyWord);
182 if(num==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません",KeyWord);
183
184 //リンカ
185 if(num==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)",KeyWord);
186 if(num==201) sprintf(msg,"\"%s\" の読み込みに失敗",KeyWord);
187
188 //原因不明
189 if(num==300) lstrcpy(msg,"内部エラー");
190
191#else
192 ////////////////////
193 //英語
194 ////////////////////
195 if(num==1) lstrcpy(msg,"Syntax Error.");
196 if(num==2) sprintf(msg,"Left operand must be l-value.");
197 //num==3は予約されています
198 if(num==4) sprintf(msg,"Correlation of %s is wrong.",KeyWord);
199 if(num==5) sprintf(msg,"Correlation of double quotes is wrong.");
200 if(num==6) sprintf(msg,"\"%s\" Label not found.",KeyWord);
201 if(num==7) lstrcpy(msg,"The DLL name is too long. Must be 16 characters or less.");
202 if(num==8) lstrcpy(msg,"The inaccurate characters are contained.");
203 if(num==9) sprintf(msg,"Type is wrong.");
204 if(num==10) sprintf(msg,"\"%s\" Rule of parameter is wrong.",KeyWord);
205 if(num==11) sprintf(msg,"\"%s\" Type is wrong.",KeyWord);
206 if(num==12) sprintf(msg,"\"%s\" Not a valid use.",KeyWord);
207 if(num==13) sprintf(msg,"Cannot refer to \"%s\".",KeyWord);
208 if(num==14) sprintf(msg,"\"%s\" Array argument(s) out of bound.",KeyWord);
209 if(num==15) sprintf(msg,"\"%s\" is already defined.",KeyWord);
210 if(num==16) sprintf(msg,"\"%s\" Argument(s) following variable which is not pointer or array.",KeyWord);
211 if(num==17) sprintf(msg,"Invalid resource data.");
212 if(num==18) sprintf(msg,"\"%s\" Invalid operation on a pointer variable.",KeyWord);
213 if(num==19) sprintf(msg,"\"%s\" is already to be passed by value. You cannot use \"ByVal\".",KeyWord);
214 if(num==21) sprintf(msg,"Wrong structure of \"If\" block.");
215 if(num==22) sprintf(msg,"No matching \"End %s\" found for \"%s\".",KeyWord,KeyWord);
216 if(num==23) sprintf(msg,"Cannot read the resource file \"%s\".",KeyWord);
217 if(num==24) lstrcpy(msg,"Must not use String type as an argument for exported function. (Use BytePtr type instead.)");
218 if(num==27) sprintf(msg,"\"%s\" Undefined procedure.",KeyWord);
219 if(num==28) sprintf(msg,"\"%s\" Structure must not be passed by value. (Use \"ByRef\".)",KeyWord);
220 if(num==29) sprintf(msg,"Array must not be passed by value. (Use \"ByRef\".)");
221 //num==30は予約されています
222 if(num==31) sprintf(msg,"\"%s\" is a struct. (Use period \".\" to refer to the members.)",KeyWord);
223 if(num==32) sprintf(msg,"\"%s\" is a pointer of struct. (Use arrow \"->\" to refer to the members.)",KeyWord);
224 if(num==33) sprintf(msg,"Constant formula has a thing that is not literal value or constant value.");
225 if(num==34) sprintf(msg,"Constant formula must be defined in the module level.");
226 if(num==38) sprintf(msg,"\"%s\" is a procedure without a return value.",KeyWord);
227 if(num==39) sprintf(msg,"\"%s\" is not object pointer. \"->\" is invalid.",KeyWord);
228 if(num==40) lstrcpy(msg,"Cannot set a object to return value.");
229 if(num==41) lstrcpy(msg,"Init data is wrong.");
230 if(num==42) lstrcpy(msg,"The inaccurate characters are contained after the closing parenthesis \")\".");
231 if(num==43) lstrcpy(msg,"The inaccurate characters are contained after the double quote.");
232
233 //オブジェクト関連
234 if(num==102) sprintf(msg,"\"%s\" The object is not defined.",KeyWord);
235 if(num==103) sprintf(msg,"\"%s\" The member is not defined.",KeyWord);
236 if(num==104) sprintf(msg,"\"%s\" The reference character is different.",KeyWord);
237 if(num==105) sprintf(msg,"\"%s\" An own class is not inheritable.",KeyWord);
238 if(num==106) sprintf(msg,"\"%s\" It class is not defined.",KeyWord);
239 if(num==107) sprintf(msg,"\"%s\" Cannot access the private member.",KeyWord);
240 if(num==108) sprintf(msg,"\"%s\" Cannot access the protected member.",KeyWord);
241 if(num==109) sprintf(msg,"\"%s\" Cannot call the private member.",KeyWord);
242 if(num==110) sprintf(msg,"\"%s\" Cannot call the protected member.",KeyWord);
243 if(num==111) lstrcpy(msg,"The Inherits phrase must be described to the 1st line of class module");
244 if(num==112) sprintf(msg,"\"%s\" is not class object. Therefor you cannot set the parameter for constructor.",KeyWord);
245 if(num==113) sprintf(msg,"\"%s\" The parameter for constructor is wrong.",KeyWord);
246 if(num==114) lstrcpy(msg,"Destructor cannot have a parameter.");
247 if(num==115) lstrcpy(msg,"Constructor and Destructor cannot have a return value.");
248 if(num==116) lstrcpy(msg,"Constructor and Destructor must be public access.");
249 if(num==117) lstrcpy(msg,"Destructors name must be \"~ClassName\".");
250 if(num==118) lstrcpy(msg,"Super class is not found.");
251 if(num==119) sprintf(msg,"\"%s\" The member is not defined in the super class.",KeyWord);
252
253 //Enum関連
254 if(num==150) sprintf(msg,"\"%s\" The value is not set",KeyWord);
255 if(num==151) sprintf(msg,"\"%s\" is not found from enum lists.",KeyWord);
256
257 //リンカ
258 if(num==200) sprintf(msg,"\"%s\" Unknown error.",KeyWord);
259#endif
260
261 return 1;
262}
263void SetError(int num,char *KeyWord,int pos){
264 extern HANDLE hHeap;
265 extern HWND hMainDlg;
266 extern ERRORINFO *pErrorInfo;
267 extern int ErrorNum;
268 char temporary[1024],temp2[1024],temp3[32],FileName[MAX_PATH];
269 BOOL bFirst;
270 int i2;
271
272 extern BOOL bDebugRun;
273 if(bDebugRun) return;
274
275 if(num!=-2){
276 //一般エラーまたは警告
277 i2=0; //ここにブレークポイントをおく
278
279 if(num>-100){
280 //エラーのみ
281 i2=0;
282 }
283
284 }
285
286#ifndef _DEBUG
287 if(num==300){
288 //内部エラー
289 return;
290 }
291#endif
292
293 if(!GetErrorMsg(num,KeyWord,temporary,pos)) return;
294
295 if(ErrorNum==0){
296 SetDlgItemText(hMainDlg,IDC_ERRORLIST,"");
297 EnableWindow(GetDlgItem(hMainDlg,IDC_ERRORLIST),1);
298 bFirst=1;
299 }
300 else bFirst=0;
301
302
303 ////////////////////
304 // エラー情報を追加
305 pErrorInfo=(ERRORINFO *)HeapReAlloc(hHeap,0,pErrorInfo,(ErrorNum+1)*sizeof(ERRORINFO));
306
307 if(pos==-1){
308 pErrorInfo[ErrorNum].FileName=0;
309 lstrcpy(temp2,temporary);
310 }
311 else{
312 GetLineNum(pos,&pErrorInfo[ErrorNum].line,FileName);
313
314 pErrorInfo[ErrorNum].FileName=(char *)HeapAlloc(hHeap,0,lstrlen(FileName)+1);
315 lstrcpy(pErrorInfo[ErrorNum].FileName,FileName);
316
317 _splitpath(pErrorInfo[ErrorNum].FileName,0,0,temp2,temp3);
318 lstrcat(temp2,temp3);
319
320 if(pErrorInfo[ErrorNum].line==-1)
321 sprintf(temp2+lstrlen(temp2),"(no area) %s",temporary);
322 else
323 sprintf(temp2+lstrlen(temp2),"(%d) - %s",pErrorInfo[ErrorNum].line+1,temporary);
324 }
325
326 i2=GetWindowTextLength(GetDlgItem(hMainDlg,IDC_ERRORLIST));
327 SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_SETSEL,i2,i2);
328 if(bFirst==0){
329 SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_REPLACESEL,0,(LPARAM)"\r\n");
330 i2+=2;
331 SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_SETSEL,i2,i2);
332 }
333 SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_REPLACESEL,0,(LPARAM)temp2);
334
335 if(num==-2){
336 //コンパイルメッセージ
337 //※何もしない
338 extern int CompileMsgNum;
339 CompileMsgNum++;
340 }
341 else{
342 if(num>-100){
343 //警告ではなく、エラーの場合はエラーチェックフラグを立てる
344 extern BOOL bError;
345 bError=1;
346 }
347 else{
348 extern int WarningNum;
349 WarningNum++;
350 }
351 }
352
353 ErrorNum++;
354}
355void CompileMessage(char *buffer){
356 SetError(-2,buffer,-1);
357}
358
359#define STRING_SYSTEM_DECLAREHANDLE "*_System_DeclareHandle_"
360void DifferentTypeError(int VarType,LONG_PTR VarIndex,int CalcType,LONG_PTR CalcIndex,int iWarning,char *pszFuncName,int ParmNum){
361 //////////////////////////
362 // キャストに関する警告
363 //////////////////////////
364 char temporary[255],temp2[255],temp3[255];
365
366 if(IS_LITERAL(CalcIndex)) CalcIndex=-1;
367
368 if(pszFuncName)
369 sprintf(temporary,"\"%s\"の第%dパラメータが、",pszFuncName,ParmNum+1);
370 else temporary[0]=0;
371
372 if(!GetTypeName(VarType,VarIndex,temp2)) lstrcpy(temp2,"Any");
373 if(memcmp(temp2,STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0){
374 memmove(temp2,
375 temp2+lstrlen(STRING_SYSTEM_DECLAREHANDLE),
376 lstrlen(temp2+lstrlen(STRING_SYSTEM_DECLAREHANDLE))+1);
377 }
378 if(!GetTypeName(CalcType,CalcIndex,temp3)) lstrcpy(temp3,"Any");
379 if(memcmp(temp3,STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0){
380 memmove(temp3,
381 temp3+lstrlen(STRING_SYSTEM_DECLAREHANDLE),
382 lstrlen(temp3+lstrlen(STRING_SYSTEM_DECLAREHANDLE))+1);
383 }
384 sprintf(temporary+lstrlen(temporary),"%sから%s",temp3,temp2);
385
386 extern int cp;
387 if(iWarning==1) SetError(-101,temporary,cp);
388 else if(iWarning==2) SetError(-102,temporary,cp);
389}
390
391void CheckDifferentType(int VarType,LONG_PTR lpVarIndex,int CalcType,LONG_PTR lpCalcIndex,char *pszFuncName,int ParmNum){
392
393 if(VarType==DEF_OBJECT||CalcType==DEF_OBJECT){
394 //オブジェクトインスタンスの場合
395 if(!(VarType==CalcType&&lpVarIndex==lpCalcIndex)){
396 DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,2,pszFuncName,ParmNum);
397 return;
398 }
399 }
400
401 //#strictが指定されていないときは型チェックを行わないようにする
402 extern BOOL bStrict;
403 if(bStrict==0) return;
404
405 if(CalcType&FLAG_PTR){
406 //配列先頭フラグがたっている場合は、ポインタ型として扱う
407 CalcType=MAKE_PTR_TYPE(NATURAL_TYPE(CalcType),PTR_LEVEL(CalcType)+1);
408 }
409
410 if(IsPtrType(VarType)||IsPtrType(CalcType)){
411 /* 右辺及び左辺のいずれかがポインタ型の場合は、
412 型チェックを行う。
413 ・同一の種類のポインタ型以外はエラーとする */
414
415 if(IsPtrType(VarType)&&lpCalcIndex==LITERAL_NULL){
416 //リテラルNULL値の場合
417 return;
418 }
419
420 if(VarType==DEF_PTR_VOID){
421 //左辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる
422 if(IsPtrType(CalcType)) return;
423 }
424
425 if(CalcType==DEF_PTR_VOID){
426 //右辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる
427 if(IsPtrType(VarType)) return;
428 }
429
430 if(VarType!=CalcType){
431 DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,2,pszFuncName,ParmNum);
432 return;
433 }
434
435 if(VarType==DEF_PTR_OBJECT){
436 //双方がオブジェクトポインタ型の場合
437 if(lpVarIndex!=lpCalcIndex){
438 CClass *pobj_tempClass;
439 pobj_tempClass=(CClass *)lpCalcIndex;
440 while(pobj_tempClass&&(!IS_LITERAL((LONG_PTR)pobj_tempClass))){
441 pobj_tempClass=pobj_tempClass->pobj_InheritsClass;
442
443 if(lpVarIndex==(LONG_PTR)pobj_tempClass){
444 //継承先が等しいとき
445 return;
446 }
447 }
448 DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,2,pszFuncName,ParmNum);
449 return;
450 }
451 }
452 }
453
454 if(VarType==DEF_DOUBLE){
455 if(Is64Type(CalcType)){
456 //64ビット整数値の場合は警告を出す
457 DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
458 }
459 }
460 else if(VarType==DEF_SINGLE){
461 if(Is64Type(CalcType)||CalcType==DEF_DOUBLE){
462 //64ビット整数値、またはDouble型の場合は警告を出す
463 DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
464 }
465 }
466 else if(GetTypeSize(VarType,lpVarIndex)==sizeof(char)){
467 if(GetTypeSize(CalcType,lpCalcIndex)>sizeof(char)&&
468 lpCalcIndex!=LITERAL_NULL&&
469 lpCalcIndex!=LITERAL_M128_0&&
470 lpCalcIndex!=LITERAL_0_255){
471 //8ビット整数値より大きな型で、リテラル値でもない場合は警告を出す
472 DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
473 }
474 }
475 else if(GetTypeSize(VarType,lpVarIndex)==sizeof(short)){
476 if(GetTypeSize(CalcType,lpCalcIndex)>sizeof(short)&&
477 lpCalcIndex!=LITERAL_NULL&&
478 lpCalcIndex!=LITERAL_M128_0&&
479 lpCalcIndex!=LITERAL_0_255&&
480 lpCalcIndex!=LITERAL_M32768_0&&
481 lpCalcIndex!=LITERAL_0_65535){
482 //16ビット整数値より大きな型で、リテラル値でもない場合は警告を出す
483 DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
484 }
485 }
486 else if(GetTypeSize(VarType,lpVarIndex)==sizeof(long)){
487 if(IsRealNumberType(CalcType)||
488 (IsWholeNumberType(CalcType)&&
489 GetTypeSize(CalcType,lpCalcIndex)>sizeof(long)&&
490 lpCalcIndex!=LITERAL_NULL)
491 ){
492 /* 32ビット整数値より大きな型、または実数、
493 またはリテラル値でもない場合は警告を出す */
494 DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
495 }
496 }
497 else if(GetTypeSize(VarType,lpVarIndex)==sizeof(_int64)){
498 if(IsRealNumberType(CalcType)){
499 //実数の場合は警告を出す
500 DifferentTypeError(VarType,lpVarIndex,CalcType,lpCalcIndex,1,pszFuncName,ParmNum);
501 }
502 }
503}
Note: See TracBrowser for help on using the repository browser.