]> andersk Git - splint.git/blame - src/constraintGeneration.c
Fixed library dump support so that buffer constraint annotations are read and written...
[splint.git] / src / constraintGeneration.c
CommitLineData
616915dd 1
2/*
3** constraintGeneration.c
4*/
5
6//#define DEBUGPRINT 1
7
8# include <ctype.h> /* for isdigit */
9# include "lclintMacros.nf"
10# include "basic.h"
920a3797 11
616915dd 12# include "cgrammar_tokens.h"
13
14# include "exprChecks.h"
15# include "aliasChecks.h"
16# include "exprNodeSList.h"
17
920a3797 18//# include "exprDataQuite.i"
616915dd 19
84c9ffbf 20/*@access exprNode @*/
21
470b7798 22extern void forLoopHeuristics( exprNode e, exprNode forPred, exprNode forBody);
23
920a3797 24//bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e);
616915dd 25static bool exprNode_handleError( exprNode p_e);
26
27//static cstring exprNode_findConstraints ( exprNode p_e);
28static bool exprNode_isMultiStatement(exprNode p_e);
84c9ffbf 29static void exprNode_multiStatement (exprNode p_e);
30
616915dd 31//static void exprNode_constraintPropagateUp (exprNode p_e);
616915dd 32
bb25bea6 33static constraintList exprNode_traversTrueEnsuresConstraints (exprNode e);
34static constraintList exprNode_traversFalseEnsuresConstraints (exprNode e);
616915dd 35
4ab867d6 36exprNode makeDataTypeConstraints (/*@returned@*/ exprNode e);
37
920a3797 38//constraintList constraintList_makeFixedArrayConstraints (sRefSet s);
616915dd 39
40//bool exprNode_testd()
41//{
42 /* if ( ( (exprNode_isError ) ) )
43 {
44 }
45 if ( ( (e_1 ) ) )
46 {
47 }
48 */
49//}
50
bb25bea6 51static bool exprNode_isUnhandled (exprNode e)
616915dd 52{
53 llassert( exprNode_isDefined(e) );
54 switch (e->kind)
55 {
56 case XPR_INITBLOCK:
57 case XPR_EMPTY:
58 case XPR_LABEL:
59 case XPR_CONST:
60 case XPR_VAR:
61 case XPR_BODY:
62 case XPR_OFFSETOF:
63 case XPR_ALIGNOFT:
64 case XPR_ALIGNOF:
65 case XPR_VAARG:
66 case XPR_ITERCALL:
67 case XPR_ITER:
616915dd 68 case XPR_GOTO:
69 case XPR_CONTINUE:
70 case XPR_BREAK:
71 case XPR_COMMA:
72 case XPR_COND:
73 case XPR_TOK:
74 case XPR_FTDEFAULT:
75 case XPR_DEFAULT:
76 case XPR_SWITCH:
77 case XPR_FTCASE:
78 case XPR_CASE:
79 // case XPR_INIT:
80 case XPR_NODE:
81 DPRINTF((message ("Warning current constraint generation does not handle expression %s", exprNode_unparse(e)) ) );
82 return TRUE;
83 /*@notreached@*/
84 break;
85 default:
86 return FALSE;
87
88 }
89 /*not reached*/
90 return FALSE;
91}
92
93bool exprNode_handleError( exprNode e)
94{
95 if (exprNode_isError (e) || exprNode_isUnhandled(e) )
96 {
97 static /*@only@*/ cstring error = cstring_undefined;
98
99 if (!cstring_isDefined (error))
100 {
101 error = cstring_makeLiteral ("<error>");
102 }
103
104 /*@-unqualifiedtrans*/ return TRUE; /*@=unqualifiedtrans*/
105 }
106 return FALSE;
107}
108
109bool /*@alt void@*/ exprNode_generateConstraints (/*@temp@*/ exprNode e)
110{
111 if (exprNode_isError (e) )
112 return FALSE;
bb25bea6 113 /*
c3e695ff 114 e->requiresConstraints = constraintList_makeNew();
115 e->ensuresConstraints = constraintList_makeNew();
116 e->trueEnsuresConstraints = constraintList_makeNew();
117 e->falseEnsuresConstraints = constraintList_makeNew();
bb25bea6 118 */
9280addf 119
616915dd 120 if (exprNode_isUnhandled (e) )
121 {
122 DPRINTF( (message("Warning ignoring %s", exprNode_unparse (e) ) ) );
9280addf 123 return FALSE;
616915dd 124 }
125
126
127 // e = makeDataTypeConstraints (e);
128
129 DPRINTF((message ("exprNode_generateConstraints Analysising %s at %s", exprNode_unparse( e),
130 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
131
132 if (exprNode_isMultiStatement ( e) )
133 {
134 exprNode_multiStatement(e);
135 }
136 else
137 {
9280addf 138 fileloc loc;
139
140 loc = exprNode_getNextSequencePoint(e);
141 exprNode_exprTraverse(e, FALSE, FALSE, loc);
142
bb25bea6 143 fileloc_free(loc);
616915dd 144 return FALSE;
145 }
146
147 {
148 constraintList c;
149
150 c = constraintList_makeFixedArrayConstraints (e->uses);
bb25bea6 151 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, c);
616915dd 152
153 // e->ensuresConstraints = constraintList_mergeEnsures(c, e->ensuresConstraints);
154
bb25bea6 155 constraintList_free(c);
616915dd 156 }
157
bb25bea6 158 DPRINTF ( (message ("e->requiresConstraints %s", constraintList_printDetailed (e->requiresConstraints) ) ) );
616915dd 159 return FALSE;
160}
161
162
163/* handles multiple statements */
164
165bool exprNode_isMultiStatement(exprNode e)
166{
167if (exprNode_handleError (e) != NULL)
168 return FALSE;
169
170 switch (e->kind)
171 {
172 case XPR_FOR:
173 case XPR_FORPRED:
174 case XPR_IF:
175 case XPR_IFELSE:
176 case XPR_WHILE:
177 case XPR_WHILEPRED:
178 case XPR_DOWHILE:
179 case XPR_BLOCK:
180 case XPR_STMT:
181 case XPR_STMTLIST:
182 return TRUE;
183 default:
184 return FALSE;
185 }
186
187}
188
bb25bea6 189static void exprNode_stmt (exprNode e)
616915dd 190{
191 exprNode snode;
192 fileloc loc;
d46ce6a4 193 cstring s;
9280addf 194
616915dd 195 if (exprNode_isError(e) )
196 {
84c9ffbf 197 return; // FALSE;
616915dd 198 }
bb25bea6 199 /*e->requiresConstraints = constraintList_makeNew();
200 e->ensuresConstraints = constraintList_makeNew(); */
616915dd 201 // e = makeDataTypeConstraints(e);
202
203
204 DPRINTF(( "STMT:") );
9280addf 205 s = exprNode_unparse(e);
206 // DPRINTF ( ( message("STMT: %s ") ) );
207
616915dd 208 if (e->kind == XPR_INIT)
209 {
bb25bea6 210 constraintList tempList;
616915dd 211 DPRINTF (("Init") );
212 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
213 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
84c9ffbf 214 exprNode_exprTraverse (e, FALSE, FALSE, loc);
bb25bea6 215 fileloc_free(loc);
216
217 tempList = e->requiresConstraints;
616915dd 218 e->requiresConstraints = exprNode_traversRequiresConstraints(e);
bb25bea6 219 constraintList_free(tempList);
220
221 tempList = e->ensuresConstraints;
616915dd 222 e->ensuresConstraints = exprNode_traversEnsuresConstraints(e);
bb25bea6 223 constraintList_free(tempList);
84c9ffbf 224 return; // notError;
616915dd 225 }
226
227 if (e->kind != XPR_STMT)
228 {
229
230 DPRINTF (("Not Stmt") );
231 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
232 if (exprNode_isMultiStatement (e) )
233 {
234 return exprNode_multiStatement (e );
235 }
84c9ffbf 236 DPRINTF( (message ("Ignoring non-statement %s", exprNode_unparse(e) ) ) );
237 return; //TRUE;
616915dd 238 // llassert(FALSE);
239 }
240
241 DPRINTF (("Stmt") );
242 DPRINTF ( (message ("%s ", exprNode_unparse (e)) ) );
243
244 snode = exprData_getUopNode (e->edata);
245
246 /* could be stmt involving multiple statements:
247 i.e. if, while for ect.
248 */
249
250 if (exprNode_isMultiStatement (snode))
251 {
84c9ffbf 252 exprNode_multiStatement (snode);
253 (void) exprNode_copyConstraints (e, snode);
254 return;
616915dd 255 }
256
257 loc = exprNode_getNextSequencePoint(e); /* reduces to an expression */
84c9ffbf 258 //notError =
259 exprNode_exprTraverse (snode, FALSE, FALSE, loc);
bb25bea6 260
261 fileloc_free(loc);
262
263 constraintList_free (e->requiresConstraints);
616915dd 264 e->requiresConstraints = exprNode_traversRequiresConstraints(snode);
265 // printf ("For: %s \n", exprNode_unparse (e) );
266 // printf ("%s\n", constraintList_print(e->requiresConstraints) );
bb25bea6 267
268 constraintList_free (e->ensuresConstraints);
616915dd 269 e->ensuresConstraints = exprNode_traversEnsuresConstraints(snode);
270 // printf ("Ensures that:\n %s\n", constraintList_print(e->ensuresConstraints) );
271 // llassert(notError);
bb25bea6 272
273 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
274 constraintList_print(e->requiresConstraints),
275 constraintList_print(e->ensuresConstraints) ) ) );
276
84c9ffbf 277 return; // notError;
616915dd 278
279}
280
281
bb25bea6 282static void exprNode_stmtList (exprNode e)
616915dd 283{
284 exprNode stmt1, stmt2;
285 if (exprNode_isError (e) )
286 {
84c9ffbf 287 return; // FALSE;
616915dd 288 }
289
bb25bea6 290 /*
291 e->requiresConstraints = constraintList_makeNew();
292 e->ensuresConstraints = constraintList_makeNew();
293 */
616915dd 294 // e = makeDataTypeConstraints(e);
295
296 /*Handle case of stmtList with only one statement:
297 The parse tree stores this as stmt instead of stmtList*/
298 if (e->kind != XPR_STMTLIST)
299 {
84c9ffbf 300 exprNode_stmt(e);
301 return;
616915dd 302 }
303 llassert (e->kind == XPR_STMTLIST);
304 DPRINTF(( "STMTLIST:") );
305 DPRINTF ((cstring_toCharsSafe (exprNode_unparse(e)) ) );
306 stmt1 = exprData_getPairA (e->edata);
307 stmt2 = exprData_getPairB (e->edata);
308
309
310 DPRINTF((" stmtlist ") );
311 DPRINTF ((message("XW%s | %s", exprNode_unparse(stmt1), exprNode_unparse(stmt2) ) ) );
312
313 exprNode_stmt (stmt1);
314 DPRINTF(("\nstmt after stmtList call " ));
315
316 exprNode_stmt (stmt2);
317 mergeResolve (e, stmt1, stmt2 );
318
319 DPRINTF ( (message ("smtlist constraints are: pre: %s \n and \t post %s\n",
320 constraintList_print(e->requiresConstraints),
321 constraintList_print(e->ensuresConstraints) ) ) );
84c9ffbf 322 return; // TRUE;
a8e557d3 323}
324
4ab867d6 325static exprNode doIf (/*@returned@*/ exprNode e, exprNode test, exprNode body)
616915dd 326{
bb25bea6 327 constraintList temp;
328
616915dd 329 DPRINTF ((message ("doIf: %s ", exprNode_unparse(e) ) ) );
470b7798 330
a8e557d3 331 llassert(exprNode_isDefined(test) );
84c9ffbf 332 llassert (exprNode_isDefined (e) );
333 llassert (exprNode_isDefined (body) );
bb25bea6 334
616915dd 335
bb25bea6 336 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
337
338 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
339
340 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->trueEnsuresConstraints) ) ));
341
342 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->falseEnsuresConstraints) ) ));
343
344
345
346 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->ensuresConstraints) ) ));
347
348 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->ensuresConstraints) ) ));
349
350 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->trueEnsuresConstraints) ) ));
351
352 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(test), constraintList_printDetailed(test->falseEnsuresConstraints) ) ));
353
354
355
356 temp = test->trueEnsuresConstraints;
357 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
358 constraintList_free(temp);
359
360 temp = test->ensuresConstraints;
616915dd 361 test->ensuresConstraints = exprNode_traversEnsuresConstraints (test);
bb25bea6 362 constraintList_free(temp);
363
364 temp = test->requiresConstraints;
470b7798 365 test->requiresConstraints = exprNode_traversRequiresConstraints (test);
bb25bea6 366 constraintList_free(temp);
616915dd 367
bb25bea6 368
369 test->trueEnsuresConstraints = constraintList_substituteFreeTarget(test->trueEnsuresConstraints, test->ensuresConstraints);
c3e695ff 370
371 DPRINTF ((message ("doIf: test ensures %s ", constraintList_print(test->ensuresConstraints) ) ) );
372
373 DPRINTF ((message ("doIf: test true ensures %s ", constraintList_print(test->trueEnsuresConstraints) ) ) );
bb25bea6 374
375 constraintList_free(e->requiresConstraints);
616915dd 376 e->requiresConstraints = reflectChanges (body->requiresConstraints, test->trueEnsuresConstraints);
bb25bea6 377
378 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints,
616915dd 379 test->ensuresConstraints);
bb25bea6 380 temp = e->requiresConstraints;
470b7798 381 e->requiresConstraints = constraintList_mergeRequires (e->requiresConstraints, test->requiresConstraints);
bb25bea6 382 constraintList_free(temp);
383
384
616915dd 385#warning bad
bb25bea6 386 constraintList_free(e->ensuresConstraints);
616915dd 387 e->ensuresConstraints = constraintList_copy (test->ensuresConstraints);
90bc41f7 388
389 if (exprNode_mayEscape (body) )
390 {
391 DPRINTF (( message("doIf: the if statement body %s returns or exits", exprNode_unparse(body) ) ));
bb25bea6 392 e->ensuresConstraints = constraintList_mergeEnsuresFreeFirst (e->ensuresConstraints,
470b7798 393 test->falseEnsuresConstraints);
90bc41f7 394 }
395
9280addf 396 DPRINTF ((message ("doIf: if requiers %s ", constraintList_print(e->requiresConstraints) ) ) );
397
616915dd 398 return e;
399}
400
470b7798 401/*drl added 3/4/2001
402 Also used for condition i.e. ?: operation
403
404 Precondition
405 This function assumes that p, trueBranch, falseBranch have have all been traversed
406 for constraints i.e. we assume that exprNode_traversEnsuresConstraints,
407 exprNode_traversRequiresConstraints, exprNode_traversTrueEnsuresConstraints,
408 exprNode_traversFalseEnsuresConstraints have all been run
409*/
410
411
bb25bea6 412static exprNode doIfElse (/*@returned@*/ exprNode e, exprNode p, exprNode trueBranch, exprNode falseBranch)
470b7798 413{
414
bb25bea6 415 constraintList c1, cons, t, t2, f, f2;
416
417 DPRINTF ((message ("doIfElse: %s ", exprNode_unparse(e) ) ) );
470b7798 418
419 // do requires clauses
420 c1 = constraintList_copy (p->ensuresConstraints);
421
422 t = reflectChanges (trueBranch->requiresConstraints, p->trueEnsuresConstraints);
bb25bea6 423 t = reflectChangesFreePre (t, p->ensuresConstraints);
470b7798 424
470b7798 425 cons = reflectChanges (falseBranch->requiresConstraints, p->falseEnsuresConstraints);
bb25bea6 426 cons = reflectChangesFreePre (cons, c1);
470b7798 427
bb25bea6 428 constraintList_free(e->requiresConstraints);
429 e->requiresConstraints = constraintList_mergeRequiresFreeFirst (t, cons);
430 e->requiresConstraints = constraintList_mergeRequiresFreeFirst (e->requiresConstraints, p->requiresConstraints);
470b7798 431
432 // do ensures clauses
433 // find the the ensures lists for each subbranch
434 t = constraintList_mergeEnsures (p->trueEnsuresConstraints, trueBranch->ensuresConstraints);
bb25bea6 435 t2 = t;
470b7798 436 t = constraintList_mergeEnsures (p->ensuresConstraints, t);
bb25bea6 437 constraintList_free(t2);
438
470b7798 439 f = constraintList_mergeEnsures (p->falseEnsuresConstraints, falseBranch->ensuresConstraints);
bb25bea6 440 f2 = f;
470b7798 441 f = constraintList_mergeEnsures (p->ensuresConstraints, f);
bb25bea6 442 constraintList_free(f2);
470b7798 443
444 // find ensures for whole if/else statement
445
bb25bea6 446 constraintList_free(e->ensuresConstraints);
447
470b7798 448 e->ensuresConstraints = constraintList_logicalOr (t, f);
449
bb25bea6 450 constraintList_free(t);
451 constraintList_free(f);
452 constraintList_free(cons);
453 constraintList_free(c1);
454
455 DPRINTF ((message ("doIfElse: if requires %q ", constraintList_print(e->requiresConstraints) ) ) );
456 DPRINTF ((message ("doIfElse: if ensures %q ", constraintList_print(e->ensuresConstraints) ) ) );
457
470b7798 458 return e;
459}
9280addf 460
4ab867d6 461static exprNode doWhile (/*@returned@*/ exprNode e, exprNode test, exprNode body)
9280addf 462{
463 DPRINTF ((message ("doWhile: %s ", exprNode_unparse(e) ) ) );
464 return doIf (e, test, body);
465}
466
920a3797 467/*@only@*/ constraintList constraintList_makeFixedArrayConstraints (/*@observer@*/ sRefSet s)
616915dd 468{
469 constraintList ret;
470b7798 470 constraint con;
c3e695ff 471 ret = constraintList_makeNew();
616915dd 472
473 sRefSet_elements (s, el)
474 {
475 // llassert (el);
476 if (sRef_isFixedArray(el) )
477 {
84c9ffbf 478 long int size;
470b7798 479 DPRINTF( (message("%s is a fixed array",
480 sRef_unparse(el)) ) );
481 //if (el->kind == SK_DERIVED)
482 // break; //hack until I find the real problem
84c9ffbf 483 size = sRef_getArraySize(el);
616915dd 484 DPRINTF( (message("%s is a fixed array with size %d",
84c9ffbf 485 sRef_unparse(el), (int)size) ) );
486 con = constraint_makeSRefSetBufferSize (el, (size - 1));
487 //con = constraint_makeSRefWriteSafeInt (el, (size - 1));
616915dd 488 ret = constraintList_add(ret, con);
489 }
490 else
491 {
492 DPRINTF( (message("%s is not a fixed array",
493 sRef_unparse(el)) ) );
470b7798 494
495
496 if (sRef_isExternallyVisible (el) )
497 {
498 /*DPRINTF( (message("%s is externally visible",
499 sRef_unparse(el) ) ));
500 con = constraint_makeSRefWriteSafeInt(el, 0);
501 ret = constraintList_add(ret, con);
502
503 con = constraint_makeSRefReadSafeInt(el, 0);
504
505 ret = constraintList_add(ret, con);*/
506 }
616915dd 507 }
508 }
509 end_sRefSet_elements
510
470b7798 511 DPRINTF(( message("constraintList_makeFixedArrayConstraints returning %s",
512 constraintList_print(ret) ) ));
616915dd 513 return ret;
514}
515
4ab867d6 516exprNode makeDataTypeConstraints (/*@returned@*/ exprNode e)
616915dd 517{
518 constraintList c;
519 DPRINTF(("makeDataTypeConstraints"));
520
521 c = constraintList_makeFixedArrayConstraints (e->uses);
522
4ab867d6 523 e->ensuresConstraints = constraintList_addListFree (e->ensuresConstraints, c);
616915dd 524
525 return e;
526}
527
bb25bea6 528static void doFor (exprNode e, exprNode forPred, exprNode forBody)
616915dd 529{
530 exprNode init, test, inc;
531 //merge the constraints: modle as if statement
532 /* init
533 if (test)
534 for body
535 inc */
536 init = exprData_getTripleInit (forPred->edata);
537 test = exprData_getTripleTest (forPred->edata);
538 inc = exprData_getTripleInc (forPred->edata);
539
540 if ( ( (exprNode_isError (test) /*|| (exprNode_isError(init) )*/ ) || (exprNode_isError (inc) ) ) )
541 {
542 DPRINTF ((message ("strange for statement:%s, ignoring it", exprNode_unparse(e) ) ) );
543 return;
544 }
545
546 forLoopHeuristics(e, forPred, forBody);
547
bb25bea6 548 constraintList_free(e->requiresConstraints);
616915dd 549 e->requiresConstraints = reflectChanges (forBody->requiresConstraints, test->ensuresConstraints);
bb25bea6 550 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, test->trueEnsuresConstraints);
551 e->requiresConstraints = reflectChangesFreePre (e->requiresConstraints, forPred->ensuresConstraints);
616915dd 552
553 if (!forBody->canBreak)
554 {
4ab867d6 555 e->ensuresConstraints = constraintList_addListFree(e->ensuresConstraints, constraintList_copy(forPred->ensuresConstraints) );
556 e->ensuresConstraints = constraintList_addListFree(e->ensuresConstraints,constraintList_copy( test->falseEnsuresConstraints));
bb25bea6 557 // forPred->ensuresConstraints = constraintList_undefined;
558 // test->falseEnsuresConstraints = constraintList_undefined;
616915dd 559 }
560 else
561 {
562 DPRINTF(("Can break") );
563 }
564
565}
566
bb25bea6 567static exprNode doSwitch (/*@returned@*/ exprNode e)
470b7798 568{
569 exprNode body;
570 exprData data;
571
572 data = e->edata;
573 llassert(FALSE);
90bc41f7 574 //DPRINTF (( message ("doSwitch for: switch (%s) %s",
470b7798 575 // exprNode_unparse (exprData_getPairA (data)),
576 // exprNode_unparse (exprData_getPairB (data))) ));
577
578 body = exprData_getPairB (data);
579
580 // exprNode_generateConstraints(body);
581
582 // e->requiresConstraints = constraintList_copy ( body->requiresConstraints );
583 //e->ensuresConstraints = constraintList_copy ( body->ensuresConstraints );
584
585 return e;
586}
9280addf 587
588
84c9ffbf 589void exprNode_multiStatement (exprNode e)
616915dd 590{
591
592 bool ret;
593 exprData data;
594 exprNode e1, e2;
595 exprNode p, trueBranch, falseBranch;
596 exprNode forPred, forBody;
470b7798 597 exprNode test;
bb25bea6 598
599 constraintList temp;
600
470b7798 601 // constraintList t, f;
bb25bea6 602 /*e->requiresConstraints = constraintList_makeNew();
c3e695ff 603 e->ensuresConstraints = constraintList_makeNew();
604 e->trueEnsuresConstraints = constraintList_makeNew();
605 e->falseEnsuresConstraints = constraintList_makeNew();
bb25bea6 606 */
616915dd 607 // e = makeDataTypeConstraints(e);
608
609 DPRINTF((message ("exprNode_multistatement Analysising %s %s at", exprNode_unparse( e),
610 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
611
612 if (exprNode_handleError (e))
613 {
84c9ffbf 614 return; // FALSE;
616915dd 615 }
616
617 data = e->edata;
618
619 ret = TRUE;
620
621 switch (e->kind)
622 {
623
624 case XPR_FOR:
625 // ret = message ("%s %s",
626 forPred = exprData_getPairA (data);
627 forBody = exprData_getPairB (data);
628
629 //first generate the constraints
630 exprNode_generateConstraints (forPred);
631 exprNode_generateConstraints (forBody);
632
633
634 doFor (e, forPred, forBody);
635
636 break;
637
638 case XPR_FORPRED:
639 // ret = message ("for (%s; %s; %s)",
640 exprNode_generateConstraints (exprData_getTripleInit (data) );
641 test = exprData_getTripleTest (data);
642 exprNode_exprTraverse (test,FALSE, FALSE, exprNode_loc(e));
9280addf 643 exprNode_generateConstraints (exprData_getTripleInc (data) );
644
616915dd 645 if (!exprNode_isError(test) )
bb25bea6 646 {
647 constraintList temp2;
648 temp2 = test->trueEnsuresConstraints;
649 test->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(test);
650 constraintList_free(temp2);
651 }
652
616915dd 653 exprNode_generateConstraints (exprData_getTripleInc (data));
654 break;
9280addf 655
656 case XPR_WHILE:
657 e1 = exprData_getPairA (data);
658 e2 = exprData_getPairB (data);
659
660 exprNode_exprTraverse (e1,
661 FALSE, FALSE, exprNode_loc(e1));
662
663 exprNode_generateConstraints (e2);
664
665 e = doWhile (e, e1, e2);
666
667 break;
668
616915dd 669 case XPR_IF:
670 DPRINTF(( "IF:") );
671 DPRINTF ((exprNode_unparse(e) ) );
672 // ret = message ("if (%s) %s",
673 e1 = exprData_getPairA (data);
674 e2 = exprData_getPairB (data);
675
676 exprNode_exprTraverse (e1,
677 FALSE, FALSE, exprNode_loc(e1));
678
679 exprNode_generateConstraints (e2);
616915dd 680 e = doIf (e, e1, e2);
681
682
683 // e->constraints = constraintList_exprNodemerge (exprData_getPairA (data),exprData_getPairB(data));
684 break;
9280addf 685
686
616915dd 687 case XPR_IFELSE:
688 DPRINTF(("Starting IFELSE"));
689 // ret = message ("if (%s) %s else %s",
690 p = exprData_getTriplePred (data);
691 trueBranch = exprData_getTripleTrue (data);
692 falseBranch = exprData_getTripleFalse (data);
693
694 exprNode_exprTraverse (p,
695 FALSE, FALSE, exprNode_loc(p));
696 exprNode_generateConstraints (trueBranch);
697 exprNode_generateConstraints (falseBranch);
698
bb25bea6 699 temp = p->ensuresConstraints;
9280addf 700 p->ensuresConstraints = exprNode_traversEnsuresConstraints (p);
bb25bea6 701 constraintList_free(temp);
702
703 temp = p->requiresConstraints;
470b7798 704 p->requiresConstraints = exprNode_traversRequiresConstraints (p);
bb25bea6 705 constraintList_free(temp);
706
707 temp = p->trueEnsuresConstraints;
9280addf 708 p->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(p);
bb25bea6 709 constraintList_free(temp);
710
711 temp = p->falseEnsuresConstraints;
470b7798 712 p->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(p);
bb25bea6 713 constraintList_free(temp);
616915dd 714
470b7798 715 e = doIfElse (e, p, trueBranch, falseBranch);
616915dd 716 DPRINTF( ("Done IFELSE") );
717 break;
9280addf 718
616915dd 719 case XPR_DOWHILE:
470b7798 720
721 e2 = (exprData_getPairB (data));
722 e1 = (exprData_getPairA (data));
723
724 DPRINTF((message ("do { %s } while (%s)", exprNode_unparse(e2), exprNode_unparse(e1) ) ));
725 exprNode_generateConstraints (e2);
726 exprNode_generateConstraints (e1);
727 e = exprNode_copyConstraints (e, e2);
728 DPRINTF ((message ("e = %s ", constraintList_print(e->requiresConstraints) ) ));
729
616915dd 730 break;
731
732 case XPR_BLOCK:
733 // ret = message ("{ %s }",
734 exprNode_generateConstraints (exprData_getSingle (data));
bb25bea6 735
736 constraintList_free(e->requiresConstraints);
616915dd 737 e->requiresConstraints = constraintList_copy ( (exprData_getSingle (data))->requiresConstraints );
bb25bea6 738
739 constraintList_free(e->ensuresConstraints);
616915dd 740 e->ensuresConstraints = constraintList_copy ( (exprData_getSingle (data))->ensuresConstraints );
741 // e->constraints = (exprData_getSingle (data))->constraints;
742 break;
743
470b7798 744 case XPR_SWITCH:
745 e = doSwitch (e);
746 break;
616915dd 747 case XPR_STMT:
748 case XPR_STMTLIST:
84c9ffbf 749 exprNode_stmtList (e);
750 return ;
616915dd 751 /*@notreached@*/
752 break;
753 default:
754 ret=FALSE;
755 }
84c9ffbf 756 return; // ret;
616915dd 757}
758
bb25bea6 759static bool lltok_isBoolean_Op (lltok tok)
616915dd 760{
761 /*this should really be a switch statement but
762 I don't want to violate the abstraction
763 maybe this should go in lltok.c */
764
765 if (lltok_isEq_Op (tok) )
766 {
767 return TRUE;
768 }
769 if (lltok_isAnd_Op (tok) )
770
771 {
772
773 return TRUE;
774 }
775 if (lltok_isOr_Op (tok) )
776 {
777 return TRUE;
778 }
779
780 if (lltok_isGt_Op (tok) )
781 {
782 return TRUE;
783 }
784 if (lltok_isLt_Op (tok) )
785 {
786 return TRUE;
787 }
788
789 if (lltok_isLe_Op (tok) )
790 {
791 return TRUE;
792 }
793
794 if (lltok_isGe_Op (tok) )
795 {
796 return TRUE;
797 }
798
799 return FALSE;
800
801}
802
803
bb25bea6 804static void exprNode_booleanTraverse (exprNode e, /*@unused@*/ bool definatelv, /*@unused@*/ bool definaterv, fileloc sequencePoint)
616915dd 805{
806 constraint cons;
807exprNode t1, t2;
808exprData data;
809lltok tok;
bb25bea6 810constraintList tempList, temp;
616915dd 811data = e->edata;
812
813tok = exprData_getOpTok (data);
814
815
816t1 = exprData_getOpA (data);
817t2 = exprData_getOpB (data);
818
819
920a3797 820 tempList = constraintList_undefined;
821
616915dd 822/* arithmetic tests */
823
824if (lltok_isEq_Op (tok) )
825{
826 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
827 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
828}
829
830
831 if (lltok_isLt_Op (tok) )
832 {
833 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
834 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
835 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
836 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
837 }
838
839
840if (lltok_isGe_Op (tok) )
841{
842
843 cons = constraint_makeEnsureGreaterThanEqual (t1, t2, sequencePoint);
844 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
845
846 cons = constraint_makeEnsureLessThan (t1, t2, sequencePoint);
847 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
848
849}
850
851
852 if (lltok_isGt_Op (tok) )
853{
854 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
855 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
856 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
857 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
858}
859
860if (lltok_isLe_Op (tok) )
861{
862 cons = constraint_makeEnsureLessThanEqual (t1, t2, sequencePoint);
863 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
864
865 cons = constraint_makeEnsureGreaterThan (t1, t2, sequencePoint);
866 e->falseEnsuresConstraints = constraintList_add(e->falseEnsuresConstraints, cons);
867}
868
869
870
871/*Logical operations */
872
920a3797 873
616915dd 874 if (lltok_isAnd_Op (tok) )
875
876 {
877 //true ensures
878 tempList = constraintList_copy (t1->trueEnsuresConstraints);
879 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
4ab867d6 880 e->trueEnsuresConstraints = constraintList_addListFree(e->trueEnsuresConstraints, tempList);
616915dd 881
882 //false ensures: fens t1 or tens t1 and fens t2
883 tempList = constraintList_copy (t1->trueEnsuresConstraints);
884 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
bb25bea6 885 temp = tempList;
616915dd 886 tempList = constraintList_logicalOr (tempList, t1->falseEnsuresConstraints);
bb25bea6 887 constraintList_free(temp);
888
616915dd 889 e->falseEnsuresConstraints =constraintList_addList(e->falseEnsuresConstraints, tempList);
890
891 }
84c9ffbf 892 else if (lltok_isOr_Op (tok) )
893 {
616915dd 894 //false ensures
895 tempList = constraintList_copy (t1->falseEnsuresConstraints);
896 tempList = constraintList_addList (tempList, t2->falseEnsuresConstraints);
4ab867d6 897 e->falseEnsuresConstraints = constraintList_addListFree(e->falseEnsuresConstraints, tempList);
616915dd 898
899 //true ensures: tens t1 or fens t1 and tens t2
900 tempList = constraintList_copy (t1->falseEnsuresConstraints);
901 tempList = constraintList_addList (tempList, t2->trueEnsuresConstraints);
bb25bea6 902
903 temp = tempList;
616915dd 904 tempList = constraintList_logicalOr (tempList, t1->trueEnsuresConstraints);
bb25bea6 905 constraintList_free(temp);
906
907
4ab867d6 908 e->trueEnsuresConstraints =constraintList_addListFree(e->trueEnsuresConstraints, tempList);
920a3797 909 tempList = constraintList_undefined;
910
616915dd 911
912 }
84c9ffbf 913 else
914 {
915 DPRINTF((message("%s is not a boolean operation", lltok_unparse(tok) ) ));
916 }
616915dd 917
918}
919
bb25bea6 920void exprNode_exprTraverse (exprNode e, bool definatelv, bool definaterv, /*@observer@*/ fileloc sequencePoint)
616915dd 921{
9280addf 922 exprNode t1, t2, fcn;
616915dd 923 lltok tok;
924 bool handledExprNode;
925 exprData data;
926 constraint cons;
927
bb25bea6 928 constraintList temp;
929
470b7798 930 if (exprNode_isError(e) )
931 {
84c9ffbf 932 return; // FALSE;
470b7798 933 }
934
935 DPRINTF((message ("exprNode_exprTraverset Analysising %s %s at", exprNode_unparse( e),
616915dd 936 fileloc_unparse(exprNode_getfileloc(e) ) ) ) );
470b7798 937
bb25bea6 938 /*e->requiresConstraints = constraintList_makeNew();
c3e695ff 939 e->ensuresConstraints = constraintList_makeNew();
940 e->trueEnsuresConstraints = constraintList_makeNew();;
941 e->falseEnsuresConstraints = constraintList_makeNew();;
bb25bea6 942 */
470b7798 943 if (exprNode_isUnhandled (e) )
616915dd 944 {
84c9ffbf 945 return; // FALSE;
616915dd 946 }
947 // e = makeDataTypeConstraints (e);
948
949 handledExprNode = TRUE;
950
951 data = e->edata;
952
953 switch (e->kind)
954 {
616915dd 955 case XPR_WHILEPRED:
956 t1 = exprData_getSingle (data);
957 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint);
958 e = exprNode_copyConstraints (e, t1);
959 break;
960
961 case XPR_FETCH:
962
963 if (definatelv )
964 {
965 t1 = (exprData_getPairA (data) );
966 t2 = (exprData_getPairB (data) );
967 cons = constraint_makeWriteSafeExprNode (t1, t2);
968 }
969 else
970 {
971 t1 = (exprData_getPairA (data) );
972 t2 = (exprData_getPairB (data) );
973 cons = constraint_makeReadSafeExprNode (t1, t2 );
974 }
975
976 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
977 cons = constraint_makeEnsureMaxReadAtLeast (t1, t2, sequencePoint);
978 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
979
9280addf 980 cons = constraint_makeEnsureLteMaxRead (t2, t1);
616915dd 981 e->trueEnsuresConstraints = constraintList_add(e->trueEnsuresConstraints, cons);
982
983 // cons = constraint_makeEnsureMinReadAtMost (t1, t2, sequencePoint);
984 // e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
d46ce6a4 985
616915dd 986 exprNode_exprTraverse (exprData_getPairA (data), FALSE, TRUE, sequencePoint);
987 exprNode_exprTraverse (exprData_getPairB (data), FALSE, TRUE, sequencePoint);
988
989 /*@i325 Should check which is array/index. */
990 break;
991
992 case XPR_PARENS:
993 exprNode_exprTraverse (exprData_getUopNode (e->edata), definatelv, definaterv, sequencePoint);
994 // e->constraints = constraintList_exprNodemerge (exprData_getUopNode (e->edata), exprNode_undefined);
995 break;
996 case XPR_INIT:
920a3797 997 {
998 /*
999 idDecl t;
1000
1001 uentry ue;
1002 exprNode lhs;
1003
1004 t = exprData_getInitId (data);
1005 ue = usymtab_lookup (idDecl_observeId (t));
1006 lhs = exprNode_createId (ue);
1007 */
1008 t2 = exprData_getInitNode (data);
1009
1010 /* DPRINTF(( (message("initialization: %s = %s",
1011 exprNode_unparse(lhs),
1012 exprNode_unparse(t2)
1013 )
1014 ) )); */
1015
1016 //exprNode_exprTraverse (t1, TRUE, FALSE, sequencePoint );
1017
1018 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1019
1020 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
616915dd 1021 if ( (!exprNode_isError (e)) && (!exprNode_isError(t2)) )
920a3797 1022 {
1023 cons = constraint_makeEnsureEqual (e, t2, sequencePoint);
1024 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1025 }
1026 }
616915dd 1027
1028 break;
1029 case XPR_ASSIGN:
1030 t1 = exprData_getOpA (data);
1031 t2 = exprData_getOpB (data);
1032 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
84c9ffbf 1033 //lltok_unparse (exprData_getOpTok (data));
920a3797 1034
616915dd 1035 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1036
1037 /* this test is nessecary because some expressions generate a null expression node. function pointer do that -- drl */
1038 if ( (!exprNode_isError (t1)) && (!exprNode_isError(t2)) )
1039 {
1040 cons = constraint_makeEnsureEqual (t1, t2, sequencePoint);
1041 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1042 }
1043 break;
1044 case XPR_OP:
1045 t1 = exprData_getOpA (data);
1046 t2 = exprData_getOpB (data);
616915dd 1047 tok = exprData_getOpTok (data);
2934b455 1048
920a3797 1049
2934b455 1050 if (tok.tok == ADD_ASSIGN)
1051 {
920a3797 1052 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
1053 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1054
2934b455 1055 cons = constraint_makeAddAssign (t1, t2, sequencePoint );
1056 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1057 }
920a3797 1058 else if (tok.tok == SUB_ASSIGN)
2934b455 1059 {
920a3797 1060 exprNode_exprTraverse (t1, TRUE, definaterv, sequencePoint );
1061 exprNode_exprTraverse (t2, definatelv, TRUE, sequencePoint );
1062
2934b455 1063 cons = constraint_makeSubtractAssign (t1, t2, sequencePoint );
1064 e->ensuresConstraints = constraintList_add(e->ensuresConstraints, cons);
1065 }
920a3797 1066 else
1067 {
1068 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
1069 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1070 }
2934b455 1071
616915dd 1072 if (lltok_isBoolean_Op (tok) )
1073 exprNode_booleanTraverse (e, definatelv, definaterv, sequencePoint);
1074
1075 // e->constraints = constraintList_exprNodemerge (exprData_getOpA (data), exprData_getOpB (data));
1076 break;
1077 case XPR_SIZEOFT:
84c9ffbf 1078 #warning make sure the case can be ignored..
616915dd 1079
1080 break;
1081
1082 case XPR_SIZEOF:
1083 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
1084 // e->constraints = constraintList_exprNodemerge (exprData_getSingle (e->edata), exprNode_undefined);
1085 break;
1086
1087 case XPR_CALL:
9280addf 1088 fcn = exprData_getFcn(data);
1089
1090 exprNode_exprTraverse (fcn, definatelv, definaterv, sequencePoint );
9280addf 1091 DPRINTF ( (message ("Got call that %s ( %s) ", exprNode_unparse(fcn), exprNodeList_unparse (exprData_getArgs (data) ) ) ) );
616915dd 1092
4ab867d6 1093 fcn->requiresConstraints = constraintList_addListFree (fcn->requiresConstraints,
9280addf 1094 checkCall (fcn, exprData_getArgs (data) ) );
616915dd 1095
4ab867d6 1096 fcn->ensuresConstraints = constraintList_addListFree (fcn->ensuresConstraints,
9280addf 1097 getPostConditions(fcn, exprData_getArgs (data),e ) );
1098
1099 t1 = exprNode_createNew (exprNode_getType (e) );
1100
1101 checkArgumentList (t1, exprData_getArgs(data), sequencePoint);
616915dd 1102
9280addf 1103
1104 mergeResolve (e, t1, fcn);
920a3797 1105
1106 exprNode_free(t1);
9280addf 1107
616915dd 1108 // e->constraints = constraintList_add (e->constraints, constraint_create (e,exprNode_undefined, GT, CALLSAFE ) );
920a3797 1109
616915dd 1110 break;
1111
1112 case XPR_RETURN:
1113 exprNode_exprTraverse (exprData_getSingle (data), definatelv, definaterv, sequencePoint );
1114 break;
1115
1116 case XPR_NULLRETURN:
84c9ffbf 1117
616915dd 1118 break;
1119
1120
1121 case XPR_FACCESS:
1122 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
616915dd 1123 break;
1124
1125 case XPR_ARROW:
1126 exprNode_exprTraverse (exprData_getFieldNode (data), definatelv, definaterv, sequencePoint );
616915dd 1127 break;
1128
1129 case XPR_STRINGLITERAL:
84c9ffbf 1130
616915dd 1131 break;
1132
1133 case XPR_NUMLIT:
84c9ffbf 1134
616915dd 1135 break;
1136
1137 case XPR_PREOP:
1138 t1 = exprData_getUopNode(data);
1139 tok = (exprData_getUopTok (data));
1140 //lltok_unparse (exprData_getUopTok (data));
1141 exprNode_exprTraverse (t1, definatelv, definaterv, sequencePoint );
1142 /*handle * pointer access */
1143 if (lltok_isInc_Op (tok) )
1144 {
1145 DPRINTF(("doing ++(var)"));
1146 t1 = exprData_getUopNode (data);
1147 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
1148 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1149 }
1150 else if (lltok_isDec_Op (tok) )
1151 {
1152 DPRINTF(("doing --(var)"));
1153 t1 = exprData_getUopNode (data);
1154 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
1155 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1156 }
84c9ffbf 1157 else if (lltok_isMult( tok ) )
616915dd 1158 {
1159 if (definatelv)
1160 {
1161 cons = constraint_makeWriteSafeInt (t1, 0);
1162 }
1163 else
1164 {
1165 cons = constraint_makeReadSafeInt (t1, 0);
1166 }
1167 e->requiresConstraints = constraintList_add(e->requiresConstraints, cons);
1168 }
84c9ffbf 1169 else if (lltok_isNot_Op (tok) )
1170 /* ! expr */
616915dd 1171 {
bb25bea6 1172 constraintList_free(e->trueEnsuresConstraints);
1173
616915dd 1174 e->trueEnsuresConstraints = constraintList_copy (t1->falseEnsuresConstraints);
bb25bea6 1175 constraintList_free(e->falseEnsuresConstraints);
616915dd 1176 e->falseEnsuresConstraints = constraintList_copy (t1->trueEnsuresConstraints);
1177 }
bb25bea6 1178
84c9ffbf 1179 else if (lltok_isAmpersand_Op (tok) )
1180 {
1181 break;
1182 }
bb25bea6 1183 else if (lltok_isMinus_Op (tok) )
1184 {
1185 break;
1186 }
4ab867d6 1187 else if ( lltok_isExcl_Op (tok) )
1188 {
1189 break;
1190 }
1191 else if (lltok_isTilde_Op (tok) )
1192 {
1193 break;
1194 }
84c9ffbf 1195 else
1196 {
1197 llcontbug((message("Unsupported preop in %s", exprNode_unparse(e) ) ));
1198 BADEXIT;
1199 }
616915dd 1200 break;
1201
1202 case XPR_POSTOP:
1203
1204 exprNode_exprTraverse (exprData_getUopNode (data), TRUE, definaterv, sequencePoint );
84c9ffbf 1205
616915dd 1206 if (lltok_isInc_Op (exprData_getUopTok (data) ) )
1207 {
1208 DPRINTF(("doing ++"));
1209 t1 = exprData_getUopNode (data);
1210 cons = constraint_makeMaxSetSideEffectPostIncrement (t1, sequencePoint );
1211 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1212 }
1213 if (lltok_isDec_Op (exprData_getUopTok (data) ) )
1214 {
1215 DPRINTF(("doing --"));
1216 t1 = exprData_getUopNode (data);
1217 cons = constraint_makeMaxSetSideEffectPostDecrement (t1, sequencePoint );
1218 e->ensuresConstraints = constraintList_add (e->ensuresConstraints, cons);
1219 }
1220 break;
470b7798 1221 case XPR_CAST:
920a3797 1222 {
1223 t2 = exprData_getCastNode (data);
1224 DPRINTF (( message ("Examining cast (%q)%s",
1225 qtype_unparse (exprData_getCastType (data)),
1226 exprNode_unparse (t2) )
1227 ));
1228 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1229 }
470b7798 1230 break;
920a3797 1231
470b7798 1232 case XPR_COND:
1233 {
1234 exprNode pred, true, false;
1235 llassert(FALSE);
1236 pred = exprData_getTriplePred (data);
1237 true = exprData_getTripleTrue (data);
1238 false = exprData_getTripleFalse (data);
1239
1240 exprNode_exprTraverse (pred, FALSE, TRUE, sequencePoint );
bb25bea6 1241
1242 temp = pred->ensuresConstraints;
470b7798 1243 pred->ensuresConstraints = exprNode_traversEnsuresConstraints(pred);
bb25bea6 1244 constraintList_free(temp);
1245
1246 temp = pred->requiresConstraints;
470b7798 1247 pred->requiresConstraints = exprNode_traversRequiresConstraints(pred);
bb25bea6 1248 constraintList_free(temp);
470b7798 1249
bb25bea6 1250 temp = pred->trueEnsuresConstraints;
470b7798 1251 pred->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(pred);
bb25bea6 1252 constraintList_free(temp);
1253
1254 temp = pred->falseEnsuresConstraints;
470b7798 1255 pred->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(pred);
bb25bea6 1256 constraintList_free(temp);
1257
470b7798 1258
1259 exprNode_exprTraverse (true, FALSE, TRUE, sequencePoint );
bb25bea6 1260
1261 temp = true->ensuresConstraints;
470b7798 1262 true->ensuresConstraints = exprNode_traversEnsuresConstraints(true);
bb25bea6 1263 constraintList_free(temp);
1264
1265
1266 temp = true->requiresConstraints;
470b7798 1267 true->requiresConstraints = exprNode_traversRequiresConstraints(true);
bb25bea6 1268 constraintList_free(temp);
1269
470b7798 1270
bb25bea6 1271 temp = true->trueEnsuresConstraints;
470b7798 1272 true->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(true);
bb25bea6 1273 constraintList_free(temp);
1274
1275 temp = true->falseEnsuresConstraints;
470b7798 1276 true->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(true);
bb25bea6 1277 constraintList_free(temp);
470b7798 1278
bb25bea6 1279 //dfdf
470b7798 1280 exprNode_exprTraverse (false, FALSE, TRUE, sequencePoint );
bb25bea6 1281
1282 temp = false->ensuresConstraints;
470b7798 1283 false->ensuresConstraints = exprNode_traversEnsuresConstraints(false);
bb25bea6 1284 constraintList_free(temp);
1285
1286
1287 temp = false->requiresConstraints;
470b7798 1288 false->requiresConstraints = exprNode_traversRequiresConstraints(false);
bb25bea6 1289 constraintList_free(temp);
1290
470b7798 1291
bb25bea6 1292 temp = false->trueEnsuresConstraints;
470b7798 1293 false->trueEnsuresConstraints = exprNode_traversTrueEnsuresConstraints(false);
bb25bea6 1294 constraintList_free(temp);
470b7798 1295
bb25bea6 1296 temp = false->falseEnsuresConstraints;
1297 false->falseEnsuresConstraints = exprNode_traversFalseEnsuresConstraints(false);
1298 constraintList_free(temp);
470b7798 1299
1300 /* if pred is true e equals true otherwise pred equals false */
1301
1302 cons = constraint_makeEnsureEqual (e, true, sequencePoint);
1303 true->ensuresConstraints = constraintList_add(true->ensuresConstraints, cons);
1304
1305 cons = constraint_makeEnsureEqual (e, true, sequencePoint);
1306 false->ensuresConstraints = constraintList_add(false->ensuresConstraints, cons);
1307
1308 e = doIfElse (e, pred, true, false);
1309
1310 }
1311 break;
1312 case XPR_COMMA:
1313 llassert(FALSE);
1314 t1 = exprData_getPairA (data);
1315 t2 = exprData_getPairB (data);
1316 /* we essiantially treat this like expr1; expr2
1317 of course sequencePoint isn't adjusted so this isn't completely accurate
1318 problems../ */
1319 exprNode_exprTraverse (t1, FALSE, FALSE, sequencePoint );
1320 exprNode_exprTraverse (t2, definatelv, definaterv, sequencePoint );
1321 mergeResolve (e, t1, t2);
1322 break;
920a3797 1323
616915dd 1324 default:
1325 handledExprNode = FALSE;
1326 }
1327
1328 e->requiresConstraints = constraintList_preserveOrig ( e->requiresConstraints);
1329 e->ensuresConstraints = constraintList_preserveOrig ( e->ensuresConstraints);
9280addf 1330 e->requiresConstraints = constraintList_addGeneratingExpr ( e->requiresConstraints, e);
1331
1332 e->ensuresConstraints = constraintList_addGeneratingExpr ( e->ensuresConstraints, e);
1333
d46ce6a4 1334 DPRINTF((message ("ensures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
1335
1336 DPRINTF((message ("Requires constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->ensuresConstraints) ) ));
616915dd 1337
bb25bea6 1338 DPRINTF((message ("trueEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->trueEnsuresConstraints) ) ));
1339
1340 DPRINTF((message ("falseEnsures constraints for %s are %s", exprNode_unparse(e), constraintList_printDetailed(e->falseEnsuresConstraints) ) ));
1341
84c9ffbf 1342 return; // handledExprNode;
616915dd 1343}
1344
1345
1346constraintList exprNode_traversTrueEnsuresConstraints (exprNode e)
1347{
470b7798 1348 exprNode t1;
616915dd 1349
1350 bool handledExprNode;
1351 // char * mes;
1352 exprData data;
1353 constraintList ret;
1354
1355 if (exprNode_handleError (e))
1356 {
c3e695ff 1357 ret = constraintList_makeNew();
616915dd 1358 return ret;
1359 }
1360 ret = constraintList_copy (e->trueEnsuresConstraints );
1361
1362 handledExprNode = TRUE;
1363
1364 data = e->edata;
1365
1366 switch (e->kind)
1367 {
9280addf 1368 case XPR_WHILEPRED:
1369 t1 = exprData_getSingle (data);
4ab867d6 1370 ret = constraintList_addListFree ( ret, exprNode_traversTrueEnsuresConstraints (t1) );
9280addf 1371 break;
616915dd 1372
1373 case XPR_FETCH:
1374
4ab867d6 1375 ret = constraintList_addListFree (ret,
616915dd 1376 exprNode_traversTrueEnsuresConstraints
1377 (exprData_getPairA (data) ) );
1378
4ab867d6 1379 ret = constraintList_addListFree (ret,
616915dd 1380 exprNode_traversTrueEnsuresConstraints
1381 (exprData_getPairB (data) ) );
1382 break;
1383 case XPR_PREOP:
1384
4ab867d6 1385 ret = constraintList_addListFree (ret,
616915dd 1386 exprNode_traversTrueEnsuresConstraints
1387 (exprData_getUopNode (data) ) );
1388 break;
1389
1390 case XPR_PARENS:
4ab867d6 1391 ret = constraintList_addListFree (ret, exprNode_traversTrueEnsuresConstraints
616915dd 1392 (exprData_getUopNode (data) ) );
1393 break;
1394 case XPR_ASSIGN:
4ab867d6 1395 ret = constraintList_addListFree (ret,
616915dd 1396 exprNode_traversTrueEnsuresConstraints
1397 (exprData_getOpA (data) ) );
1398
4ab867d6 1399 ret = constraintList_addListFree (ret,
616915dd 1400 exprNode_traversTrueEnsuresConstraints
1401 (exprData_getOpB (data) ) );
1402 break;
1403 case XPR_OP:
4ab867d6 1404 ret = constraintList_addListFree (ret,
616915dd 1405 exprNode_traversTrueEnsuresConstraints
1406 (exprData_getOpA (data) ) );
1407
4ab867d6 1408 ret = constraintList_addListFree (ret,
616915dd 1409 exprNode_traversTrueEnsuresConstraints
1410 (exprData_getOpB (data) ) );
1411 break;
1412 case XPR_SIZEOFT:
1413
1414 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1415
1416 break;
1417
1418 case XPR_SIZEOF:
1419
4ab867d6 1420 ret = constraintList_addListFree (ret,
1421 exprNode_traversTrueEnsuresConstraints
1422 (exprData_getSingle (data) ) );
616915dd 1423 break;
1424
1425 case XPR_CALL:
4ab867d6 1426 ret = constraintList_addListFree (ret,
616915dd 1427 exprNode_traversTrueEnsuresConstraints
1428 (exprData_getFcn (data) ) );
1429 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1430 break;
1431
1432 case XPR_RETURN:
4ab867d6 1433 ret = constraintList_addListFree (ret,
616915dd 1434 exprNode_traversTrueEnsuresConstraints
1435 (exprData_getSingle (data) ) );
1436 break;
1437
1438 case XPR_NULLRETURN:
1439 // cstring_makeLiteral ("return");;
1440 break;
1441
1442 case XPR_FACCESS:
4ab867d6 1443 ret = constraintList_addListFree (ret,
616915dd 1444 exprNode_traversTrueEnsuresConstraints
1445 (exprData_getFieldNode (data) ) );
1446 //exprData_getFieldName (data) ;
1447 break;
1448
1449 case XPR_ARROW:
4ab867d6 1450 ret = constraintList_addListFree (ret,
616915dd 1451 exprNode_traversTrueEnsuresConstraints
1452 (exprData_getFieldNode (data) ) );
1453 // exprData_getFieldName (data);
1454 break;
1455
1456 case XPR_STRINGLITERAL:
1457 // cstring_copy (exprData_getLiteral (data));
1458 break;
1459
1460 case XPR_NUMLIT:
1461 // cstring_copy (exprData_getLiteral (data));
1462 break;
1463 case XPR_POSTOP:
1464
4ab867d6 1465 ret = constraintList_addListFree (ret,
616915dd 1466 exprNode_traversTrueEnsuresConstraints
1467 (exprData_getUopNode (data) ) );
1468 break;
470b7798 1469
1470 case XPR_CAST:
1471
4ab867d6 1472 ret = constraintList_addListFree (ret,
470b7798 1473 exprNode_traversTrueEnsuresConstraints
1474 (exprData_getCastNode (data) ) );
470b7798 1475 break;
84c9ffbf 1476
616915dd 1477 default:
1478 break;
1479 }
1480
1481 return ret;
1482}
1483
9280addf 1484constraintList exprNode_traversFalseEnsuresConstraints (exprNode e)
1485{
470b7798 1486 exprNode t1;
9280addf 1487
1488 bool handledExprNode;
1489 // char * mes;
1490 exprData data;
1491 constraintList ret;
1492
1493 if (exprNode_handleError (e))
1494 {
c3e695ff 1495 ret = constraintList_makeNew();
9280addf 1496 return ret;
1497 }
1498 ret = constraintList_copy (e->falseEnsuresConstraints );
1499
1500 handledExprNode = TRUE;
1501
1502 data = e->edata;
1503
1504 switch (e->kind)
1505 {
1506 case XPR_WHILEPRED:
1507 t1 = exprData_getSingle (data);
4ab867d6 1508 ret = constraintList_addListFree ( ret,exprNode_traversFalseEnsuresConstraints (t1) );
9280addf 1509 break;
1510
1511 case XPR_FETCH:
1512
4ab867d6 1513 ret = constraintList_addListFree (ret,
9280addf 1514 exprNode_traversFalseEnsuresConstraints
1515 (exprData_getPairA (data) ) );
1516
4ab867d6 1517 ret = constraintList_addListFree (ret,
9280addf 1518 exprNode_traversFalseEnsuresConstraints
1519 (exprData_getPairB (data) ) );
1520 break;
1521 case XPR_PREOP:
1522
4ab867d6 1523 ret = constraintList_addListFree (ret,
9280addf 1524 exprNode_traversFalseEnsuresConstraints
1525 (exprData_getUopNode (data) ) );
1526 break;
1527
1528 case XPR_PARENS:
4ab867d6 1529 ret = constraintList_addListFree (ret, exprNode_traversFalseEnsuresConstraints
9280addf 1530 (exprData_getUopNode (data) ) );
1531 break;
1532 case XPR_ASSIGN:
4ab867d6 1533 ret = constraintList_addListFree (ret,
9280addf 1534 exprNode_traversFalseEnsuresConstraints
1535 (exprData_getOpA (data) ) );
1536
4ab867d6 1537 ret = constraintList_addListFree (ret,
9280addf 1538 exprNode_traversFalseEnsuresConstraints
1539 (exprData_getOpB (data) ) );
1540 break;
1541 case XPR_OP:
4ab867d6 1542 ret = constraintList_addListFree (ret,
9280addf 1543 exprNode_traversFalseEnsuresConstraints
1544 (exprData_getOpA (data) ) );
1545
4ab867d6 1546 ret = constraintList_addListFree (ret,
9280addf 1547 exprNode_traversFalseEnsuresConstraints
1548 (exprData_getOpB (data) ) );
1549 break;
1550 case XPR_SIZEOFT:
1551
1552 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1553
1554 break;
1555
1556 case XPR_SIZEOF:
1557
4ab867d6 1558 ret = constraintList_addListFree (ret,
9280addf 1559 exprNode_traversFalseEnsuresConstraints
1560 (exprData_getSingle (data) ) );
1561 break;
1562
1563 case XPR_CALL:
4ab867d6 1564 ret = constraintList_addListFree (ret,
9280addf 1565 exprNode_traversFalseEnsuresConstraints
1566 (exprData_getFcn (data) ) );
1567 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1568 break;
1569
1570 case XPR_RETURN:
4ab867d6 1571 ret = constraintList_addListFree (ret,
9280addf 1572 exprNode_traversFalseEnsuresConstraints
1573 (exprData_getSingle (data) ) );
1574 break;
1575
1576 case XPR_NULLRETURN:
1577 // cstring_makeLiteral ("return");;
1578 break;
1579
1580 case XPR_FACCESS:
4ab867d6 1581 ret = constraintList_addListFree (ret,
9280addf 1582 exprNode_traversFalseEnsuresConstraints
1583 (exprData_getFieldNode (data) ) );
1584 //exprData_getFieldName (data) ;
1585 break;
1586
1587 case XPR_ARROW:
4ab867d6 1588 ret = constraintList_addListFree (ret,
9280addf 1589 exprNode_traversFalseEnsuresConstraints
1590 (exprData_getFieldNode (data) ) );
1591 // exprData_getFieldName (data);
1592 break;
1593
1594 case XPR_STRINGLITERAL:
1595 // cstring_copy (exprData_getLiteral (data));
1596 break;
1597
1598 case XPR_NUMLIT:
1599 // cstring_copy (exprData_getLiteral (data));
1600 break;
1601 case XPR_POSTOP:
1602
4ab867d6 1603 ret = constraintList_addListFree (ret,
9280addf 1604 exprNode_traversFalseEnsuresConstraints
1605 (exprData_getUopNode (data) ) );
1606 break;
470b7798 1607
1608 case XPR_CAST:
1609
4ab867d6 1610 ret = constraintList_addListFree (ret,
470b7798 1611 exprNode_traversFalseEnsuresConstraints
1612 (exprData_getCastNode (data) ) );
1613 break;
1614
9280addf 1615 default:
1616 break;
1617 }
1618
1619 return ret;
1620}
1621
616915dd 1622
1623/* walk down the tree and get all requires Constraints in each subexpression*/
d46ce6a4 1624/*@only@*/ constraintList exprNode_traversRequiresConstraints (exprNode e)
616915dd 1625{
470b7798 1626 exprNode t1;
616915dd 1627
1628 bool handledExprNode;
1629 // char * mes;
1630 exprData data;
1631 constraintList ret;
1632
1633 if (exprNode_handleError (e))
1634 {
c3e695ff 1635 ret = constraintList_makeNew();
616915dd 1636 return ret;
1637 }
1638 ret = constraintList_copy (e->requiresConstraints );
1639
1640 handledExprNode = TRUE;
1641
1642 data = e->edata;
1643
1644 switch (e->kind)
1645 {
9280addf 1646 case XPR_WHILEPRED:
1647 t1 = exprData_getSingle (data);
4ab867d6 1648 ret = constraintList_addListFree ( ret, exprNode_traversRequiresConstraints (t1) );
9280addf 1649 break;
616915dd 1650
1651 case XPR_FETCH:
1652
4ab867d6 1653 ret = constraintList_addListFree (ret,
616915dd 1654 exprNode_traversRequiresConstraints
1655 (exprData_getPairA (data) ) );
1656
4ab867d6 1657 ret = constraintList_addListFree (ret,
616915dd 1658 exprNode_traversRequiresConstraints
1659 (exprData_getPairB (data) ) );
1660 break;
1661 case XPR_PREOP:
1662
4ab867d6 1663 ret = constraintList_addListFree (ret,
616915dd 1664 exprNode_traversRequiresConstraints
1665 (exprData_getUopNode (data) ) );
1666 break;
1667
1668 case XPR_PARENS:
4ab867d6 1669 ret = constraintList_addListFree (ret, exprNode_traversRequiresConstraints
616915dd 1670 (exprData_getUopNode (data) ) );
1671 break;
1672 case XPR_ASSIGN:
4ab867d6 1673 ret = constraintList_addListFree (ret,
616915dd 1674 exprNode_traversRequiresConstraints
1675 (exprData_getOpA (data) ) );
1676
4ab867d6 1677 ret = constraintList_addListFree (ret,
616915dd 1678 exprNode_traversRequiresConstraints
1679 (exprData_getOpB (data) ) );
1680 break;
1681 case XPR_OP:
4ab867d6 1682 ret = constraintList_addListFree (ret,
616915dd 1683 exprNode_traversRequiresConstraints
1684 (exprData_getOpA (data) ) );
1685
4ab867d6 1686 ret = constraintList_addListFree (ret,
616915dd 1687 exprNode_traversRequiresConstraints
1688 (exprData_getOpB (data) ) );
1689 break;
1690 case XPR_SIZEOFT:
1691
1692 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1693
1694 break;
1695
1696 case XPR_SIZEOF:
1697
4ab867d6 1698 ret = constraintList_addListFree (ret,
616915dd 1699 exprNode_traversRequiresConstraints
1700 (exprData_getSingle (data) ) );
1701 break;
1702
1703 case XPR_CALL:
4ab867d6 1704 ret = constraintList_addListFree (ret,
616915dd 1705 exprNode_traversRequiresConstraints
1706 (exprData_getFcn (data) ) );
1707 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1708 break;
1709
1710 case XPR_RETURN:
4ab867d6 1711 ret = constraintList_addListFree (ret,
616915dd 1712 exprNode_traversRequiresConstraints
1713 (exprData_getSingle (data) ) );
1714 break;
1715
1716 case XPR_NULLRETURN:
1717 // cstring_makeLiteral ("return");;
1718 break;
1719
1720 case XPR_FACCESS:
4ab867d6 1721 ret = constraintList_addListFree (ret,
616915dd 1722 exprNode_traversRequiresConstraints
1723 (exprData_getFieldNode (data) ) );
1724 //exprData_getFieldName (data) ;
1725 break;
1726
1727 case XPR_ARROW:
4ab867d6 1728 ret = constraintList_addListFree (ret,
616915dd 1729 exprNode_traversRequiresConstraints
1730 (exprData_getFieldNode (data) ) );
1731 // exprData_getFieldName (data);
1732 break;
1733
1734 case XPR_STRINGLITERAL:
1735 // cstring_copy (exprData_getLiteral (data));
1736 break;
1737
1738 case XPR_NUMLIT:
1739 // cstring_copy (exprData_getLiteral (data));
1740 break;
1741 case XPR_POSTOP:
1742
4ab867d6 1743 ret = constraintList_addListFree (ret,
616915dd 1744 exprNode_traversRequiresConstraints
1745 (exprData_getUopNode (data) ) );
1746 break;
470b7798 1747
1748 case XPR_CAST:
1749
4ab867d6 1750 ret = constraintList_addListFree (ret,
470b7798 1751 exprNode_traversRequiresConstraints
1752 (exprData_getCastNode (data) ) );
1753 break;
1754
616915dd 1755 default:
1756 break;
1757 }
1758
1759 return ret;
1760}
1761
1762
1763/* walk down the tree and get all Ensures Constraints in each subexpression*/
d46ce6a4 1764/*@only@*/ constraintList exprNode_traversEnsuresConstraints (exprNode e)
616915dd 1765{
470b7798 1766 exprNode t1;
616915dd 1767
1768 bool handledExprNode;
1769 // char * mes;
1770 exprData data;
1771 // constraintExpr tmp;
1772 // constraint cons;
1773 constraintList ret;
1774
1775
1776 if (exprNode_handleError (e))
1777 {
c3e695ff 1778 ret = constraintList_makeNew();
616915dd 1779 return ret;
1780 }
1781
1782 ret = constraintList_copy (e->ensuresConstraints );
1783 handledExprNode = TRUE;
1784
1785 data = e->edata;
1786
1787 DPRINTF( (message (
1788 "exprnode_traversEnsuresConstraints call for %s with constraintList of %s",
1789 exprNode_unparse (e),
1790 constraintList_print(e->ensuresConstraints)
1791 )
1792 ));
1793
1794
1795 switch (e->kind)
1796 {
9280addf 1797 case XPR_WHILEPRED:
1798 t1 = exprData_getSingle (data);
4ab867d6 1799 ret = constraintList_addListFree ( ret,exprNode_traversEnsuresConstraints (t1) );
9280addf 1800 break;
616915dd 1801
1802 case XPR_FETCH:
1803
4ab867d6 1804 ret = constraintList_addListFree (ret,
616915dd 1805 exprNode_traversEnsuresConstraints
1806 (exprData_getPairA (data) ) );
1807
4ab867d6 1808 ret = constraintList_addListFree (ret,
616915dd 1809 exprNode_traversEnsuresConstraints
1810 (exprData_getPairB (data) ) );
1811 break;
1812 case XPR_PREOP:
1813
4ab867d6 1814 ret = constraintList_addListFree (ret,
616915dd 1815 exprNode_traversEnsuresConstraints
1816 (exprData_getUopNode (data) ) );
1817 break;
1818
1819 case XPR_PARENS:
4ab867d6 1820 ret = constraintList_addListFree (ret, exprNode_traversEnsuresConstraints
616915dd 1821 (exprData_getUopNode (data) ) );
1822 break;
1823 case XPR_ASSIGN:
4ab867d6 1824 ret = constraintList_addListFree (ret,
616915dd 1825 exprNode_traversEnsuresConstraints
1826 (exprData_getOpA (data) ) );
1827
4ab867d6 1828 ret = constraintList_addListFree (ret,
616915dd 1829 exprNode_traversEnsuresConstraints
1830 (exprData_getOpB (data) ) );
1831 break;
1832 case XPR_OP:
4ab867d6 1833 ret = constraintList_addListFree (ret,
616915dd 1834 exprNode_traversEnsuresConstraints
1835 (exprData_getOpA (data) ) );
1836
4ab867d6 1837 ret = constraintList_addListFree (ret,
616915dd 1838 exprNode_traversEnsuresConstraints
1839 (exprData_getOpB (data) ) );
1840 break;
1841 case XPR_SIZEOFT:
1842
1843 // ctype_unparse (qtype_getType (exprData_getType (data) ) );
1844
1845 break;
1846
1847 case XPR_SIZEOF:
1848
4ab867d6 1849 ret = constraintList_addListFree (ret,
616915dd 1850 exprNode_traversEnsuresConstraints
1851 (exprData_getSingle (data) ) );
1852 break;
1853
1854 case XPR_CALL:
4ab867d6 1855 ret = constraintList_addListFree (ret,
616915dd 1856 exprNode_traversEnsuresConstraints
1857 (exprData_getFcn (data) ) );
1858 /*@i11*/ // exprNodeList_unparse (exprData_getArgs (data) );
1859 break;
1860
1861 case XPR_RETURN:
4ab867d6 1862 ret = constraintList_addListFree (ret,
616915dd 1863 exprNode_traversEnsuresConstraints
1864 (exprData_getSingle (data) ) );
1865 break;
1866
1867 case XPR_NULLRETURN:
1868 // cstring_makeLiteral ("return");;
1869 break;
1870
1871 case XPR_FACCESS:
4ab867d6 1872 ret = constraintList_addListFree (ret,
616915dd 1873 exprNode_traversEnsuresConstraints
1874 (exprData_getFieldNode (data) ) );
1875 //exprData_getFieldName (data) ;
1876 break;
1877
1878 case XPR_ARROW:
4ab867d6 1879 ret = constraintList_addListFree (ret,
616915dd 1880 exprNode_traversEnsuresConstraints
1881 (exprData_getFieldNode (data) ) );
1882 // exprData_getFieldName (data);
1883 break;
1884
1885 case XPR_STRINGLITERAL:
1886 // cstring_copy (exprData_getLiteral (data));
1887 break;
1888
1889 case XPR_NUMLIT:
1890 // cstring_copy (exprData_getLiteral (data));
1891 break;
1892 case XPR_POSTOP:
1893
4ab867d6 1894 ret = constraintList_addListFree (ret,
616915dd 1895 exprNode_traversEnsuresConstraints
1896 (exprData_getUopNode (data) ) );
1897 break;
470b7798 1898 case XPR_CAST:
1899
4ab867d6 1900 ret = constraintList_addListFree (ret,
470b7798 1901 exprNode_traversEnsuresConstraints
1902 (exprData_getCastNode (data) ) );
1903 break;
1904
616915dd 1905 default:
1906 break;
1907 }
1908DPRINTF( (message (
1909 "exprnode_traversEnsuresConstraints call for %s with constraintList of is returning %s",
1910 exprNode_unparse (e),
1911 // constraintList_print(e->ensuresConstraints),
1912 constraintList_print(ret)
1913 )
1914 ));
1915
1916
1917 return ret;
1918}
1919
This page took 0.380983 seconds and 5 git commands to generate.