aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2022-06-27 12:16:17 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2022-06-27 12:16:17 +0200
commitce1a6720f69e6233ec9abd4e9aae5945e05fda41 (patch)
treec26e1e0d39f0d0f525848a72a72d8d3c032e197c
parent0e1aae55e49cad7ea43848af5b58ff0f57e7af99 (diff)
parentd42df42ec5a5f0ac7e58bfbfa6ceadd706b5517f (diff)
downloadsparse-dev-ce1a6720f69e6233ec9abd4e9aae5945e05fda41.tar.gz
Merge branches 'unreplaced' and 'inline'
* fix "unreplaced" warnings caused by using typeof() on inline functions * cleanup related to inlining of variadic functions
-rw-r--r--inline.c23
-rw-r--r--validation/inline-early/variadic0.c13
2 files changed, 26 insertions, 10 deletions
diff --git a/inline.c b/inline.c
index 0097e4bf..a7ab73d3 100644
--- a/inline.c
+++ b/inline.c
@@ -516,9 +516,8 @@ int inline_function(struct expression *expr, struct symbol *sym)
{
struct symbol_list * fn_symbol_list;
struct symbol *fn = sym->ctype.base_type;
- struct expression_list *arg_list = expr->args;
- struct statement *stmt = alloc_statement(expr->pos, STMT_COMPOUND);
- struct symbol_list *name_list, *arg_decl;
+ struct statement *stmt;
+ struct symbol_list *arg_decl;
struct symbol *name;
struct expression *arg;
@@ -529,8 +528,7 @@ int inline_function(struct expression *expr, struct symbol *sym)
if (fn->expanding)
return 0;
- name_list = fn->arguments;
-
+ stmt = alloc_statement(expr->pos, STMT_COMPOUND);
expr->type = EXPR_STATEMENT;
expr->statement = stmt;
expr->ctype = fn->ctype.base_type;
@@ -538,18 +536,22 @@ int inline_function(struct expression *expr, struct symbol *sym)
fn_symbol_list = create_symbol_list(sym->inline_symbol_list);
arg_decl = NULL;
- PREPARE_PTR_LIST(name_list, name);
- FOR_EACH_PTR(arg_list, arg) {
+ PREPARE_PTR_LIST(fn->arguments, name);
+ FOR_EACH_PTR(expr->args, arg) {
struct symbol *a = alloc_symbol(arg->pos, SYM_NODE);
- a->ctype.base_type = arg->ctype;
if (name) {
*a = *name;
set_replace(name, a);
add_symbol(&fn_symbol_list, a);
+ a->initializer = arg;
+ add_symbol(&arg_decl, a);
+ } else {
+ // This may create a node of a node but it will
+ // be resolved later when the corresponding
+ // STMT_DECLARATION will be evaluated.
+ a->ctype.base_type = arg->ctype;
}
- a->initializer = arg;
- add_symbol(&arg_decl, a);
NEXT_PTR_LIST(name);
} END_FOR_EACH_PTR(arg);
@@ -565,6 +567,7 @@ int inline_function(struct expression *expr, struct symbol *sym)
stmt->inline_fn = sym;
unset_replace_list(fn_symbol_list);
+ free_ptr_list(&fn_symbol_list);
return 1;
}
diff --git a/validation/inline-early/variadic0.c b/validation/inline-early/variadic0.c
new file mode 100644
index 00000000..566e129f
--- /dev/null
+++ b/validation/inline-early/variadic0.c
@@ -0,0 +1,13 @@
+static inline void fun(const char *fmt, ...)
+{
+}
+
+void main(void)
+{
+ fun("abc", 0); // will be a SYM_BASETYPE
+ fun("ijk", (const int)1); // will be a SYM_NODE
+}
+
+/*
+ * check-name: variadic0
+ */