Skip to content

Commit f9e5ffd

Browse files
Mark all subroutine call arguments as used
We can't know if the arguments of a subroutine call have been written to in the call, so we assume they are
1 parent d3b10e0 commit f9e5ffd

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

include/ofc/sema/dummy_arg.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ ofc_sema_dummy_arg_t* ofc_sema_dummy_arg_wrap_expr(
7777
const ofc_sema_type_t* ofc_sema_dummy_arg_type(
7878
const ofc_sema_dummy_arg_t* dummy_arg);
7979

80+
bool ofc_sema_dummy_arg_mark_used(
81+
ofc_sema_dummy_arg_t* dummy_arg);
82+
8083
ofc_sema_dummy_arg_t* ofc_sema_dummy_arg_copy_replace(
8184
const ofc_sema_dummy_arg_t* dummy_arg,
8285
const ofc_sema_decl_t* replace,

src/sema/dummy_arg.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,37 @@ bool ofc_sema_dummy_arg_compare(
365365
return false;
366366
}
367367

368+
bool ofc_sema_dummy_arg_mark_used(
369+
ofc_sema_dummy_arg_t* dummy_arg)
370+
{
371+
if (!dummy_arg)
372+
return false;
373+
374+
switch (dummy_arg->type)
375+
{
376+
case OFC_SEMA_DUMMY_ARG_EXPR:
377+
if (dummy_arg->expr->type == OFC_SEMA_EXPR_LHS)
378+
{
379+
if (!ofc_sema_lhs_mark_used(
380+
dummy_arg->expr->lhs, true, true))
381+
return false;
382+
}
383+
break;
384+
case OFC_SEMA_DUMMY_ARG_EXTERNAL:
385+
if (dummy_arg->external->decl)
386+
{
387+
if (!ofc_sema_decl_mark_used(
388+
dummy_arg->external->decl, true, true))
389+
return false;
390+
}
391+
break;
392+
default:
393+
break;
394+
}
395+
396+
return true;
397+
}
398+
368399
ofc_sema_dummy_arg_list_t* ofc_sema_dummy_arg_list_copy_replace(
369400
const ofc_sema_dummy_arg_list_t* list,
370401
const ofc_sema_decl_t* replace,

src/sema/stmt/call.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ ofc_sema_stmt_t* ofc_sema_stmt_call(
9898
return NULL;
9999
}
100100

101+
/* We mark all dummy_arg as used, as we can't know if
102+
they have been read or written to in the call */
103+
if (!ofc_sema_dummy_arg_mark_used(dummy_arg))
104+
{
105+
ofc_sema_dummy_arg_list_delete(args);
106+
return NULL;
107+
}
108+
101109
if (!ofc_sema_dummy_arg_list_add(
102110
args, dummy_arg))
103111
{

0 commit comments

Comments
 (0)