Add @safeinfer to allow var to be used locally.

This commit is contained in:
Christoffer Lerno
2025-08-21 12:39:08 +02:00
parent 6ab7198f2f
commit e2e2ca1d7f
8 changed files with 29 additions and 12 deletions

View File

@@ -3055,6 +3055,7 @@ static bool sema_analyse_attribute(SemaContext *context, ResolvedAttrData *attr_
[ATTRIBUTE_PURE] = ATTR_CALL,
[ATTRIBUTE_REFLECT] = ATTR_FUNC | ATTR_GLOBAL | ATTR_CONST | USER_DEFINED_TYPES,
[ATTRIBUTE_SAFEMACRO] = ATTR_MACRO,
[ATTRIBUTE_SAFEINFER] = ATTR_GLOBAL | ATTR_LOCAL,
[ATTRIBUTE_SECTION] = ATTR_FUNC | ATTR_CONST | ATTR_GLOBAL,
[ATTRIBUTE_STRUCTLIKE] = ATTR_DISTINCT,
[ATTRIBUTE_TAG] = ATTR_BITSTRUCT_MEMBER | ATTR_MEMBER | USER_DEFINED_TYPES | CALLABLE_TYPE,
@@ -3421,6 +3422,9 @@ static bool sema_analyse_attribute(SemaContext *context, ResolvedAttrData *attr_
decl->attr_nopadding = true;
decl->attr_compact = true;
break;
case ATTRIBUTE_SAFEINFER:
decl->var.safe_infer = true;
break;
case ATTRIBUTE_NOINIT:
decl->var.no_init = true;
break;
@@ -4651,9 +4655,9 @@ bool sema_analyse_var_decl(SemaContext *context, Decl *decl, bool local)
return decl_poison(decl);
}
ASSERT(!decl->var.no_init);
if (kind == VARDECL_LOCAL && !context_is_macro(context) && init_expr->expr_kind != EXPR_LAMBDA)
if (kind == VARDECL_LOCAL && !context_is_macro(context) && init_expr->expr_kind != EXPR_LAMBDA && !decl->var.safe_infer)
{
SEMA_ERROR(decl, "Defining a variable using 'var %s = ...' is only allowed inside a macro, or when defining a lambda.", decl->name);
SEMA_ERROR(decl, "Defining a variable using 'var %s = ...' is only allowed inside a macro, or when defining a lambda. You can override this by adding the attribute '@safeinfer' to the declaration.", decl->name);
return decl_poison(decl);
}
if (!sema_analyse_expr(context, init_expr)) return decl_poison(decl);