return expression;
}
+static bool is_last_parameter(expression_t *const param)
+{
+ if (param->kind == EXPR_REFERENCE) {
+ entity_t *const entity = param->reference.entity;
+ if (entity->kind == ENTITY_PARAMETER &&
+ !entity->base.next &&
+ entity->base.parent_scope == ¤t_function->parameters) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
/**
* Parses a _builtin_va_start() expression.
*/
errorf(&expression->base.source_position, "'va_start' used outside of function");
} else if (!current_function->base.type->function.variadic) {
errorf(&expression->base.source_position, "'va_start' used in non-variadic function");
- } else if (param->kind == EXPR_REFERENCE) {
- entity_t *const entity = param->reference.entity;
- if (entity->base.parent_scope != ¤t_function->parameters ||
- entity->base.next != NULL ||
- entity->kind != ENTITY_PARAMETER) {
- errorf(¶m->base.source_position,
- "second argument of 'va_start' must be last parameter of the current function");
- }
- } else {
- expression = create_error_expression();
+ } else if (!is_last_parameter(param)) {
+ errorf(¶m->base.source_position, "second argument of 'va_start' must be last parameter of the current function");
}
return expression;